gpt4 book ai didi

c++ - OpenSSL C++ RSA 标志不同于命令行标志

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:28:43 27 4
gpt4 key购买 nike

我正在尝试用 C++ 签署文本,然后在命令行中验证它。我正在使用 OpenSSL 库。这是我的 key 生成命令行:

openssl genrsa -out key.pem 1024

现在我有了我的私钥。这就是我登录命令行的方式:

echo "hola" | openssl rsautl -pkcs -sign -inkey key.pem > sign.txt

此时一切正常,现在我有一个登录 sign.txt。现在我正尝试在 C 中做同样的事情……这是我的代码:

RSA * rsaPrivKey;


RSA * createRSAWithFilename (const char * filename, int publicKey)
{
FILE * fp = fopen (filename, "rb");

if (fp == NULL)
{
printf ("Unable to open file %s \n", filename);
return NULL;
}
RSA *rsa = RSA_new ();

if (publicKey)
rsa = PEM_read_RSA_PUBKEY (fp, &rsa, NULL, NULL);
else
rsa = PEM_read_RSAPrivateKey (fp, &rsa, NULL, NULL);

return rsa;
}


void initRSA (void)
{
rsaPrivKey = createRSAWithFilename ("key.pem", 0);

unsigned char text[] = {"hola"};
unsigned char encrypted[4098] = {};
unsigned int outlen;

unsigned char hash[20];
if (!SHA1 (text, sizeof(text), hash)){
printf ("SHA1 failed\n");
exit (0);
}
if (!RSA_sign (NID_sha1, hash, 20, encrypted, &outlen, rsaPrivKey)){
printf ("RSA_sign failed\n");
exit (0);
}

printf ("Result:\n");
for (int a = 0; a < outlen; a++)
printf ("%c", encrypted[a]);

exit (1);
}

当我调用 initRSA() 时,它会打印生成的签名...但是...与在命令行中生成的签名不同。

因为不确定 sizeof 是否采用了“文本”的实际长度,我尝试使用 length = 4(hola 有 4 个字符)和 5(可能计算\0),结果不是预期的。

我在密码学方面的知识非常有限..不知道问题出在哪里。

最佳答案

显然是因为您使用了错误的命令行。您需要此命令行,它计算您输入的摘要并使用私钥对其进行签名:

echo -n "hola" | openssl dgst -sha1 -binary -sign key.pem >sign.txt

使用 pkeyutl 做一些其他额外的事情,如下所述:Different signatures when using C routines and openssl dgst, rsautl commands

因此,如果您使用我提供的命令行(使用 echo -n 来避免添加换行符)并将您的代码更改为 sizeof(text)-1 以跳过空终止符,你应该得到相同的输出。

关于c++ - OpenSSL C++ RSA 标志不同于命令行标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33814916/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com