5

python Crypto パッケージの RSA 暗号化/復号化に問題があるようです:

from Crypto.PublicKey import RSA
from os import urandom
def test(keylen, datalen, rand_len):
    k = RSA.generate(keylen)
    ok, fail = (0,0)
    for i in range(1000):
        a = urandom(datalen)
        if a == k.decrypt(k.encrypt(a, urandom(rand_len))):
            ok += 1
        else:
            fail += 1
    return ok, fail

keylen/datalen/rand_len のどのような組み合わせを行っても、100% 復号化することはできません。それはCryptoの私のインストールだけですか?

>>> test(1024,128,0)
(853, 147)
>>> test(1024,127,0)
(996, 4)
>>> test(2048,127,0)
(994, 6)
4

2 に答える 2

3

これを試して:

from Crypto.PublicKey import RSA
from os import urandom
def test(keylen, datalen, rand_len):
    k = RSA.generate(keylen)
    ok, fail = (0,0)
    for i in range(1000):
        a = urandom(datalen).lstrip(b'\x00')
        if a == k.decrypt(k.encrypt(a, urandom(rand_len))):
            ok += 1
        else:
            fail += 1
    return ok, fail

説明:

pycrypto は、内部的にバイトではなく数値で動作します。つまり、先頭のゼロは考慮されません。encrypt非常にdecrypt低レベルです。

署名には、Signatureメッセージを正しくパディングするパッケージ (pycrypto2.5+) を使用する必要があります。それ以外の場合は、メッセージを自分でパディングする必要があります。

于 2012-07-13T08:05:04.993 に答える
1

NUL ( ) で始まる入力文字列に対して、各復号化の失敗が発生します\x00'。元の文字列を復号化されたバージョンと比較すると、元の文字列で始まり'\x00'、復元されたバージョンでは最初のバイトが削除されていることがわかります。

>>> a = '\x00\xa4\x8aE\xb5,\x1a\x95)Q'
>>> b = k.decrypt(k.encrypt(a, urandom(rand_len)))
>>> a == b
False
>>> len(a)
10
>>> len(b)
9
>>> a
'\x00\xa4\x8aE\xb5,\x1a\x95)Q'
>>> b
'\xa4\x8aE\xb5,\x1a\x95)Q'

最初のバイトを除いて、a と b は同じであることがわかります。

明らかに NUL は C 文字列の終了に重要ですが、元の文字列を単に空の文字列として扱うのではなく、この方法で失敗することに驚いています。ライブラリは先頭の NUL をスキップして、残りの文字列で暗号化すると思います。

于 2012-07-13T08:00:58.820 に答える