Python3.7 基于基于 pycryptodome 的的AES加密解密、加密解密、RSA加密解密、加签验签加密解密、加签验签
主要介绍了Python3.7 基于 pycryptodome 的AES加密解密、RSA加密解密、加签验签,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
Python3.7 基于 pycryptodome 的AES加密解密、RSA加密解密、加签验签,具体代码如下所示:
#!/usr/bin/env python
# -*- coding: utf8 -*-
import os
import rsa
import json
import hashlib
import base64
from Crypto.Cipher import AES
from ..settings_manager import settings
class RSAEncrypter(object):
"""RSA加密解密
参考 https://stuvel.eu/python-rsa-doc/index.html
对应JavaScript版本参考 https://github.com/travist/jsencrypt
[description]
"""
@classmethod
def encrypt(cls, plaintext, keydata):
#明文编码格式
content = plaintext.encode('utf8')
if os.path.isfile(keydata):
with open(keydata) as publicfile:
keydata = publicfile.read()
pubkey = rsa.PublicKey.load_pkcs1_openssl_pem(keydata)
#公钥加密
crypto = rsa.encrypt(content, pubkey)
return base64.b64encode(crypto).decode('utf8')
@classmethod
def decrypt(cls, ciphertext, keydata):
if os.path.isfile(keydata):
with open(keydata) as privatefile:
keydata = privatefile.read()
try:
ciphertext = base64.b64decode(ciphertext)
privkey = rsa.PrivateKey.load_pkcs1(keydata, format='PEM')
con = rsa.decrypt(ciphertext, privkey)
return con.decode('utf8')
except Exception as e:
pass
return False
@classmethod
def signing(cls, message, privkey):
""" 签名
https://legrandin.github.io/pycryptodome/Doc/3.2/Crypto.Signature.pkcs1_15-module.html
"""
from Crypto.Signature import pkcs1_15
from Crypto.Hash import SHA256
from Crypto.PublicKey import RSA
if os.path.isfile(privkey):
with open(privkey) as privatefile:
privkey = privatefile.read()
try:
key = RSA.import_key(privkey)
h = SHA256.new(message.encode('utf8'))
sign = pkcs1_15.new(key).sign(h)
sign = base64.b64encode(sign).decode('utf8')
return sign
except Exception as e:
raise e
@classmethod
def verify(cls, message, sign, pubkey):
""" 验证签名
https://legrandin.github.io/pycryptodome/Doc/3.2/Crypto.Signature.pkcs1_15-module.html
"""
from Crypto.Signature import pkcs1_15
from Crypto.Hash import SHA256
from Crypto.PublicKey import RSA
res = False
sign = base64.b64decode(sign)
# print('sign', type(sign), sign)
try:
key = RSA.importKey(pubkey)
h = SHA256.new(message.encode('utf8'))
pkcs1_15.new(key).verify(h, sign)
res = True
except (ValueError, TypeError) as e:
raise e
pass
except Exception as e:
raise e
pass
return res
class AESEncrypter(object):
def __init__(self, key, iv=None):
self.key = key.encode('utf8')
self.iv = iv if iv else bytes(key[0:16], 'utf8')
def _pad(self, text):
text_length = len(text)
padding_len = AES.block_size - int(text_length % AES.block_size)
if padding_len == 0:
padding_len = AES.block_size
t2 = chr(padding_len) * padding_len
t2 = t2.encode('utf8')
# print('text ', type(text), text)
# print('t2 ', type(t2), t2)
t3 = text + t2
return t3
def _unpad(self, text):
pad = ord(text[-1])
return text[:-pad]
def encrypt(self, raw):
raw = raw.encode('utf8')
raw = self._pad(raw)
cipher = AES.new(self.key, AES.MODE_CBC, self.iv)
encrypted = cipher.encrypt(raw)
return base64.b64encode(encrypted).decode('utf8')
def decrypt(self, enc):
enc = enc.encode('utf8')
enc = base64.b64decode(enc)
cipher = AES.new(self.key, AES.MODE_CBC, self.iv)
decrypted = cipher.decrypt(enc)
return self._unpad(decrypted.decode('utf8'))
class AESSkyPay:
"""
Tested under Python 3.7 and pycryptodome
"""
BLOCK_SIZE = 16
def __init__(self, key):
#菲律宾支付通道 SkyPay Payment Specification.lending.v1.16.pdf
# SkyPay 对密码做了如下处理
评论0
最新资源