【问题标题】:AES GCM/CTR same outputAES GCM/CTR 相同的输出
【发布时间】:2015-12-02 21:57:52
【问题描述】:

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

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 的代码:

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、密钥、明文生成不同的密码。那么为什么在 GCM 模式下密文是一样的呢?

【问题讨论】:

  • 你为什么不期望用相同的密钥和 IV 加密相同的明文来产生相同的值呢?您想将明文作为第二个块重复吗?
  • 是的。我希望数据可以重复。而且据我所知,我的安全性不会被破坏,密码必须不同

标签: c++ c encryption openssl aes


【解决方案1】:

如果您使用相同的输入运行算法两次,您将获得相同的输出。如果您想多次加密相同的明文而不让攻击者看到它是相同的,请使用不同的 IV。如果你想在明文中重复一个块并且不让攻击者推断出模式,你不想重新启动。请注意,在有效的示例中,您在调用EVP_EncryptUpdate() 之前调用了EVP_EncryptInit_ex()之前,而在无效的示例中,您再次调用了EVP_EncryptInit_ex()之间 em> 他们。

【讨论】:

  • 好的,我删除了“EVP_EncryptInit_ex”和“EVP_CIPHER_CTX_ctrl”行。但结果是一样的。所以我需要加密我的打包数据。据我了解,我可以使用 EVP_aes_256_ctr 做我想做的事或使用 GCM,但为每个数据包设置新的 IV?
  • 在初始化ctx 一次后多次调用EVP_EncryptUpdate()。一些示例代码:wiki.openssl.org/index.php/…
  • 所以我应该在不验证标签的情况下使用它吗? EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, 16, outbuf) 在encrypt_final之后调用
  • 解密时应验证标签。在EVP_EncryptInit_ex() 之后但在EVP_DecryptUpdate() 之前调用EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, taglen, tag);
猜你喜欢
  • 2019-07-06
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
  • 2020-08-13
  • 2015-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多