JavaScript AES 256解密用C加密的数据时出现问题

JavaScript AES 256解密用C加密的数据时出现问题,javascript,c,encryption,aes,Javascript,C,Encryption,Aes,当我使用tiny-AES-C库()在C中进行AES-256 CTR加密时,我无法在JavaScript中正确解密它。 对于JavaScript解密,我使用库 在加密之后,我进行Base64编码,在解密之前,Base64解码,这部分工作正常 在下面的字段中,您可以看到我的C和JavaScript代码: C代码 //AES启动 结构AES_ctx ctx; uint8_t enc_buf[32]; uint8_t iv[16]= {0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6

当我使用tiny-AES-C库()在C中进行AES-256 CTR加密时,我无法在JavaScript中正确解密它。 对于JavaScript解密,我使用库

在加密之后,我进行Base64编码,在解密之前,Base64解码,这部分工作正常

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

C代码

//AES启动
结构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键[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测试结构尺寸=32;
AES_init_ctx_iv(&ctx,key,iv);
for(无符号整数i=0;i
JavaScript

var key=[96,61235,16,21202113190,4311517424013312119129,31,53,44,7,59,97,8215,45152,16163,9,20223244];
var encryptedBytes=aesjs.utils.hex.toBytes(ascii_到_hexa(parsedStr));
var aesCtr=新aesjs.ModeOfOperation.ctr(键,新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];
变量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=新aesjs.ModeOfOperation.ctr(键,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
。这相当于传递新的aesjs.计数器(iv)


还要注意的是,您不应该在CTR模式下重复使用IV。每个数据包都应该是一个随机的nonce,因此不可能发生已知的明文攻击。

该问题缺少一个问题和一个错误描述。默认情况下,tiny-AES-c使用128位加密。你把它改成256位了吗?您还需要将IV作为参数传递给aesjs.Counter。是的,我已将tiny-AES-c库中的加密更改为256,并使用在线EAS256加密进行验证。我已经将正确的IV作为aesjs的参数(正如您可以看到的,它是31,就像在C代码中一样),但是没有运气得到与tiny-AES-C相同的结果。与C相比,我的代码中的IV设置是否正确?你是设法做到的还是有一些例子?谢谢。@您需要将整个IV数组作为初始值传递给aesjs.Counter。它需要一个数字(我不知道为什么在你的例子中是31)或一个16字节的数组。对于一个数字,所有前导字节都被设置为零。@AlexSkalozub很抱歉,我没有为IV输入正确值的代码。现在我已经编辑了它。它被设置为240(f0),类似于C代码。可以吗?请告诉我在这种情况下我应该注射什么样的静脉。谢谢,耶,啊!!谢谢!!你救了我。请看看你是否能帮我解决这个问题:@Embedded对不起,我不知道。JS库不是我的专长。