【发布时间】:2020-01-26 11:23:01
【问题描述】:
当我使用 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 之间兼容的库?
提前谢谢你。
【问题讨论】:
-
该问题缺少一个问题和一个错误描述。
-
tiny-AES-c 默认使用 128 位加密。您是否已将其更改为 256 位?您还需要将您的 IV 作为参数传递给 aesjs.Counter。
-
是的,我在 tiny-AES-c 库中将加密更改为 256,并通过在线 EAS256 加密进行了验证。我已将正确的 IV 作为 aesjs 的参数(如您所见,它是 31,就像在 C 代码中一样),但没有运气获得与 tiny-AES-c 相同的结果。与 C 相比,我的代码中的 IV 设置是否正确?您是否设法做到了或有一些例子?谢谢。
-
@Embedded 您需要将整个 IV 数组作为初始值传递给 aesjs.Counter。它需要一个数字(我不知道为什么在你的情况下是 31)或一个 16 字节数组。如果是数字,所有前导字节都设置为零。
-
@AlexSkalozub 抱歉,我没有为 IV 输入正确值的代码。现在我已经编辑了它。与 C 代码一样,它被设置为 240 (f0)。那样可以么?请告诉我在这种情况下我应该设置什么 IV。谢谢。
标签: javascript c encryption aes