我正在使用一个使用原始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的风险。已经实施了自定义填充机制来减轻这些风险。不幸的是,它无法改变当前的实现)
答案 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')