javascript - JavaScript AES 256 解密 C 加密数据的问题

标签 javascript c encryption aes

当我使用 tiny-AES-c 库 ( https://github.com/kokke/tiny-AES-c ) 在 C 中进行 AES-256 CTR 加密时,我无法解密它在 JavaScript 中正确。 对于 JavaScript 解密,我使用库 https://github.com/ricmoo/aes-js

加密后我进行 Base 64 编码,解密前进行 Base 64 解码,该部分工作正常。

在下面的字段中,您可以看到我的 C 和 JavaScript 代码:

C代码

// AES start
struct AES_ctx ctx;
uint8_t enc_buf[32];
uint8_t iv[16] = 
    {0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff};
uint8_t key[32] = 
    {0x60,0x3d,0xeb,0x10,0x15,0xca,0x71,0xbe,0x2b,0x73,0xae,0xf0,0x85,0x7d,0x77,0x81,0x1f,0x35,0x2c,0x07,0x3b,0x61,0x08,0xd7,0x2d,0x98,0x10,0xa3,0x09,0x14,0xdf,0xf4};
uint8_t test_str[32] = { 0, };
uint8_t test_str_size = 32;

AES_init_ctx_iv(&ctx, key, iv);

for (unsigned int i = 0; i < test_str_size; i++) {
    test_str[i] = 'A';
}

for (unsigned int i = 0; i < test_str_size / 32; i++) {
    memcpy(enc_buf, test_str + i * 32, 32);
    AES_CTR_xcrypt_buffer(&ctx, enc_buf, 32);
}
// AES end

JavaScript

var key = [96,61,235,16,21,202,113,190,43,115,174,240,133,125,119,129,31,53,44,7,59,97,8,215,45,152,16,163,9,20,223,244];

var encryptedBytes = aesjs.utils.hex.toBytes(ascii_to_hexa(parsedStr));
var aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(240));
var decrypted = aesCtr.decrypt(encryptedBytes);
console.log('%c AES decrypted: ', 'color: blue', decrypted.toString());

我无法解密原始数据。

谁能帮我解决这个问题吗?是否有已知的 C 和 JavaScript 兼容的库?

提前谢谢您。

最佳答案

您需要传递整个 IV 作为初始计数器值:

var key = [0x60,0x3d,0xeb,0x10,0x15,0xca,0x71,0xbe,0x2b,0x73,0xae,0xf0,0x85,0x7d,0x77,0x81,0x1f,0x35,0x2c,0x07,0x3b,0x61,0x08,0xd7,0x2d,0x98,0x10,0xa3,0x09,0x14,0xdf,0xf4];
var iv = [0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff];
var parsedStr = '4a9e3cb0185657721fdbca54892184431b2f28dc122058471572c77dce243ad5';

var encryptedBytes = aesjs.utils.hex.toBytes(parsedStr);
var aesCtr = new aesjs.ModeOfOperation.ctr(key, iv);
var decrypted = aesCtr.decrypt(encryptedBytes);
console.log('%c AES decrypted: ', 'color: blue', decrypted.toString());

输出:

[Log]  AES decrypted:  – "65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65" (_display, line 40)

请注意,如果您不传递 aesjs.Counter 类型的对象,它会根据给定值自动创建 aesjs.Counter 。它相当于传递new aesjs.Counter(iv)

另请注意,您不应将 IV 重复用于 CTR 模式。它应该是每个数据包的随机数,因此不可能有已知的明文攻击。

关于javascript - JavaScript AES 256 解密 C 加密数据的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59917834/

相关文章:

javascript - php、mysql使用jquery动态下拉列表

javascript - 使用变量作为多级 json 对象中的键

javascript - 在将函数定义为 Object.prototype 扩展或只是函数之前要考虑什么?

android - 问题外包RSA加解密

javascript - 检测 Youtube 搜索事件

c - 这个旧的 C 指针数学/宏的东西在做什么?

C 根据优化级别给出不同的输出(新示例)

javascript - 为什么 bigInt 在计算时给出不同的结果。 pow() (使用 npm 大整数)?如何解密给定的数字?

C++ 简单加密

c - 是否可以匹配 make 文件中的集?