2017-08-26 40 views
2

我在使用Python 3與Python 2.7中的RSA加密時遇到了問題。他們返回不同的值。python 3中的RSA密鑰加密問題

3686eac493f8bb874c830b55652ee3d6dedbf3b079d7acd113a53e716f4e997a440a1e53815e80a6f81121eca1a6b5d89cf08a341b7d546c66e849334b7992936d544e734df63ac803d611013d59249b5b0a8441335908560668f2983cd185b57391dc1bda7caeb405a149eb015eef0198bdfd480d3a280fda400c18b8ae9d90

01:使用Python 2.7執行時

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和Python 3運行下面的下面的代碼,我得到不同的結果

結果上的Python 3運行相同的代碼時:

62275c7830635f5c7866314a375c7839665c7861625c7864335c7831305c7839645c7862305c786162395c7839315c783035355d726d5c7838315c783035595c7839355c7838342e4f5c7863365c7865615c7863615c783938425c7862645c7831655c7831305c7861372b5d62355c745c786232314b5c783865725c7861346623325c7838305c7865385c7830635c7861655c7831325c7862365c7839375c7831645c7861345c7865355c7864615c7838375d70795d5c7839615c7830635c786235515c7864325c7839625c7864635c7863625c7839354f5c7865347e20315c7839305c78383664535c7863625c7866305c7831325c7861335c7830314b2f5c7861335c7866325c7831386b5c7863355c7861615c7830375c7831 365c7863345c7838635c7830366f2e2a3f5c786130585c7864655c7863305c7830352d5c7838365c78303374365c7830355c5c5c786330785c78643935495c7831343d5c7863385c7861315c7831334927

有誰知道爲什麼輸出取決於Python中的使用的版本不同?

回答

0

區別在於,在Python 2中,「encrypter.encrypt」方法返回一個字符串,並在Python 3中返回字節。要從字節中獲得十六進制字符串,您可以調用.hex()方法。此外,也沒有必要寫自己的「BIN2HEX」功能的Python 2,你可以使用.encode(「十六進制」):

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

在這兩種口譯長度將爲256個進制字符或128字節。

此外,RSA加密包含一些隨機性,所以每次加密相同的文本時,您將得到不同的輸出,但具有相同的128字節長度。

+0

十六進制()在python 3.4中不可用,它顯示錯誤像'字節'對象沒有屬性'十六進制' –

+0

有很多選項可以將字節轉換爲十六進制。例如,'輸入編解碼器; codecs.encode(b'foo','hex')。decode()' –