c - 如何解密 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 部分。
解决方案
推荐阅读
- c# - 自托管 Web 服务将无法运行
- laravel - 如何在 lighthouse-php 中使用 @method 指令正确地提供自定义查询?
- apache-spark - 如何在 Parquet 模式中有效地表示集合成员资格或其他二进制属性?
- iot - IOT FW 更新流程 - Azure IOT vs Google IOT
- python - 如何使用嵌套的for循环在[]内打印列表
- forms - 要形成的文本解析器
- python-3.x - FindAll bs4 没有找到任何东西
- transition - 在 AnyLogic 中触发动作从一个代理到另一个代理
- ckeditor5 - CKEditor5 和 CKFinder 图像 URL
- heroku - “错误代码=H10”是什么意思,我该如何解决