2013-05-29 110 views
2

我正在研究一個原型,因此它需要在Chrome擴展和Python服務器之間使用RSA。Javascript和Python之間的RSA通信

到目前爲止,我打算使用https://sourceforge.net/projects/pidcrypt/https://www.dlitz.net/。然而,雖然我可以根據文檔解密和加密工作,但我無法解密對方的消息。

有人可以請建議互操作的圖書館,或讓我知道如果我在這個圖書館做錯了什麼?

從我的工作,pidder使用RSA PKCS#1加密樣式填充(類型2)。從谷歌搜索,我有點解決這是PyCrypto調用PKCS1_OAEP的類型。我不太確定,但我已經嘗試過這個標準,而另外兩個。

幫助將非常感激!

回答

4

Javascript庫(pidCrypt)使用PKCS#1 v1.5進行RSA加密,而不是OAEP。

這由PyCrypto支持(請參閱here)。這是加密的例子:

from Crypto.Cipher import PKCS1_v1_5 
from Crypto.PublicKey import RSA 
from Crypto.Hash import SHA 

message = 'To be encrypted' 
h = SHA.new(message) 

key = RSA.importKey(open('pubkey.der').read()) 
cipher = PKCS1_v1_5.new(key) 
ciphertext = cipher.encrypt(message+h.digest()) 

和解密:

from Crypto.Hash import SHA 
from Crypto import Random 

key = RSA.importKey(open('privkey.der').read()) 

dsize = SHA.digest_size 
sentinel = Random.new().read(15+dsize)  # Let's assume that average data length is 15 

cipher = PKCS1_v1_5.new(key) 
message = cipher.decrypt(ciphertext, sentinel) 

digest = SHA.new(message[:-dsize]).digest() 
if digest==message[-dsize:]:    # Note how we DO NOT look for the sentinel 
    print "Encryption was correct." 
else: 
    print "Encryption was not correct." 

注意,PKCS#1 v1.5的加密方案被知道是嚴重破碎。

+1

你可以使用僞造的JS端,它支持OAEP:https://github.com/digitalbazaar/forge#rsa – dlongley

+0

@dlongley你可以給一個實現的參考嗎? – Tejas

-2

是否可以使用HTTPS ajax連接?這樣,您就可以端到端加密,而無需擔心自己。

+0

正如我在問題中所說的,沒有。我正在通過另一臺服務器進行隧道傳輸,因此部分消息需要加密,以便第二臺服務器可以對其進行驗證。 – unixsnob

+0

你可以試試這兩個libsodium/NaCL的端口:https://github.com/tonyg/js-nacl&https://github.com/dstufft/pynacl。儘管我從未使用過它們,但它們可以互操作。 – Blutack