2016-04-10 10 views
1

Ich habe diesen Code, aber wenn ich es ausführen, akzeptiert es nur "to_address" Variable einer bestimmten lenh. Wenn es zu lange dauert, erhalte ich eine Ausnahme:Pycrypto Zeichenfolge zu lang, um zu signieren/überprüfen

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 

Dies ist mein Code:

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 

Wenn jemand weiß, wie um diese Längenbegrenzung zu gehen, würde es geschätzt. Muss ich die Zeichenfolge irgendwie verschlüsseln, um sie kürzer zu machen, um sie zu verifizieren und dann wieder zu entschlüsseln?

Antwort

4

Vielleicht unterschreiben Sie einen Hash der Transaktion. Zur Verifizierungszeit können Sie den Hash erneut überprüfen.

Im Hinblick auf die Unterzeichnung von Nachrichten, sagt die Dokumentation:

Das Stück von Daten mit RSA zu unterzeichnen. Es ist möglicherweise nicht numerisch größer als das RSA-Modul (n).

Aber aufgepasst. Die Dokumentation für sign und verify sagt:

Achtung: Diese Funktion ist die Ebene, primitive RSA-Verschlüsselung (Lehrbuch) führt. In realen Anwendungen müssen Sie immer das richtige kryptografische Padding verwenden, und Sie sollten Daten nicht direkt mit diese Methode verifizieren. Andernfalls können Sicherheitslücken entstehen. Es wird empfohlen, stattdessen die Module Crypto.Signature.PKCS1_PSS oder Crypto.Signature.PKCS1_v1_5 zu verwenden.

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

+0

Dank, Prüfung jetzt – HCLivess