vio_ssl_write(vio*,const uchar*,size_t)中的异常错误

发布于 2025-02-10 05:00:10 字数 1513 浏览 1 评论 0原文

我有一种解密方法,该方法使用私有密钥解密数据:

auto decrypt_private(const unsigned char* data,size_t data_len, 
unsigned char* decrypted_data)-> int
{

std::string pr_key_name="mykey.pem";
std::string keypass = "pass";
char * keypass_byte= const_cast<char*>( keypass.c_str() );

//open the private key file
FILE *fp = fopen(pr_key_name.c_str(), "r");
RSA *rsa = PEM_read_RSAPrivateKey(fp, NULL, NULL, keypass_byte);
if(rsa==NULL)
   ERR_print_errors_fp(stderr);
fclose(fp);
int rsa_outlen  = RSA_private_decrypt(data_len, data, decrypted_data,rsa, 
RSA_PKCS1_PADDING);
RSA_free(rsa);
return rsa_outlen;
}

主要我有:

int main(){
std::string encrypted_data;
// encrypted data is in hex encoding
cin>>encrypted_data;
// I know the exact length of decrypted data
unsigned char* decrypted_data = new unsigned char[DATA_SIZE];
unsigned char* encrypted_data_byte= new unsigned char[encrypted_data.length()/2];
int decrypted_data_size= decrypt_private(encrypted_data_byte, 
encrypted_data.length()/2, decrypted_data);
// catch error if decryption faild
if(decrypted_data_size==-1){
     delete[] decrypted_data;
      delete[] encrypted_data_byte;
      std::cout<<"decryption faild";
      return 1;
  }
delete[] decrypted_data;
delete[] encrypted_data_byte;
return 0;
}

但是,当我添加IF条件和解密方法的结果为-1我从viossl.cc中获得错误: ../vio/viossl.cc:315:size_t vio_ssl_write(vio*,const uchar*,size_t):断言`err_peek_error()== 0'失败。 并提出例外,程序崩溃。任何身体都知道原因吗?顺便说一句,我还删除了IF条件,再次遇到了相同的错误。

I have a decryption method which decrypts data using private key:

auto decrypt_private(const unsigned char* data,size_t data_len, 
unsigned char* decrypted_data)-> int
{

std::string pr_key_name="mykey.pem";
std::string keypass = "pass";
char * keypass_byte= const_cast<char*>( keypass.c_str() );

//open the private key file
FILE *fp = fopen(pr_key_name.c_str(), "r");
RSA *rsa = PEM_read_RSAPrivateKey(fp, NULL, NULL, keypass_byte);
if(rsa==NULL)
   ERR_print_errors_fp(stderr);
fclose(fp);
int rsa_outlen  = RSA_private_decrypt(data_len, data, decrypted_data,rsa, 
RSA_PKCS1_PADDING);
RSA_free(rsa);
return rsa_outlen;
}

In main I have:

int main(){
std::string encrypted_data;
// encrypted data is in hex encoding
cin>>encrypted_data;
// I know the exact length of decrypted data
unsigned char* decrypted_data = new unsigned char[DATA_SIZE];
unsigned char* encrypted_data_byte= new unsigned char[encrypted_data.length()/2];
int decrypted_data_size= decrypt_private(encrypted_data_byte, 
encrypted_data.length()/2, decrypted_data);
// catch error if decryption faild
if(decrypted_data_size==-1){
     delete[] decrypted_data;
      delete[] encrypted_data_byte;
      std::cout<<"decryption faild";
      return 1;
  }
delete[] decrypted_data;
delete[] encrypted_data_byte;
return 0;
}

but as I add the if condition and the result of the decryption method is -1 I get error from viossl.cc :
../vio/viossl.cc:315: size_t vio_ssl_write(Vio*, const uchar*, size_t): Assertion `ERR_peek_error() == 0' failed.
and throw an exception and the program crashes. Does any body knows the reason? By the way I also removed the if condition and again I get the same error.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

长不大的小祸害 2025-02-17 05:00:10

添加err_clear_error()解决了问题:

if(decrypted_data_size==-1){
  ERR_clear_error();
  delete[] decrypted_data;
  delete[] encrypted_data_byte;
  std::cout<<"decryption faild";
  return 1;
}

Adding ERR_clear_error() solved the problem:

if(decrypted_data_size==-1){
  ERR_clear_error();
  delete[] decrypted_data;
  delete[] encrypted_data_byte;
  std::cout<<"decryption faild";
  return 1;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文