46 lines
1.7 KiB
Python
46 lines
1.7 KiB
Python
import Crypto, base64
|
||
from Crypto.Cipher import PKCS1_v1_5
|
||
from Crypto.PublicKey import RSA
|
||
from Crypto.Cipher import DES
|
||
|
||
|
||
# rsa解密密文方法
|
||
def get_max_length(rsa_key, encrypt=True):
|
||
"""加密内容过长时 需要分段加密 换算每一段的长度.
|
||
:param rsa_key: 钥匙.
|
||
:param encrypt: 是否是加密.
|
||
"""
|
||
blocksize = Crypto.Util.number.size(rsa_key.n) / 8
|
||
reserve_size = 11 # 预留位为11
|
||
if not encrypt: # 解密时不需要考虑预留位
|
||
reserve_size = 0
|
||
maxlength = blocksize - reserve_size
|
||
return maxlength
|
||
# ------------------------解密密文------------------------
|
||
def decryption(text_encrypted_base64: str, private_key: bytes):
|
||
# 字符串指定编码(转为bytes)
|
||
text_encrypted_base64 = text_encrypted_base64.encode('utf-8')
|
||
# base64解码
|
||
text_encrypted = base64.b64decode(text_encrypted_base64)
|
||
# 构建私钥对象
|
||
private_key = RSA.importKey(private_key)
|
||
max_length = int(get_max_length(private_key, False))
|
||
cipher_private = PKCS1_v1_5.new(private_key)
|
||
length = len(text_encrypted)
|
||
if length < max_length:
|
||
return b''.join(cipher_private.decrypt(text_encrypted, b'xyz'))
|
||
# 需要分段
|
||
offset = 0
|
||
res = []
|
||
while length - offset > 0:
|
||
if length - offset > max_length:
|
||
res.append(cipher_private.decrypt(text_encrypted[offset:offset + max_length], b'xyz'))
|
||
else:
|
||
res.append(cipher_private.decrypt(text_encrypted[offset:], b'xyz'))
|
||
offset += max_length
|
||
text_decrypted = b''
|
||
for i in res:
|
||
text_decrypted += i
|
||
# print(text_decrypted.decode())
|
||
return text_decrypted.decode()
|