1

我正在尝试使用 wolfcrypt 对签名文件进行 RSA 公钥解密 - 是的,我可能会也可能不会滥用 RSA 的“签名/验证”功能来使用私钥加密单独的 AES 密钥并使用公钥解密。

不幸的是,我被困在 wc_RsaSSL_Verify() 上——在我的一生中,我无法弄清楚为什么它会返回 BAD_FUNC_ARG——我认为这样的错误应该立即对其他人可见,所以我决定呼吁集体StackOverflow 的强大功能。

据我所知,我正在向函数提供它所要求的 - 输入缓冲区、输出缓冲区、每个缓冲区的大小以及指向 RsaKey 结构的指针。以下是相关函数的代码片段:

bool VerifyWorker::GetAESKey()
{
  bool result = true;
  uint8_t en_aes_file_buff[VerifyWorkerLocal::RSA_KEY_SIZE];
  uint8_t de_aes_file_buff[VerifyWorkerLocal::RSA_KEY_SIZE];

  uint8_t* aes_iv_ptr = NULL;

  // keyfile filestream
  std::fstream aes_file;

  // rsa_key must be initialized
  if(rsa_key == NULL)
  {
     result = false;
  }

  // Open the key file and read it into a local buffer, then decrypt it and use it to initialize the
  // aes struct
  if(result)
  {
     aes_file.open(this->aes_key_file, std::ios_base::in | std::ios_base::binary);

     if(aes_file.fail())
     {
        // Unable to open file - perror?
        perror("GetAESKey");
        result = false;
     }
     else
     {
        aes_file.read(reinterpret_cast<char*>(en_aes_file_buff), VerifyWorkerLocal::RSA_KEY_SIZE + 1);
        if(!aes_file.eof())
        {
           // we didn't have enough space to read the whole signature!
           std::cerr << "aes_file read failed! " << aes_file.rdstate() << std::endl;
           result = false;
        }
     }
  }

  // "Unsign" the aes key file with RSA verify, and load the aes struct with the result
  if(result)
  {
     int wc_ret = 0;
     wc_ret = wc_RsaSSL_Verify(const_cast<const byte*>(en_aes_file_buff),
                               VerifyWorkerLocal::RSA_KEY_SIZE, reinterpret_cast<byte*>(&de_aes_file_buff),
                               VerifyWorkerLocal::RSA_KEY_SIZE, rsa_key);

rsa_key 是在带有公钥 DER 文件的单独函数中初始化的私有成员(成功地,使用 wc_PublicKeyDecode())。我使用 OpenSSL 生成了公钥和私钥——它应该使用 PKCS#1 v1.5 b 默认正确填充我的 AES 密钥和 iv 文件。

我还应该提到我使用的是 wolfssl 版本 3.9.8。谢谢!

4

2 回答 2

1

我发现问题是我用我的 RSA 密钥签名的文件没有正确签名。当我使用 OpenSSL 签署文件时,我的 cli 调用是

openssl rsautl -in keyfile -out keyfile -inkey private.pem -sign

显然,openssl 不希望您为 -in 和 -out 指定相同的文件。当我将其更改为类似

openssl rsautl -in keyfile -out keyfile_signed -inkey private.pem -sign

我实际上能够使用 wc_RsaSSL_Verify 验证文件。

所以,就像大多数愚蠢的深夜、最后一小时的软件问题一样,我完全找错了地方。我对返回的 BAD_FUNC_ARG 有点失望,并认为它必须明确地与函数参数的格式有关,不一定是它们的内容。希望这个答案对其他人也有用。

于 2018-02-14T16:56:45.387 回答
1

听起来您正在尝试使用 RSA_Sign 来执行 AES 密钥的“加密”。然后我假设您要发送到远程合作伙伴或计算机,然后他们将运行 RSA_Verify 操作来解密 AES 密钥我是否正确理解该场景?

如果是这样,我很抱歉,如果您最初搜索如何执行此操作,但我们实际上在这里有一个这样做的示例:

https://github.com/wolfSSL/wolfssl-examples/tree/master/signature/encryption-through-signing

该示例包括两个单独的应用程序。第一个应用程序“rsa-private-encrypt-app.c”将对“假 Aes 密钥”进行签名(加密)并将结果输出到文件中。第二个应用程序“rsa-public-decrypt-app.c”然后打开输出的文件并对文件中包含的数据进行验证(解密)以恢复原始的“假 Aes 密钥”。

我可能会也可能不会滥用 RSA 的“签名/验证”功能来使用私钥加密单独的 AES 密钥并使用公钥解密。

完全不,这是对 RSA 签名/验证的有效使用,假设您正在使用固定长度的输入,例如 AES 密钥。

这就是我们创建示例的原因!实际上,不久前我们有一个用户在我们的论坛上提出了一个非常相似的问题,这导致我们制作了这个例子。

关于您在使用 openssl 和 wolfssl 时遇到的问题,需要注意的一件事实际上是在 README 中讨论的:

https://github.com/wolfSSL/wolfssl-examples/blob/master/signature/encryption-through-signing/README.md

...请记住,这不是真正的 RSA ENCRYPT,并且可能不会与提供 RSA_PRIVATE_ENCRYPT 类型 API 的其他库进行互操作。

这是真正的 SIGN 操作。

如果您有任何其他问题,请随时在此处发布(当然还要添加 wolfssl 标签),或者您也可以随时通过 support@wolfssl.com 给我们发送电子邮件

免责声明:我为 wolfSSL Inc. 工作。

于 2018-02-14T18:54:37.160 回答