在 C 语言代码构造消息的时候,需要使用 Sha1WithRSA 的签名算法对消息进行签名,因为对方用的是 JAVA 代码,他要使用 Sha1WithRSA 进行验签。然而 C 语言却并不像 JAVA 代码一样有现成的 Sha1WithRSA 算法, openssl 库当中的 RSA_sign ,指定了第一个参数为 NID_sha1 的话,也仅仅做了一个标识,并没有使用 Sha1 进行摘要。
在 C 语言代码构造消息的时候,需要使用 Sha1WithRSA 的签名算法对消息进行签名,因为对方用的是 JAVA 代码,他要使用 Sha1WithRSA 进行验签。然而 C 语言却并不像 JAVA 代码一样有现成的 Sha1WithRSA 算法, openssl 库当中的 RSA_sign ,指定了第一个参数为 NID_sha1 的话,也仅仅做了一个标识,并没有使用 Sha1 进行摘要。
|
Archangel_SDYApr 9, 2016
1
难道不是你先算个 SHA-1 ,再 RSA 一下?
|
|
2
@Archangel_SDY :我现在的方案就是自己先用 Sha1 进行摘要,然后将摘要再做个 RSA ,但是做出来的签名乱七八糟的,本来想 google 搜一下看有没有 C 语言的例子,结果到处都搜不到
|
|
SoloCompanyApr 9, 2016
3
echo test | openssl sha1 -sign private.key -hex
(stdin)= 302d02150088400760bb802e82c1eb7904a635e9c7320bc9070214484a37c04e11b5ecdaefebe82e0f6f5d82d19b36 |
|
VmuTarghApr 9, 2016
4
github 搜啊 现成好多
|
|
buf1024Apr 9, 2016
5
你参考下,使用 openssl(linux man EVP_SignInit):
int EVP_SignInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl); int EVP_SignUpdate(EVP_MD_CTX *ctx, const void *d, unsigned int cnt); int EVP_SignFinal(EVP_MD_CTX *ctx,unsigned char *sig,unsigned int *s, EVP_PKEY *pkey); void EVP_SignInit(EVP_MD_CTX *ctx, const EVP_MD *type); int EVP_PKEY_size(EVP_PKEY *pkey); EVP_SignInit_ex 第一个参数使用是加载的 RSA 私钥 EVP_MD_CTX ,第二个参数传递 EVP_sha1(), 第三个参数可以 NULL 。 |
|
jinsongzhaoApr 10, 2016 via Android
6
sha-1 很难找,只能自己从 Java 上移植。建议绕道。
|
|
mutaliskApr 10, 2016
7
boost 中有 sha1
|
|
gaodengApr 10, 2016
8
openssl 源码的 test 文件夹下面找找,没准有例子。
|
|
feelapiApr 10, 2016
9
crypto++
|