2016-06-09 129 views
0

我想使用RSA(公鑰) 加密JavaScript中的字符串我想用我的私鑰在Python(2.7)中解密該字符串。JSE加密PyCrypto RSA加密不可能

我使用的庫是JSEncrypt和PyCrypto 這裏的問題就是,PyCrypto有問題解密加密的字符串

這部分加密字符串:

var encrypted = new JSEncrypt(); 
encrypted.setPublicKey(key); // key == '-----BEGIN PUBLIC'..... 
encrypted = encrypted.encrypt('test'); 

產生的加密字符串看起來像這樣: HJuyZtuUbR4EvjZp0pirbEw0OX8KD7UDNyvSMx3plfzYPjV7r8RBOkouCkvPBG2XOF6E5lPr0ukWClF0u5HB8M6qF8b9xTMnM/j5e41iaPa/oIZyL0JC4h + FZ7cv/P6ygmaSafQ1xc96JltTbuW3u/YYdwmv/01CnFyaIEWW3gk =

這部分應該解密:

private_rsa_key = open('rsa_1024_priv.pem', 'r').read() 
rsa_key = RSA.importKey(private_rsa_key) 
decrypted = rsa_key.decrypt(b64decode(encrypted_string)) 

結果現在應該是「測試」,但實際上它是: enter image description here

正確的字符串總是被放在最後,但我需要擺脫它之前的部分。

出於測試目的,我試圖加密在Python中的字符串,使用此代碼:

public_rsa_key = open('rsa_1024_pub.pem', 'r').read() 
rsa_key = RSA.importKey(public_rsa_key) 
encrypted = rsa_key.encrypt('test', 'x') 

解密時完全變成了「測試」,但看起來完全不同的加密:

('\x0bY\x1ckk\x7f\xd6\xda$\x05g\xa0\x0bxI\x0cO9\x8b?>M#X\xd2_[\xb7\xf1\xd0f\xb4\x92C\x01z\xa4\x02q\xb9\xb1\x80\x82\xe8\xe4\\E\x85\xa7r\xff\x1aIL,\xd8\xce\xaf\xef\xb4)\x84\x92]\xabA\xc9+\xd6\xef}\x08\xce\xe8\x97\xf8}\x84(\xb3\x9c\xfe7g\xe0\x869\x8b\xe8\xf8\xdf\x85}\xb0\x87\x1a2\xab\xda\xca\xfd\x81\xc0\x98\x12y\x92\x13\xd6\xa5a\xf3\x9aU\xb5\xa4d\xb8\xfc\xa3\xd1\xe2<\x07\xda\xc3\x9e\xc2',) 

我我想知道爲什麼這個加密文本現在是一個元組,裏面有十六進制。在我看來,來自JS的加密字符串看起來是正確的。我怎樣才能讓PyCrypto正確解密字符串?

在此先感謝

回答

2

您發佈的Python代碼只做低級別解密,由jsencrypt也contains pkcs1 padding返回的加密數據。在Python代碼

而不是使用原始RSA密鑰來加密的/解密,則需要使用適當的cipher,在這種情況下PKCS1_v1_5

... 
from Crypto.Cipher import PKCS1_v1_5 
private_rsa_key = open('rsa_1024_priv.pem', 'r').read() 
rsa_key = RSA.importKey(private_rsa_key) 
cipher = PKCS1_v1_5.new(rsa_key) 
decrypted = cipher.decrypt(encrypted, "ERROR") 

同樣用公鑰加密時適用。

+0

感謝您的時間。我必須將最後一行更改爲:decrypted = cipher.decrypt(b64decode(encrypted),「ERROR」),現在它可以工作。 – DarthVader

+0

也就是說,這個小節假定'加密'實際上是原始的加密數據,正如使用例如將要生成的那樣。 'cipher.encrypt(b'some message')'。我認爲這種情況在一般情況下可能會更普遍,所以我會留下這樣的答案,如果需要的話base64 en /解碼是微不足道的。 – mata

+0

別忘了b64decode(encrypted_string)!! – mouse