EVP加密核心被转储

时间:2018-04-16 22:45:27

标签: c encryption openssl

我尝试解密使用AES_128_cbc()中的EVP加密的密文,密文存在于名为task3.bin的文件中。我试图进行模拟解密试验,这意味着解密没有使用正确的keyiv,但其长度有效。

这两个功能是从EVP documentation page复制并粘贴的,但EVP_aes_256_cbc()已更改为EVP_aes_128_cbc()作为解密方法。

void handleErrors(void) {
  ERR_print_errors_fp(stderr);
  abort();
}

int decrypt(unsigned char *ciphertext, int ciphertext_len, unsigned char *key,unsigned char *iv, unsigned char *plaintext) {
  EVP_CIPHER_CTX *ctx;

  int len;

  int plaintext_len;

  /* Create and initialise the context */
  if(!(ctx = EVP_CIPHER_CTX_new())) handleErrors();

  /* Initialise the decryption operation. (changed 256 to 128 HERE!!!)*/
  if(1 != EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv))
    handleErrors();

  /* Provide the message to be decrypted, and obtain the plaintext output.
   * EVP_DecryptUpdate can be called multiple times if necessary
   */
  if(1 != EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len))
    handleErrors();
  plaintext_len = len;

  /* Finalise the decryption. Further plaintext bytes may be written at
   * this stage.
   */
  if(1 != EVP_DecryptFinal_ex(ctx, plaintext + len, &len)) handleErrors();
  plaintext_len += len;

  /* Clean up */
  EVP_CIPHER_CTX_free(ctx);

  return plaintext_len;
}

我的main功能正在调用decrypt

int main(void) {
  FILE *f;
  long lSize;
  char *buffer;

  char *ciphertext;
  unsigned char *iv;
  unsigned char *key;

  unsigned char decryptedtext[128];
  int decryptedtext_len;

  // read ciphertext
  f = fopen("task3.bin", "rb");
  fseek( f , 0L , SEEK_END);
  lSize = ftell( f );
  rewind( f );
  ciphertext = calloc( 1, lSize+1 );
  fread(ciphertext , lSize, 1 , f);
  fclose(f);

  // testing key and iv
  key = (unsigned char *)"0123456789012345";
  iv = (unsigned char *)"0000000000000000";

  // decrypt!
  decryptedtext_len = decrypt(ciphertext, strlen((char *)ciphertext), key, iv, decryptedtext);

  return 0;
}

我收到错误139864800151232:error:06065064:lib(6):func(101):reason(100):evp_enc.c:529: Aborted (core dumped)并且我花了好几个小时看着它而没有太大的成功。 OpenSSL的任何技术人员,请帮助。

错误来自EVP_DecryptFinal_ex,即EVP中的最后decrypt次来电。我只能假设某些长度没有正确分配。

1 个答案:

答案 0 :(得分:1)

如果解密使用PKCS#7填充加密的数据(通常情况下),使用错误密钥进行解密将导致大部分时间出现填充错误。

由于填充位于最后一个块中,因此会在EVP_DecryptFinal调用中进行检查,以便一切都有意义。

根据加密算法,模式和填充量等其他因素,很难实现模拟解密。

注意:OpenSSL EVP文档声明:“ OpenSSL默认情况下使用PKCS填充”,这是一个警察,因为它不会说PKCS#5或PKCS#7。对于AES,我必须假设PKCS#7。