我想编写代码来验证一些RSA签名。签名使用OpenSSL命令行工具制造,使用此命令行的等效:OpenSSL RSA签名验证:散列和填充?
openssl dgst -sha1 -sign private_key_file.pem <binary_data_file> sig
我试图用libtomcrypt
做验证:
这里是调用RSA验证功能的签名libtomcrypt
:
int rsa_verify_hash_ex(
const unsigned char *sig, unsigned long siglen, // signature to verify
const unsigned char *hash, unsigned long hashlen, // hash value to check against sig
int padding, // defined constant value, see below
int hash_idx, // identifies which hash algorithm, see below
unsigned long saltlen, // specify salt length, see below
int *stat, // output parameter, returns whether verify succeeded or not
rsa_key *key); // RSA public key to use for verify
这个函数返回一个0,如果它的运行没有错误,否则返回一个错误代码。如果它的运行没有错误,则输出参数stat
指示签名是否已验证。
大部分参数看起来很简单:传入签名进行检查,用来比较它的哈希值以及用于检查的RSA密钥。 hash_idx
从libtomcrypt
附带的示例代码中清楚;这是一个索引的支持的哈希算法的表,我能找到正确的值与此代码段使用:hash_idx = find_hash("sha1")
但我想知道有关padding
和saltlen
值。 padding
并不担心我太多,因为只有两个可能的值,我可以尝试它们两个。但是,我应该通过什么saltlen
?
用于RSA验证的OpenSSL函数的OpenSSL文档不显示saltlen
参数。 openssl dgst
的手册页(即man dgst
的结果)不讨论盐。
所以我的问题:
- 我怎样才能确定正确的盐长度使用?
- 是否OpenSSL的
dgst
命令插入输入任何多余的东西,如:(stdin)=
(我发现(stdin)=
东西通过搜索的StackOverflow:Why are the RSA-SHA256 signatures I generate with OpenSSL and Java different?)
libtomcrypt
也有一个名为pkcs_1_pss_decode()
功能其被记录为“解码PSS编码的签名块”。这是我需要调用的函数吗?
感谢您给我的任何帮助。
编辑:感谢下面的帮助,来自@Jonathan Ben-Avraham,今天我能够得到这个工作。我的问题的答案分别是:
- 使用长度为0的盐,根本没有盐。
- 没有,OpenSSL的并不如
(stdin)=
- 我需要调用
rsa_verify_hash_ex()
插入任何额外的东西,我需要到指定padding
参数作为LTC_LTC_PKCS_1_V1_5
。
谢谢你的一个非常好的答案。你给了我自己的工具,看看没有盐。我现在有'libtomcrypt'代码成功验证签名! +1并接受答案。 – steveha 2013-04-30 06:03:57
@ steveha:谢谢!您可能还想查看关于'rsautl''的后续文章:http://stackoverflow.com/questions/9951559/difference-between-openssl-rsautl-and-dgst – 2013-04-30 09:46:20