安装包pycryptodome
pip install pycryptodome -i https://mirrors.aliyun.com/pypi/simple/
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
from Crypto.PublicKey import RSA
import base64
‘‘‘
单次加密串的长度最大为(key_size/8 - 11)
加密的 plaintext 最大长度是 证书key位数/8 - 11, 例如1024 bit的证书,被加密的串最长 1024/8 - 11=117,
解决办法是 分块 加密,然后分块解密就行了,
因为 证书key固定的情况下,加密出来的串长度是固定的。
Java 中使用的是 PKCS#8 生成的私钥,而Python中常用的是PKCS#1,就导致无法解密,python也是支持PKCS#8的,下面是这两种方式的区别。
pkcs1:
-----BEGIN RSA PUBLIC KEY-----\n{}\n-----BEGIN RSA PUBLIC KEY-----
-----BEGIN RSA PRIVATE KEY-----\n{}\n-----BEGIN RSA PRIVATE KEY-----
pkcs8:
-----BEGIN PUBLIC KEY-----\n{}\n-----BEGIN PUBLIC KEY-----
-----BEGIN PRIVATE KEY-----\n{}\n-----BEGIN PRIVATE KEY-----
仔细观察,pkcs1的公钥和私钥开头和结尾都比pkcs8的多了RSA
{"Data":"ajEGp0tiLe3b90VKmPIe7Yf76I+cM7wyiN5rH72XQGRWMSYizmwMWkcPi4QqPXxQfgKZhR5Za7wmqZE5HT0sNWKIFxva5d0I1GURYb/sniPQQYnpumVcew6ZJZajz/oK1zJRrHB0R8EY2Qidd34TYuKB3GWiU8X39fPBW1eHq7VKgG3ArlXre1fWXJ0Tq9d0zNbgRgxiH4LdJoEWJYdwkrKEo/9rmDs7zzM8jPbVg9WszrnRSrwRFkLqmHa9xLC9kynUxM2ao9BxoeTDrLPQX2XyU25iwpHIVC4TvetPK30oIM7dOgGB2cWITHRcQxXnA75mfqVgeCu9CNzrPwk1hQg7HfOW/poMllnGUGK+tTLtclBM8oYmOVXYSN8yOHt3mCFByGt+JC14UlkEojstNGviliI59ZFLVF6D4WzURaVjIh5jj3PvezjCiijLMbrMH5ZYhjyyk31xKnxcn0Yt4b0W6Y2kSUSkyGqjyHc/IGVcjNPWP/vFX7Mfp0+6qUPD"}
{"FBankInfos":[{"FAccountName":"四川中电福溪电力开发有限公司","FBankCode":"123902292987","FOpenBankName":"中行宜宾分行营业部"}],"FCreditCode":"91510000669591631K","FGroup":"0299","FName":"四川中电福溪电力开发有限公司"}
‘‘‘
def rsa_long_encrypt(pub_key_str, msg):
msg = msg.encode(‘utf-8‘)
length = len(msg)
# default_length = 117
default_length = 100
#公钥加密
pubobj = Cipher_pkcs1_v1_5.new(RSA.importKey(pub_key_str))
#长度不用分段
if length < default_length:
return base64.b64encode(pubobj.encrypt(msg))
#需要分段
offset = 0
res = []
while length - offset > 0:
if length - offset > default_length:
res.append(pubobj.encrypt(msg[offset:offset+default_length]))
else:
res.append(pubobj.encrypt(msg[offset:]))
offset += default_length
byte_data = b‘‘.join(res)
return base64.b64encode(byte_data)
def rsa_long_decrypt(priv_key_str, msg):
msg = base64.b64decode(msg)
length = len(msg)
default_length = 128
#私钥解密
priobj = Cipher_pkcs1_v1_5.new(RSA.importKey(priv_key_str))
#长度不用分段
if length < default_length:
return b‘‘.join(priobj.decrypt(msg, b‘xyz‘))
#需要分段
offset = 0
res = []
while length - offset > 0:
if length - offset > default_length:
res.append(priobj.decrypt(msg[offset:offset+default_length], b‘xyz‘))
else:
res.append(priobj.decrypt(msg[offset:], b‘xyz‘))
offset += default_length
return b‘‘.join(res)
if __name__ == ‘__main__‘:
msg = ‘{"FBankInfos":[{"FAccountName":"中化岩土集团股份有限公司","FBankCode":"11001009000056070231","FOpenBankName":"中国建设银行北京大兴支行"}],"FCreditCode":"91110000710929148A","FGroup":"0299","FName":"中化岩土集团股份有限公司"}‘
print(msg)
rsa_dict = {
‘PUBLIC_KEY‘: ‘MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCXNJgUbHeMrJCZbfyVAl8+e94FhSqaSweKsEHjVgYBYwCgNrzeQStP8pMrWbahLTfvs552ajUC2vrJFXfS+HmcnJ3Yv6JgCobDoenpz09Bnov2x/B76DxON5EnruAKU/xqqUA/BPVbf7y3qGTuomRXg+KFH3tiezu4kg/Hz4OQeQIDAQAB‘,
‘PRIVATE_KEY‘: ‘MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJc0mBRsd4yskJlt/JUCXz573gWFKppLB4qwQeNWBgFjAKA2vN5BK0/ykytZtqEtN++znnZqNQLa+skVd9L4eZycndi/omAKhsOh6enPT0Gei/bH8HvoPE43kSeu4ApT/GqpQD8E9Vt/vLeoZO6iZFeD4oUfe2J7O7iSD8fPg5B5AgMBAAECgYApxqs6AVnqcQcmjP/bP6OHBPwrtEY4CQDVbatWnz7bhTn4CgeWtJS96vyEXq4Zy/+HZ64hc2igGFZv1lGb5XDbyqODi5kGaeylB8pXpwdUa1/WRMa60c+2LWWc+piVWoSOsPr0Q1NtnFunsX8/FoRyOrP+QcN8QcJR0SFe0ApgDQJBAMdqGUotVRL3YSAWgRTaFFby2wV/ur0uhycEJ0DZIQyZV0Yk0jmKiUdmRAs9LZGkuL929Zee4O0n1ANjARkkCvsCQQDCHHzsR9CMfaf52orowrCvINqon8iq+5FaKDgsddcRRG9yhdNSGhfTSdNTw82YXlbGB10siEjfH60HxAjJ1rgbAkA0CZ3b24SN1HxF8Vlx5Y7VOb6p6rECWTfvmIfdxkt3jDRYG5e4aEx2k1tCS46uqPuFCzf/fvhXKsOKtrU8qEktAkB7HNJmkc3FrVTCdUexBPpGuNG2LVF6kH/J7MRj/oFfZEZDHnm/EumVirdL414ci4kBpF4GBpIhYde+myjvyw2NAkAYHc8QDgfwKnMFKGMDq4wY+rNf1T5SPmKyM+60A5GmMTo1mu2/gFtNrLomFT2stjQQhtRVIjYtNCGrwlzVG1cC‘
}
public_key = f‘-----BEGIN PUBLIC KEY-----\n{rsa_dict["PUBLIC_KEY"]}\n-----END PUBLIC KEY-----\n‘
private_key = f‘-----BEGIN PRIVATE KEY-----\n{rsa_dict["PRIVATE_KEY"]}\n-----END PRIVATE KEY-----\n‘
# public_key = ‘‘‘-----BEGIN PUBLIC KEY-----
# MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCXNJgUbHeMrJCZbfyVAl8+e94FhSqaSweKsEHjVgYBYwCgNrzeQStP8pMrWbahLTfvs552ajUC2vrJFXfS+HmcnJ3Yv6JgCobDoenpz09Bnov2x/B76DxON5EnruAKU/xqqUA/BPVbf7y3qGTuomRXg+KFH3tiezu4kg/Hz4OQeQIDAQAB
# -----END PUBLIC KEY-----
# ‘‘‘
# private_key = ‘‘‘-----BEGIN PRIVATE KEY-----
# MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJc0mBRsd4yskJlt/JUCXz573gWFKppLB4qwQeNWBgFjAKA2vN5BK0/ykytZtqEtN++znnZqNQLa+skVd9L4eZycndi/omAKhsOh6enPT0Gei/bH8HvoPE43kSeu4ApT/GqpQD8E9Vt/vLeoZO6iZFeD4oUfe2J7O7iSD8fPg5B5AgMBAAECgYApxqs6AVnqcQcmjP/bP6OHBPwrtEY4CQDVbatWnz7bhTn4CgeWtJS96vyEXq4Zy/+HZ64hc2igGFZv1lGb5XDbyqODi5kGaeylB8pXpwdUa1/WRMa60c+2LWWc+piVWoSOsPr0Q1NtnFunsX8/FoRyOrP+QcN8QcJR0SFe0ApgDQJBAMdqGUotVRL3YSAWgRTaFFby2wV/ur0uhycEJ0DZIQyZV0Yk0jmKiUdmRAs9LZGkuL929Zee4O0n1ANjARkkCvsCQQDCHHzsR9CMfaf52orowrCvINqon8iq+5FaKDgsddcRRG9yhdNSGhfTSdNTw82YXlbGB10siEjfH60HxAjJ1rgbAkA0CZ3b24SN1HxF8Vlx5Y7VOb6p6rECWTfvmIfdxkt3jDRYG5e4aEx2k1tCS46uqPuFCzf/fvhXKsOKtrU8qEktAkB7HNJmkc3FrVTCdUexBPpGuNG2LVF6kH/J7MRj/oFfZEZDHnm/EumVirdL414ci4kBpF4GBpIhYde+myjvyw2NAkAYHc8QDgfwKnMFKGMDq4wY+rNf1T5SPmKyM+60A5GmMTo1mu2/gFtNrLomFT2stjQQhtRVIjYtNCGrwlzVG1cC
# -----END PRIVATE KEY-----
# ‘‘‘
enmsg = rsa_long_encrypt(public_key, msg).decode(‘utf-8‘)
print(enmsg)
demsg = rsa_long_decrypt(private_key, enmsg).decode("utf-8")
print(demsg)
import base64
from Crypto import Random
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
from Crypto.PublicKey import RSA
# 解密私钥
rsa_private_key = """-----BEGIN RSA PRIVATE KEY-----
MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAPeqKbHli73SfMPVIdW+5Du8o2dfX9DmMrCDlNmdjyxJgl2Wz5BQ02EO32LWPiILJvPhrWwrKBz+ppkJ5YcSe7pdR88lwU6mhYbLmilk2d+pkN7oeg4dXqaWkv2kMA6ugHpFBAaBNSu+n3j0pJYReqj74ccpaOZa3ozVlrFAdYSrAgMBAAECgYEAyg5ODhFUvP1pROwxuo0O752rQr8REQF+AXyYiCJ/mIYwkeJkXT1T9y+HGL/p2SR4FyjbsBBVnbI0gU8Nr/FodryepzIB412SSh8hGxtYsP+2VO7Mh5Emfi9LNdIFVAubezlnSvRCKJHZPdY3zFBe0JQTzIg7iJOqKm66WVEg/mECQQD8hN/cP+6in4O26UtjZPGZ/mxjgPGHdiDKtp/7Vr+i/NyuyryFjQc52o6TELb8W+XkjsnQ0H98v7Bo3q0XGC0dAkEA+xQoYADcaGEU+xa+RO3QPWLQah2Qp9fwxNNSKaXRuzarfJY67pcOMBJsexlTu/4anpI+nV5ZbVLKTY4rcbB2ZwJBAM4NCrIpROtUKGFHyqlnRDH5Rq6HGA8GGEnxbWfk6Gjx1o2WhvCfHGdb7P0aJYaU4ml3Dj0i9PRxYlygXzM6Gg0CQQDUSfLpWVECoDMRKeWuejT78jStxFmu0JIumU57EE0IsezE5nDlkqrYUnuOiZeW9/6h3J08ia2rFbkfYfmxorY5AkAdysveuvltqfenHV4jekxxucp6I1TQJafrIseBYDTeDM9lpJ1LVBmcyLMLj5Ib2XN4hLQn98giGRfpGJH5YNDY
-----END RSA PRIVATE KEY-----"""
def rsa_decrypt(cipher_text):
rsakey = RSA.importKey(rsa_private_key)
cipher = Cipher_pkcs1_v1_5.new(rsakey)
random_generator = Random.new().read
text = cipher.decrypt(base64.b64decode(cipher_text), random_generator)
return text.decode(‘utf8‘)
def long_decrypt(data):
msg = base64.b64decode(data)
length = len(msg)
default_length = 128
# 私钥解密
priobj = Cipher_pkcs1_v1_5.new(RSA.importKey(rsa_private_key))
# 长度不用分段
if length < default_length:
return b‘‘.join(priobj.decrypt(msg, b‘xyz‘))
# 需要分段
offset = 0
res = []
while length - offset > 0:
if length - offset > default_length:
res.append(priobj.decrypt(msg[offset:offset + default_length], b‘xyz‘))
else:
res.append(priobj.decrypt(msg[offset:], b‘xyz‘))
offset += default_length
return b‘‘.join(res).decode(‘utf8‘)
if __name__ == ‘__main__‘:
# 解密文本
data = "lMOQksXJR9mWIknQSO9v8dcuY0zMngayxHIp4P9CJLN2YU1BSbv5MKwhuJpxSZTHF4fKDtxkfvx1atajhkGEeKrytl0DXD5+yKc+zL72JGDkozXLZljrbbNe+n9vbAyL6nnySvTJzjINpmgPc3wqOyQCbAsVTI3sk0FNve0fh50="
res_de = long_decrypt(data)
print(‘res_de‘, res_de)
原文:https://www.cnblogs.com/gqv2009/p/14251180.html