2015-12-02 38 views
0

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

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); 

我的理解这两种模式在计数器模式下工作,所以计数器会做出不同的cyphers为同一IV,重点,明文。那么为什么在GCM模式下密文是一样的呢?

+1

为什么不期望用相同的密钥和IV来加密相同的明文以产生相同的值?你想重复明文作为第二个块吗? – Davislor

+0

是的。我预计数据会重复。正如我理解我的安全不会被破坏密码必须不同 – user2123079

回答

1

如果您使用相同的输入运行两次算法,您将得到相同的输出。如果要多次加密相同的明文,而不是让攻击者看到它是相同的,请使用不同的IV。如果要在明文中重复一个块并且不让攻击者推断该模式,则不需要重新启动。请注意,在该示例中,如果您的电话号码EVP_EncryptInit_ex()之前您的电话号码为EVP_EncryptUpdate(),并且在没有的示例中,您再次调用EVP_EncryptInit_ex()之间的他们。

+0

好吧,我删除了“EVP_EncryptInit_ex”和“EVP_CIPHER_CTX_ctrl”行。但结果是一样的。 所以我需要加密我的分组数据。据我了解,我可以使用EVP_aes_256_ctr做我想要的或使用GCM,但每个数据包设置新的IV? – user2123079

+0

初始化'ctx'一次后多次调用'EVP_EncryptUpdate()'。一些示例代码:https://wiki.openssl.org/index.php/EVP_Authenticated_Encryption_and_Decryption#Authenticated_Decryption_using_GCM_mode – Davislor

+0

所以我应该使用它而不验证标签? EVP_CIPHER_CTX_ctrl(ctx,EVP_CTRL_GCM_GET_TAG,16,outbuf)在encrypt_final之后调用 – user2123079