1

我使用 openssl rsa 函数来解密密文,一些代码是这样的:

+ (NSString *)RsaDecryptWithPrivateKey:(NSString *)encryptedString {
  void   *encrypt = NULL;    // Encrypted message
  char   *decrypt = NULL;    // Decrypted message
  char   *err = NULL;               // Buffer for any error messages

  BIO *bio = BIO_new_mem_buf((char *)prikey, -1);
  RSA *prikey = PEM_read_bio_RSAPrivateKey(bio, NULL, NULL, NULL);
  encrypt = malloc(RSA_size(prikey));

  NSData *encryptedData = [NSData dataFromBase64String:encryptedString];
  int encryptedData_length = (int)[encryptedData length];
  encrypt = (void *)[encryptedData bytes];

  decrypt = malloc(encryptedData_length);
  memset(decrypt, 0, encryptedData_length);
  if(RSA_private_decrypt(encryptedData_length,
                       (unsigned char*)encrypt,
                       (unsigned char*)decrypt,
                       prikey, RSA_PKCS1_OAEP_PADDING) == -1) {
      ERR_load_crypto_strings();
      ERR_error_string(ERR_get_error(), err);
      goto free_stuff;        
  }
  return [[NSString alloc] initWithBytes:decrypt length:strlen(decrypt) encoding:NSUTF8StringEncoding];

  free_stuff:
    RSA_free(prikey);
    free(encrypt);
    free(decrypt);
    free(err);
}

它工作正常。但是,当我使用 Instrument 跟踪有关它的泄漏时,会出现一些警告,如下所示: 在此处输入图像描述

我不知道如何解决这个问题,你能给我一些建议吗?

4

1 回答 1

0

在我看来,free除非出现错误(在这种情况下,尽管返回类型为 an ,但您没有返回任何内容NSString),否则您在从函数返回后正在分配您的分配。

NSString *decryptedString = nil;

if(RSA_private_decrypt(encryptedData_length,
                       (unsigned char*)encrypt,
                       (unsigned char*)decrypt,
                       prikey, RSA_PKCS1_OAEP_PADDING) == -1) {
      ERR_load_crypto_strings();
      ERR_error_string(ERR_get_error(), err);
      goto free_stuff;        
} else {
    decryptedString = [[NSString alloc] initWithBytes:decrypt length:strlen(decrypt) encoding:NSUTF8StringEncoding];
}

free_stuff:
  RSA_free(prikey);
  free(encrypt);
  free(decrypt);
  free(err); 

return decryptedString;

这样,nil如果解密失败,您将返回,但如果解密成功,仍然会释放所有内容。

我实际上还没有编译或测试过这个,所以我不知道这是否是问题所在,但至少要仔细看看。

于 2013-11-01T04:59:41.210 回答