我正在尝试编写代码来验证一些 RSA 签名。签名是使用 OpenSSL 命令行工具生成的,使用此命令行的等效项:
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
andsaltlen
值。 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
。