2

PyCrypto を使用して一部の文字列を暗号化/復号化しようとしていますが、漢字に問題があります。

「ニハオ」(こんにちは)を暗号化しようとすると...

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 を使用しようとすることができると思いますが、それを「最後のリソース」として残したいと思います...これを行うためのより「エレガントな」方法を望んでいました。

誰かが同じ問題に遭遇しましたか? ヒントをいただければ幸いです。前もって感謝します。

4

3 に答える 3

2

まず、Unicode テキストではなく、バイナリ データのみを暗号化する必要があります。これはstr、(Python 2.x の場合) またはbytes(Python 3.x および最新の Python 2.x の場合) タイプを意味します。テキストを暗号化する前にエンコードする必要があり、復号化した後にデコードする必要があります。

第 2 に、暗号化するバイト文字列は RSA モジュラスよりも小さくする必要があります (たとえば、RSA2048 の場合は 256 バイト未満)。データがそれよりも長い場合は、中間 AES セッション キーの使用を検討してください。

.encrypt/.decrypt第 3 に、PyCrypto 2.5 を使用する場合、RSA キー オブジェクトのメソッドを使用する正当な理由はありません。PKCS#1 メソッドの 1 つ ( OAEPまたはv1.5 ) を使用する方が、より適切で安全です。それらを使用すると、平文はさらに短くする必要があります。

于 2012-04-11T06:27:40.513 に答える
1

PyCrypto の関連コードを確認しましたが、このエラーは、プレーンテキスト (long に変換された後) が key パラメータの 1 つよりも大きい場合にのみスローされます。スクリプトのエンコードが正しく設定されていると仮定すると、RSA キーが無効であるか短すぎることが原因である可能性があります。このスニペットを試してみましたが、問題なく動作します:

rsa = RSA.generate(1024)

print(rsa.encrypt("你好", 0))
于 2012-04-11T00:52:36.087 に答える
1

yakuake ターミナルからの対話型インタープリターで、Python 2.6.5 上の Ubuntu Linux 10.04 の pip からインストールされた 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]

対話型インタープリターから、またはファイルからこれを試していますか? ファイルの場合、ファイルは UTF-8 でエンコードされていますか? コンソールの場合、適切な UTF-8 サポートがありますか?

于 2012-04-11T00:40:52.550 に答える