当前位置: 首页 > 知识库问答 >
问题:

AES CTR OpenSSL命令行与EVP_AES_128_CTR C代码不匹配

罗淮晨
2023-03-14

CTR-AES256加密不匹配OpenSSL-AES-256-ctr

我尝试了以下用于AES-128-CTR加密的Openssl EVP函数的C实现,但与命令行Openssl结果相比,我得到的结果不正确。

奇怪的是,当我尝试使用较大大小的明文(600字节或更多)时,C代码和命令行之间只有最后600字节的密码不同。如果需要,我也可以将结果粘贴到这里。

AES-128-CTR的C代码实现

static const unsigned char key[16] = {
    0x00, 0x01, 0x02, 0x03, 
    0x04, 0x05, 0x06, 0x07, 
    0x08, 0x09, 0x0a, 0x0b, 
    0x0c, 0x0d, 0x0e, 0x0f, 
};

static const unsigned char iv[16] = {
    0x01, 0x23, 0x45, 0x67, 
    0x89, 0xab, 0xcd, 0xef, 
    0x88, 0x88, 0x88, 0x88, 
    0xC0, 0x00, 0x00, 0x00, 
};

FILE *fp_output = fopen("cipherCode.bin", "wb");

// Encrypt Plaintext

EVP_CIPHER_CTX *ctx;
int outlen;
unsigned char cipher[size];

if(!(ctx = EVP_CIPHER_CTX_new())) handleErrors();

if(!(EVP_EncryptInit_ex(ctx, EVP_aes_128_ctr(), NULL, key, iv))) handleErrors();

if(!(EVP_EncryptUpdate(ctx, cipher, &outlen, plaintext, size))) handleErrors();

if(!(EVP_EncryptFinal_ex(ctx, cipher + outlen, &outlen))) handleErrors();

/*---Edit----

// EVP_CIPHER_CTX_set_padding(ctx, 0); <-- removed this as it isnt necessary 

-----------*/

EVP_CIPHER_CTX_free(ctx);

// Write result cipher into output file
fwrite((unsigned char *)&cipher[0], outlen, 1, fp_output);
fclose(fp_output);

OpenSSL命令行:

openssl enc -aes-128-ctr -in plaintext.bin -out cipherCL.bin -K 000102030405060708090a0b0c0d0e0f -iv 0123456789abcdef88888888c0000000 -p -nopad

相同的明文,键和IV用于两者。

输入:

Plaintext:

0000000 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff

输出:

Hexdiff(为清楚起见缩写):

Visuel HexDiff v 0.0.53 by tTh 2007                             dec   7bits  

0   00 00 00 00 00 00 00 00 10 90 66 01 00 00 00 00              f     

** cipherCode.bin                                    16        0   0%      

0   1e a4 43 3f d8 4c 8c b7 1a e7 f0 af 85 0c d2 c2      C? L

** cipherCL.bin                                   16        0   0%      

共有2个答案

史骏祥
2023-03-14

我建议你使用这个免费的AES库链接

它是用c编写的AES ECB、CTR和CBC加密算法的小型便携式实现。它包含了你需要的一切,而且非常简单。顺便说一句,您可以通过在esi. h定义符号AES192或AES256,用192或256位覆盖默认的128位密钥大小。

郎宣
2023-03-14

我在我的程序中发现了这个问题。我没有将密码变量定义为静态变量。现在我将其定义为静态,正确的密码数据将写入该文件。

为什么静电起作用?我调用了一个加密函数来计算密码,然后返回密码。由于密码未声明为静态,因此退出函数后会丢失其值,因此返回的数据与密码中的数据不同。将cipher声明为静态后,函数调用后保留cipher的值,并在文件中写入正确的信息。

 类似资料:
  • 问题内容: 我想直接在命令行执行单个php语句,而不必使用单独的php文件。 这怎么可能 ? 问题答案: 如果您要在命令行中使用PHP,建议您安装 phpsh,这是一个不错的PHP shell。这很有趣。 无论如何,php命令提供了 两个开关来从命令行执行代码 : 您可以这样使用php的 -r开关 : 上面的PHP命令应该 输出 并 返回, 如您所见: 另一个有趣的开关是 php -a : 与 p

  • 我没有得到“你好”:请想知道为什么和做什么

  • 我遵循以下指示https://code.visualstudio.com/docs/setup/mac但我没有成功。这就是我进去时发生的事情 我得到了以下信息: 我还查找了以下问题:如何在OSX上从命令行打开Visual Studio代码?,这没用。 我在VSCode中只有一个终端选项,zsh。

  • 我正在尝试调试我的Android应用程序。当调试器到达view.java文件时,我会收到“源代码与字节码不匹配”的消息。我可以看到调试器在文件的错误部分。有人知道怎么修吗? 我正在Android10(API29)设备上调试。在Android Studio首选项->外观和行为->系统设置->Android SDK中,我已经确保所有内容都是最新的。我还多次清理和重建,删除缓存,重新启动Android

  • 我的应用程序崩溃了,我的设备上有一个NPE。在使用ACRA接收的堆栈跟踪中,行号引用了两个源代码类和。对于,没有一个行号与任何源代码版本中的行号匹配。我的设备没有自定义ROM。这是一款运行Android4.03的Galaxy S2。 下面是堆栈跟踪: 如果查看不同版本的源代码,您可以自己检查数字是否匹配。 例如,在Android4.03的源代码中,位于第1892行,而我的堆栈跟踪显示它位于第202

  • 命令“code”。在这本手册里不起作用? 之前的所有其他步骤都奏效了。如何调用OSX终端中的Visual Studio代码?