8

私は暗号化とpycryptoの初心者です。

モジュラスnとプライベート指数がありdます。いくつかのドキュメントを読んだ後に私が理解したことから、秘密鍵はとで構成されnていdます。

メッセージに署名する必要がありますが、を使用してそれを行う方法がわかりませんpycryptoRSA.construct()メソッドはタプルを受け入れます。ただし、このメソッドに公開指数を追加で提供する必要がeあります(これは私にはありません)。

これが私の質問です。eメッセージに署名するために何らかの方法で計算する必要がありますか?

nand d(秘密鍵を構成する)を使用するだけでメッセージに署名できるはずです。私は正しいですか?でこれを行うことはできますpycryptoか?

前もって感謝します。

4

3 に答える 3

4

実際、公開鍵で暗号化されたメッセージを復号化するには、秘密指数があれば十分です。

これは、メッセージに署名できることも意味します。署名は基本的に、秘密鍵を使用して平文を*復号化*するだけであり、公開鍵を使用して*暗号化*すると、平文が再び提供されるためです。通常、前に平文でハッシュダイジェストを使用し、それに署名します...

nのみをd使用してメッセージを復号化できない理由はpyrcypto、メッセージの復号化中にブラインドステップを実行するためです。これには、公開指数が含まれますが、復号化には実際には必要ありません。

ただし、プライベートAPIへの呼び出しを使用することで、この手順をバイパスできます。

したがって、これは機能するはずです。

from Crypto.PublicKey import RSA
from Crypto.Util.number import bytes_to_long, long_to_bytes

full = RSA.generate(2048)

# construct key using only n and d
try:
    # pycrypto >=2.5, only tested with _slowmath
    impl = RSA.RSAImplementation(use_fast_math=False)
    partial = impl.construct((full.n, 0L))
    partial.key.d = full.d
except TypeError:
    # pycrypto <=2.4.1
    partial = RSA.construct((full.n, 0L, full.d))   



pub = full.publickey()

# create message with padding
# http://en.wikipedia.org/wiki/RSA_%28algorithm%29#Padding_schemes
cleartext = ...

signature = partial.sign(cleartext, None)

print "validating message: ", pub.verify(cleartext, signature)


message = pub.encrypt(cleartext, None)

# bypassing the blinding step on decrypt
enc_msg=map(bytes_to_long, message)
dec_msg = map(partial.key._decrypt, enc_msg)

print "decrypting: "
for m in dec_msg:
    print long_to_bytes(m)
于 2012-05-21T18:36:35.883 に答える
3

eいいえ、から計算することはできませんd

RSAは対称的でdありe、公開鍵と秘密鍵の役割を同じように交換できます。もちろん、私たちは一方を特別にプライベートにしてもう一方を明らかにしますが、理論的には同じことをします。当然、公開鍵から秘密鍵を推測することはできないため、秘密鍵から公開鍵を推測することもできません。

もちろん、秘密鍵を持っている場合は、鍵ペアを生成したことを意味します。つまり、どこかに公開鍵を持っていることを意味します。

于 2012-05-21T17:02:28.930 に答える
2

公開指数がない場合は、推測できる可能性があります。ほとんどの場合、それはランダムプライムではなく静的な値です。65537(hex 0x010001、フェルマーの4番目の数字)、3、5、7、13、17(この順序で)の値を試してください。

[編集]秘密鍵で署名し、公開鍵で確認して、公開鍵が正しいかどうかを確認するだけです。

注:ランダムプライムの場合、プライベート指数と同じくらい見つけるのは困難です。これは、RSAを破ろうとしていることを意味します-512ビットを超えるキーサイズではありそうにありません。

于 2012-05-21T18:20:33.553 に答える