我正在尝试使用 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。谢谢!