Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ wc_RsaSSL_Verify返回BAD_FUNC_ARG,我可以';我不知道为什么_C++_Ssl_Aes_Wolfssl - Fatal编程技术网

C++ wc_RsaSSL_Verify返回BAD_FUNC_ARG,我可以';我不知道为什么

C++ wc_RsaSSL_Verify返回BAD_FUNC_ARG,我可以';我不知道为什么,c++,ssl,aes,wolfssl,C++,Ssl,Aes,Wolfssl,我正在尝试使用wolfcrypt对签名文件进行RSA公钥解密-是的,我可能滥用RSA的“签名/验证”功能,使用私钥对单独的AES密钥进行加密,并使用公钥进行解密 不幸的是,我被困在wc_rsasssl_Verify()-就我的一生而言,我不明白为什么它会返回BAD_FUNC_ARG-我认为这样的错误应该会立即被其他人看到,所以我决定调用StackOverflow的集体力量 据我所知,我给出了函数所要求的内容—输入缓冲区、输出缓冲区、每个缓冲区的大小以及指向RsaKey结构的指针。下面是有关函数的

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

不幸的是,我被困在wc_rsasssl_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);
bool-VerifyWorker::GetAESKey()
{
布尔结果=真;
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;
//密钥文件流
std::fstream aes_文件;
//必须初始化rsa_密钥
if(rsa_key==NULL)
{
结果=假;
}
//打开密钥文件并将其读入本地缓冲区,然后解密并使用它初始化
//aes结构
如果(结果)
{
打开(这个->aes_密钥_文件,std::ios_base::in | std::ios_base::binary);
if(aes_file.fail())
{
//无法打开文件-或?
perror(“GetAESKey”);
结果=假;
}
其他的
{
读取(重新解释强制转换(en_aes_file_buff),验证WorkerLocal::RSA_密钥大小+1);
如果(!aes_file.eof())
{
//我们没有足够的空间来阅读整个签名!

std::cerr我发现问题在于,我使用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验证该文件


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

it sou您尝试使用RSA\u Sign对AES密钥执行“加密”。然后我假设您将发送到远程合作伙伴或计算机,然后该计算机将运行RSA\u验证操作来解密AES密钥。我是否正确理解该场景

如果是这样的话,我很抱歉,如果您最初搜索了如何做到这一点,它没有显示出来,但实际上我们这里有一个这样做的示例:

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

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

不,一点也不,假设您使用的是固定长度的输入,如AES密钥,则这是RSA sign/verify的有效用法

这就是我们创建这个例子的原因!不久前,我们的论坛上有一个用户问了一个非常类似的问题,这导致我们制作了这个例子

关于openssl和wolfssl遇到的问题,需要注意的一件事实际上在自述文件中讨论过:

…请记住,这不是真正的RSA ENCRYPT,可能不会与提供RSA_PRIVATE_ENCRYPT类型API的其他库交互

这是一个真符号操作

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


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

const_cast(en_aes_file_buff)
what
reinterpret_cast(&de_aes_file_buff)
whaaatet除了指出这些奇怪之处外,我认为实际上我们需要一个调试程序(正常情况下)哇!我怎么会错过这一点呢?这就是使用“jam in”时发生的情况casts:PThanks!这将是非常有用的。我会投票,但我没有要求的代表我可以问-我发现我得到了坏的函数参数,只是因为我试图RSA验证的缓冲区的内容。我对RSA加密有初步的了解,但我只是想知道-在什么情况下输入数据buffer导致函数返回BAD_FUNC_ARG?@zkabitz,因为我们的库是用C编写的,所以我们对变量值非常严格,并且我们经常要求将缓冲区的长度与缓冲区本身一起传递(以防止缓冲区溢出和破坏堆栈错误)。您可能会传入一个完全合法的缓冲区,但如果为该缓冲区发送的长度为零,我们将返回一个错误的函数参数,此外,如果出于某种原因,我们请求一个指针,而指针为空(尚未初始化或malloced)然后我们将返回一个错误的函数参数。我可以问一下,当返回该参数时,您正在调用哪个API吗?请参阅我对这个问题的回答。考虑到数据的更改(而不是其他参数的更改),似乎只是我传递给wc_RsaSSL_Verify的加密数据导致了该错误导致它消失。由于解密的数据肯定不包含有效的填充,因此加密错误的数据集在解密时是否可能导致PKCS unpadding错误?哦,是的,绝对正确。很高兴您能够解决它!干杯-Kaleb