Pycrypto:如何查看原始 RSA 签名数据?
Pycrypto: How to view raw RSA signature data?
我正在使用一种服务,该服务使用带有私钥的原始 RSA 来签署负载。使用以下方法有效生成数据:
openssl rsautl -inkey private_key.pem -raw -sign
(也是用私钥加密后的结果)
不幸的是,在 Pycrypto 中相应的 .verify()
方法只接受一个参数来验证数据是否为 return 真或假。
在 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 的风险。已实施自定义填充机制来减轻其中一些风险。不幸的是,无法更改当前实施)
深入研究 .verify()
方法,可以了解 Pycrypto 如何在将验证签名与给定的所需签名进行比较之前构建验证签名。
它本质上是使用 Python 的 pow()
方法与密钥的 public (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')
我正在使用一种服务,该服务使用带有私钥的原始 RSA 来签署负载。使用以下方法有效生成数据:
openssl rsautl -inkey private_key.pem -raw -sign
(也是用私钥加密后的结果)
不幸的是,在 Pycrypto 中相应的 .verify()
方法只接受一个参数来验证数据是否为 return 真或假。
在 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 的风险。已实施自定义填充机制来减轻其中一些风险。不幸的是,无法更改当前实施)
深入研究 .verify()
方法,可以了解 Pycrypto 如何在将验证签名与给定的所需签名进行比较之前构建验证签名。
它本质上是使用 Python 的 pow()
方法与密钥的 public (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')