Pycrypto:如何查看原始RSA签名数据?

时间:2018-01-16 11:54:45

标签: python encryption rsa pycrypto

我正在使用一个使用原始RSA和私钥来签署有效负载的服务。使用以下方法有效地生成数据:

openssl rsautl -inkey private_key.pem -raw -sign

(另外,使用私钥加密的结果)

不幸的是,在Pycrypto中,相应的.verify()方法只接受一个参数来验证数据反对返回true或false。

在openssl中,可以使用以下方法之一来实现:

# Private key based
openssl rsautl -inkey private_key.pem -raw -verify
# Public key based
openssl rsautl -inkey public_key.pem -pubin -raw -verify

如何在Pycrypto中实现相同的功能?

(我理解原始RSA的风险。已经实施了自定义填充机制来减轻这些风险。不幸的是,它无法改变当前的实现)

1 个答案:

答案 0 :(得分:0)

深入研究.verify()方法,可以找到Pycrypto如何在将其与给定的所需签名进行比较之前构建验证签名。

它主要使用Python的pow()方法和密钥的公共( e )和密钥的模数( n )。您首先需要将秘密消息打包成(长)整数,然后将结果转换回字节。幸运的是,Pycrypto提供了您需要的一切。

from Crypto.PublicKey import RSA
from Crypto.Util import number

key = RSA.importKey(private_key_str, key_password_str)

# The message must be packed as a long first.
secret_message_long = number.bytes_to_long(secret_message_bytes)
# The magic!        
verify_long = pow(encrypted_session_key_long, key.e, key.n)
# and back to bytes
verify_bytes = number.long_to_bytes(result_long)

# Convert message back to a str (Unicode str in Py2).
# Replace 'utf-8' with the correct encoding for *your* message!!!!!
verify_str = verify_bytes.decode('utf-8')