2016-04-10 2 views
1

У меня есть этот код, но когда я его запускаю, он принимает только переменную «to_address» определенной длины. Когда это слишком долго, я получаю исключение:Pycrypto string too long to sign/verify

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).

Остерегайтесь. Документация sign и verify говорит:

Внимание: эта функция выполняет равнину, примитивный 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