2012-04-11 48 views
2

我想用PyCrypto來加密/解密一些字符串,而且我遇到了中文字符的問題。PyCrypto:使用RSA非對稱密鑰編碼中文字符

當我嘗試加密 「妮浩」(你好)...

pemFile = open("/home/borrajax/keys/myKey.pem", "r") 
encryptor = RSA.importKey(pemFile, passphrase="f00") 
return encryptor.encrypt("你好", 0)[0] 

...我不斷收到錯誤:

Module Crypto.PublicKey.pubkey:64 in encrypt   
>> ciphertext=self._encrypt(plaintext, K) 
Module Crypto.PublicKey.RSA:92 in _encrypt   
>> return (self.key._encrypt(c),) 
ValueError: Plaintext too large 

我已經嘗試了許多組合,

encryptor.encrypt(u"你好"... 
encryptor.encrypt(u"你好".encode("utf-8")... 

無 運氣好的話。

我想我總是可以嘗試在編碼之前使用的base64,但我想離開這個作爲「最後手段」 ......我希望這樣做的更加「優雅」的方式。

有沒有人遇到同樣的問題?任何暗示將不勝感激。先謝謝你。

回答

2

首先,你應該只加密二進制數據,而不是Unicode文本。這意味着str類型(在Python 2.x中)或bytes(在Python 3.x和最新的Python 2.x中)。您必須在加密之前對文本進行編碼,並且您必須在解密後對其進行解碼。

其次,您要加密必須比RSA模數(例如,小於256個字節用於RSA2048)越小字節串。如果數據更長,請考慮使用中間AES會話密鑰。

第三,如果你使用PyCrypto 2.5,沒有很好的理由,使用RSA密鑰對象的.encrypt/.decrypt方法。使用PKCS#1方法之一更好更安全:OAEPv1.5。有了它們,明文必須更短。

1

我在從yakuake終端交互式解釋從PIP安裝在Ubuntu Linux 10.04有關python 2.6.5 PyCrypto V2.5測試。

我無法重現您所看到的錯誤,尤其是「明文太大」位。我看到的一些錯誤:

encryptor.encrypt(u"你好",0)[0] 

TypeError: argument 1 must be long, not unicode 

似乎它不喜歡unicode對象 - 只想要str。

都在我的設置這些工作,都產生相同的輸出,但是第一個解決方案是比較正確的:

encryptor.encrypt(u"你好".encode("utf-8"), 0)[0] 
encryptor.encrypt("你好", 0)[0] 

你是從交互式解釋這種嘗試,或從一個文件?如果文件,我s the file UTF-8 encoded?如果控制檯,它是否有適當的UTF-8支持?

1

我檢查PyCrypto的相關代碼,當純文本(後轉換爲長)是關鍵參數的大於一個該錯誤僅拋出。假設正確設置了腳本的編碼,可能是因爲您的RSA密鑰無效或太短。我試過這個代碼片段,它沒問題:

rsa = RSA.generate(1024) 

print(rsa.encrypt("你好", 0)) 
相關問題