2016-04-10 5 views
1

私はこのコードを持っていますが、実行すると特定のlenthの "to_address"変数しか受け付けません。それが長すぎると、私は例外を受け取る:符号が長すぎて署名/検証できません

Traceback (most recent call last): 
** IDLE Internal Exception: 
    File "C:\Python27\lib\idlelib\run.py", line 325, in runcode 
    exec code in self.locals 
    File "C:\Python27\lib\idlelib\run.py", line 111, in main 
    seq, request = rpc.request_queue.get(block=True, timeout=0.05) 
    File "C:\Python27\lib\Queue.py", line 176, in get 
    raise Empty 
Empty 

これは私のコードです:

import hashlib 
import sqlite3 
import socket 
import time 
from Crypto.PublicKey import RSA 

# import keys 
key_file = open('keys.pem','r') 
key = RSA.importKey(key_file.read()) 
public_key = key.publickey() 
private_key_readable = str(key.exportKey()) 
public_key_readable = str(key.publickey().exportKey()) 
address = hashlib.sha224(public_key_readable).hexdigest() 

to_address = str(raw_input ("Send to address: ")) 
amount = str(raw_input ("How much to send: ")) 
timestamp = str(time.time()) 

transaction = str(timestamp) +":"+ str(address) +":"+ str(to_address) +":"+ str(amount) 
signature = key.sign(transaction, '') 
print "Client: Signature: "+str(signature) 

if public_key.verify(transaction, signature) == True: 
    if int(amount) < 0: 
     print "Client: Signature OK, but cannot use negative amounts" 

    else: 
     ...process... 

else: 
    print "Client: Invalid signature" 
    raise 
#enter transaction end 

誰もが、この長さの制限を迂回する方法を知っている場合、それが認識されるであろう。それを検証してからもう一度解読するために、文字列を何らかの方法で暗号化する必要がありますか?

答えて

4

おそらく、トランザクションのハッシュに署名します。検証時にハッシュをもう一度取ることができます。

メッセージの署名について、ドキュメントは言う:

RSAで署名するデータの一部。 RSAモジュール(n)よりも数値が大きい場合があります。

注意してください。 signverifyのドキュメントは言う:

注意:この機能は、プレーン、原始的なRSA暗号 (教科書)を行います。実際のアプリケーションでは、常に適切な 暗号化パディングを使用する必要があります。この方法を使用して のデータを直接検証しないでください。そうしなければ、セキュリティ上の脆弱性が生じる可能性があります。代わりに を使用して、Crypto.Signature.PKCS1_PSSまたは Crypto.Signature.PKCS1_v1_5モジュールを使用することをお勧めします。今

https://www.dlitz.net/software/pycrypto/api/current/Crypto.PublicKey.RSA._RSAobj-class.html#publickey

+0

おかげで、テスト – HCLivess

関連する問題