首页 > 解决方案 > 如何解密 AES-256 WinZip 有效负载?

问题描述

我的目标是解密由 7zip 生成的与 Winzip 兼容的 AES-256 加密文件。我想使用 OpenSSL 来解密有效载荷。

(普通的 zip 文件格式。不是 7z 格式)

我有 39 字节的二进制有效负载。

派生的密钥与 7zip 中的密钥匹配。

我需要告诉 openssl 密钥的长度吗?openssl API 需要一个 IV,但这种类型的加密不使用一个。如何指定没有 IV?

#include <string.h>
#include <stdio.h>
#include <openssl/evp.h>
#include <openssl/aes.h>

// gcc decrypt.c -lcrypto && ./a.out

int main()
{
  unsigned char key[100];
  unsigned char decout[100];
  unsigned char in[100];
  unsigned char dummy[100];
  unsigned char out[100];
  unsigned char* pass = "foo";
  unsigned char saltbuf[100];

  int passlen = strlen(pass);
  int saltlen = 16;
  int iter = 1000;
  int keylen = 32;
  const unsigned char* salt = saltbuf;
  FILE* fp = fopen("message", "rb");
  fread(saltbuf, sizeof(unsigned char), saltlen, fp);
  PKCS5_PBKDF2_HMAC_SHA1(pass, passlen, salt, saltlen, iter, keylen, key);

  fread(dummy, sizeof(unsigned char), 2, fp);
  fread(in, sizeof(unsigned char), 21, fp);
  int  msg_len=11;
  EVP_CIPHER_CTX* ctx;
  ctx = EVP_CIPHER_CTX_new();
  int declen=0;
  int declen2=0;
  printf("key:\n");
  BIO_dump_fp(stdout, key, keylen);
  EVP_DecryptInit(ctx, EVP_aes_256_ctr(), key, NULL);
  printf("input:\n");
  BIO_dump_fp(stdout, in, 11);
  EVP_DecryptUpdate(ctx, &decout, &declen, in, 11);
  printf("declen %i\n", declen);
  printf("declen2 %i\n", declen2);
  EVP_DecryptFinal(ctx, &decout + declen, &declen2);
  printf("decrypted:\n");
  BIO_dump_fp(stdout, &decout, 11);
  EVP_CIPHER_CTX_cleanup(ctx);
}

输出:

有一个 32 字节的密钥和一个 11 字节的加密消息。

key:
0000 - fc 29 33 b3 64 6e 90 f7-ce b4 92 5b b7 cc d3 bc   .)3.dn.....[....
0010 - 55 ed b1 87 e4 57 07 2c-b4 a5 f8 77 b6 40 1c 62   U....W.,...w.@.b
input:
0000 - dc e2 26 62 ee 8a e9 71-51 86 14                  ..&b...qQ..
declen 11
declen2 0
decrypted:
0000 - e2 d7 09 96 53 45 9a dd-1e 44 a9                  ....SE...D.

背景信息:https ://www.winzip.com/win/en/aes_info.html#encryption

更新:

我能够使用以下代码对其进行解密:http: //brg.a2hosted.com//oldsite/cryptography_technology/fileencrypt/index.php

PKCS5_PBKDF2_HMAC_SHA1我使用OpenSSL派生了密钥。

我仍然想了解区别以及如何使用 OpenSSL 来执行 AES 部分。

标签: cencryptionopensslcryptographyaes

解决方案


推荐阅读