首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AES GCM/CTR相同输出

AES GCM/CTR相同输出
EN

Stack Overflow用户
提问于 2015-12-02 21:57:52
回答 1查看 1.2K关注 0票数 0

我在试着用AES-GCM。我的加密代码是有效的,但是当我试图用相同的IV和密钥加密相同的纯文本时,我得到了相同的结果。我的GCM代码:

代码语言:javascript
复制
EVP_CIPHER_CTX *ctx;
int outlen, tmplen;
unsigned char outbuf[1024];
ctx = EVP_CIPHER_CTX_new();
EVP_EncryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, NULL, NULL);
EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, sizeof(gcm_iv), NULL);
EVP_EncryptInit_ex(ctx, NULL, NULL, gcm_key, gcm_iv);
EVP_EncryptUpdate(ctx, NULL, &outlen, gcm_aad, sizeof(gcm_aad));
EVP_EncryptUpdate(ctx, outbuf, &outlen, gcm_pt, sizeof(gcm_pt));
printf("Ciphertext:\n");
BIO_dump_fp(stdout, outbuf, outlen);
EVP_EncryptFinal_ex(ctx, outbuf, &outlen);
EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, 16, outbuf);

printf("\n\n\n");

EVP_EncryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, NULL, NULL);
EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, sizeof(gcm_iv), NULL);
EVP_EncryptInit_ex(ctx, NULL, NULL, gcm_key, gcm_iv);
EVP_EncryptUpdate(ctx, NULL, &outlen, gcm_aad, sizeof(gcm_aad));
EVP_EncryptUpdate(ctx, outbuf2, &outlen2, gcm_pt, sizeof(gcm_pt));
printf("Ciphertext:\n");
BIO_dump_fp(stdout, outbuf2, outlen2);
EVP_EncryptFinal_ex(ctx, outbuf2, &outlen2);
EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, 16, outbuf2);
EVP_CIPHER_CTX_free(ctx);

如果在第二次加密中,我将删除init_ex、ctx_ctrl等,那么我的密文将是一个空字符串。

但是如果我使用EVP_aes_256_ctr,那么下一次加密将给我提供新的密文。EVP_aes_256_ctr代码:

代码语言:javascript
复制
EVP_CIPHER_CTX *ctx;
int outlen, tmplen;
unsigned char outbuf[1024];
ctx = EVP_CIPHER_CTX_new();
EVP_EncryptInit_ex(ctx, EVP_aes_256_ctr(), NULL, NULL, NULL);
EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, sizeof(gcm_iv), NULL);
EVP_EncryptInit_ex(ctx, NULL, NULL, gcm_key, gcm_iv);
EVP_EncryptUpdate(ctx, outbuf, &outlen, gcm_pt, sizeof(gcm_pt));
BIO_dump_fp(stdout, outbuf, outlen);
EVP_EncryptFinal_ex(ctx, outbuf, &outlen);

printf("\n\n\n");

EVP_EncryptUpdate(ctx, outbuf, &outlen, gcm_pt, sizeof(gcm_pt));
printf("Ciphertext:\n");
BIO_dump_fp(stdout, outbuf, outlen);
EVP_EncryptFinal_ex(ctx, outbuf, &outlen);
EVP_CIPHER_CTX_free(ctx);

据我所知,这两种模式都在计数器模式下工作,因此计数器将为相同的IV、Key、明文生成不同的密码器。那么为什么在GCM模式下密码文本是一样的呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-03 10:39:56

如果您使用相同的输入运行该算法两次,您将得到相同的输出。如果您想对同一个明文进行多次加密,而不让攻击者看到它是相同的,请使用不同的IV。如果希望在明文中重复一个块,而不让攻击者推断模式,则不希望重新启动。注意,在工作的示例中,在调用EVP_EncryptInit_ex()之前调用了EVP_EncryptUpdate(),而在没有调用的示例中,在它们之间又调用了EVP_EncryptInit_ex()

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

https://stackoverflow.com/questions/34053868

复制
相关文章

相似问题

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