我正在尝试在C++中签名文本,然后在命令行中进行验证。我正在使用OpenSSL库。这是我的密钥生成命令行:
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是否获取了"text"的实际长度,所以我尝试使用length = 4(hola有4个字符)和5(可能计算\0),结果不是预期的。我的加密知识非常有限...不知道问题出在哪里。
#include <lib>
部分)。 - diegoperini