给定适当的key和iv,这个C程序应该加密stdin,输出到stdout。
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
EVP_EncryptInit(ctx, EVP_aes_256_gcm(), key, iv);
const size_t block_size = 128;
unsigned char inbuf[block_size];
unsigned char outbuf[block_size + EVP_MAX_BLOCK_LENGTH];
int inlen, outlen;
for (;;)
{
inlen = fread(inbuf, 1, block_size, stdin);
if (inlen <= 0)
break;
EVP_EncryptUpdate(ctx, outbuf, &outlen, inbuf, inlen)
fwrite(outbuf, 1, outlen, stdout);
}
EVP_EncryptFinal_ex(ctx, outbuf, &outlen)
fwrite(outbuf, 1, outlen, stdout);(删除错误检查以求简洁。)
我正在通过运行
openssl aes-256-gcm -in ciphertext.txt -K <key> -iv <iv> -d
这成功且可靠地解密了密文,但随后写入了坏解密,例如
$ openssl aes-256-gcm ...
Hello World.
bad decrypt会有什么不对导致它这么说?
发布于 2017-11-22 01:19:37
在加密之后,我完全无法获得GCM身份验证标记,然后在解密期间提供它。
“坏解密”消息具有误导性--解密进行得很好,但是没有提供提供身份验证的标记。
在调用EVP_EncryptFinal_ex之后,可以在
unsigned char *tag = malloc(TAGSIZE);
EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, TAGSIZE, tag);TAGSIZE是标记的字节大小,可以是许多不同的值。这一点在维基百科和其他地方都有讨论。
发布于 2017-11-15 19:23:01
这里的问题是,您没有按照PKCS#7的要求实现适当的填充。openssl期望解码消息中存在正确的填充。规则如下:
现在使用AES-256,您的块大小为128位(16字节)。这意味着,您必须添加1-16填充字节。要添加的填充字节总是填充的大小,因此如果必须添加9个字节的填充,则需要添加9个0x09字节。
如果正确地将此填充添加到原始明文中,则openssl应停止对解密的抱怨。
https://stackoverflow.com/questions/47314544
复制相似问题