Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python 3中的RSA密钥加密问题_Python_Python 3.x_Encryption - Fatal编程技术网

python 3中的RSA密钥加密问题

python 3中的RSA密钥加密问题,python,python-3.x,encryption,Python,Python 3.x,Encryption,我在Python3和Python2.7中使用RSA加密时遇到了一个问题。它们返回不同的值 如果我在Python2.7和Python3上运行以下代码,我会得到非常不同的结果: def bin2hex(s): return "".join([hex(ord(c))[2:].zfill(2) for c in s]) KEY = """-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC81t5iu5C0JxYq5/XN

我在Python3和Python2.7中使用RSA加密时遇到了一个问题。它们返回不同的值

如果我在Python2.7和Python3上运行以下代码,我会得到非常不同的结果:

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执行时的结果:

3686每个493F8BB874C830B55652EE3DBF3B079D7ACD113A53E716F4E997A440A1E53815E80A6F81121ECA1A6B5D89CF08A341B7D546C6E849334B79926D544E734DF63AC80311013D59249B5B5A8441335908568F2983CD185B5391DC1BDA7CAEB405A149EB015EEF0198BDFD48080FDA400C18AED90

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

62275C7830635F5C7866314A375C7839665C78616256C7864335C7831305C7839645C7862305C786162395C7839315C783035355D726D5C7838315C783035595C7839355C7838342E4F5C7863365C78656156783938425C7862645C7831655C78305C7861357861372B5D622355C745C786232314B5C38657878786565656565783578787878363675C387575C387865786235767676767676757575757575C38757575787862626275757575757578787862626262757575757575757878787878626262626275757576767676767676615C7838375D70795D5C7839615C7830635C786235515C7864325C7839625C7864635C7863625C7839354F5C7865347E20315C7839305C783836645C7863625C7866305C7831325C7861335C7830314B2F5C786135C7866325C7831386B78635C7863355C78615C786375C786375C786375C78635C78635C78635C7878635C78635C787878635C7878635C7878635C78757575C78635C78635C787878635C7856565656353578787878787878565656353535787878787878787878565656565656565656561343d5c7863385c7861315c7831334927


有人知道为什么输出会因使用的Python版本而异吗?

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

在这两种解释器中,长度都是256个十六进制字符或128字节


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

hex()在python 3.4中不可用,它显示了类似于“bytes”的错误,对象没有属性“hex”,有很多选项可以将字节转换为十六进制。例如,
导入编解码器;codecs.encode(b'foo',hex').decode()
encrypted = encrypter.encrypt('1231231231234'.encode())
# encrypted = encrypted.encode('hex')  # python 2
encrypted = encrypted.hex()  # python 3
print(len(encrypted), encrypted)