OpenSSL C++RSA符号与命令行符号不同

OpenSSL C++ RSA sign is different from command line sign

本文关键字:符号 命令行 C++RSA OpenSSL      更新时间:2023-10-16

我正在尝试用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 failedn");
      exit (0);
   }
   if (!RSA_sign (NID_sha1, hash, 20, encrypted, &outlen, rsaPrivKey)){
      printf ("RSA_sign failedn");
      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),结果不是预期的。

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

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

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

使用pkeyutl可以做一些其他额外的事情,如下所述:使用C例程和openssl-dgst时的不同签名,rsoutl命令

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