python 3中的RSA密钥加密问题

时间:2017-08-26 04:46:49

标签: python python-3.x encryption

我在Python 3和Python 2.7中使用RSA加密时遇到问题。它们会返回不同的值。

如果我在Python 2.7和Python 3上运行以下代码,我会得到非常不同的结果:

def bin2hex(s):
return "".join([hex(ord(c))[2:].zfill(2) for c in s])

KEY = """-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC81t5iu5C0JxYq5/XNPiD5ol3Z
w8rw3LtFIUm7y3m8o8wv5qVnzGh6XwQ8LWypdkbBDKWZZrAUd3lybZOP7/82Nb1/
noYj8ixVRdbnYtbsSAbu9PxjB7a/7LCGKsugLkou74PJDadQweM88kzQOx/kzAyV
bS9gCCVUguHcq2vRRQIDAQAB
-----END PUBLIC KEY-----"""

from Crypto.Cipher import PKCS1_v1_5
from Crypto.PublicKey import RSA
encrypter = PKCS1_v1_5.new(RSA.importKey(KEY))
print (bin2hex(str(encrypter.encrypt('1231231231234'.encode()))))

使用Python 2.7执行时的结果

  

3686eac493f8bb874c830b55652ee3d6dedbf3b079d7acd113a53e716f4e997a440a1e53815e80a6f81121eca1a6b5d89cf08a341b7d546c66e849334b7992936d544e734df63ac803d611013d59249b5b0a8441335908560668f2983cd185b57391dc1bda7caeb405a149eb015eef0198bdfd480d3a280fda400c18b8ae9d90

在Python 3上运行相同代码时的结果:

  

62275c7830635f5c7866314a375c7839665c7861625c7864335c7831305c7839645c7862305c786162395c7839315c783035355d726d5c7838315c783035595c7839355c7838342e4f5c7863365c7865615c7863615c783938425c7862645c7831655c7831305c7861372b5d62355c745c786232314b5c783865725c7861346623325c7838305c7865385c7830635c7861655c7831325c7862365c7839375c7831645c7861345c7865355c7864615c7838375d70795d5c7839615c7830635c786235515c7864325c7839625c7864635c7863625c7839354f5c7865347e20315c7839305c78383664535c7863625c7866305c7831325c7861335c7830314b2f5c7861335c7866325c7831386b5c7863355c7861615c7830375c7831365c7863345c7838635c7830366f2e2a3f5c786130585c7864655c7863305c7830352d5c7838365c78303374365c7830355c5c5c786330785c78643935495c7831343d5c7863385c7861315c7831334927

根据使用的Python版本,有谁知道输出的不同之处?

1 个答案:

答案 0 :(得分:0)

不同之处在于,在Python 2中,“encrypter.encrypt”方法返回一个字符串,在Python 3中它返回字节。要从字节中获取十六进制字符串,您只需调用.hex()方法即可。另外,没有必要为Python 2编写自己的“bin2hex”函数,可以使用.encode('hex'):

encrypted = encrypter.encrypt('1231231231234'.encode())
# encrypted = encrypted.encode('hex')  # python 2
encrypted = encrypted.hex()  # python 3
print(len(encrypted), encrypted)

在两个解释器中,长度为256个十六进制字符,或128个字节。

此外,RSA加密包含一些随机性,因此每次加密相同的文本时,您将获得不同的输出,但长度相同,为128字节。

相关问题