首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用(LibreSSL) libcrypto的AES-256-GCM加密

使用(LibreSSL) libcrypto的AES-256-GCM加密
EN

Stack Overflow用户
提问于 2017-11-15 18:14:59
回答 2查看 1.9K关注 0票数 4

给定适当的keyiv,这个C程序应该加密stdin,输出到stdout

代码语言:javascript
复制
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

这成功且可靠地解密了密文,但随后写入了坏解密,例如

代码语言:javascript
复制
$ openssl aes-256-gcm ...
Hello World.
bad decrypt

会有什么不对导致它这么说?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-22 01:19:37

在加密之后,我完全无法获得GCM身份验证标记,然后在解密期间提供它。

“坏解密”消息具有误导性--解密进行得很好,但是没有提供提供身份验证的标记。

调用EVP_EncryptFinal_ex之后,可以在

代码语言:javascript
复制
unsigned char *tag = malloc(TAGSIZE);
EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, TAGSIZE, tag);

TAGSIZE是标记的字节大小,可以是许多不同的值。这一点在维基百科和其他地方都有讨论。

票数 2
EN

Stack Overflow用户

发布于 2017-11-15 19:23:01

这里的问题是,您没有按照PKCS#7的要求实现适当的填充。openssl期望解码消息中存在正确的填充。规则如下:

  • 必须始终至少有1字节的填充
  • 它必须填充到密码的块大小

现在使用AES-256,您的块大小为128位(16字节)。这意味着,您必须添加1-16填充字节。要添加的填充字节总是填充的大小,因此如果必须添加9个字节的填充,则需要添加9个0x09字节。

如果正确地将此填充添加到原始明文中,则openssl应停止对解密的抱怨。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47314544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档