C-tiny-aes-C和Javascript CryptoJS互操作性

C-tiny-aes-C和Javascript CryptoJS互操作性,javascript,c,node.js,aes,cryptojs,Javascript,C,Node.js,Aes,Cryptojs,使用。考虑下面的C代码: int main(int argc, char const *argv[]) { uint8_t key[6] = { 's','e','c','r','e','t' }; uint8_t iv[16] = { 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff }; uint8_t in[6] = {

使用。考虑下面的C代码:

int main(int argc, char const *argv[])
{
    uint8_t key[6] = { 's','e','c','r','e','t' };
    uint8_t iv[16]  = { 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff };

    uint8_t in[6]  = { 'm','e','s','a','g','e'};

    uint8_t out[6] = {0x17, 0x8d, 0xc3, 0xa1, 0x56, 0x34};
    struct AES_ctx ctx;

    AES_init_ctx_iv(&ctx, key, iv);
    AES_CTR_xcrypt_buffer(&ctx, in, 6);    

    printf("idx\t encrypted\t expected");
    for(int i=0 ; i<6 ; i++){
        printf("\n[%i]\t %.2x\t\t %.2x" , i , in[i], out[i]);
    }

    return 0;
}
我有另一个服务,一个使用的NodeJS服务器。
我的问题是:如何转换C结果(
{0x17,0x8d,0xc3,0xa1,0x56,0x34}
),使其与CryptoJS可以处理的内容匹配


编辑: 详细说明一下。在本讨论中,C结果通过网络传输,因此应将其转换为字符串。据我所知,CryptoJS使用base64作为其AES方法的输入,解密为字节,以后可以转换为纯文本:

var bytes  = CryptoJS.AES.decrypt(BASE_64_STRING, SECRET);
var plaintext = bytes.toString(CryptoJS.enc.Utf8);
使用CryptoJS对同一消息+机密进行加密的结果为:
U2FsdGVkX1/tayuifnxczc76zb+sd8ol+2DfKCkwITfY=
(),每次运行时都会发生更改

更新2:
感谢@MDTech.us_MAN answer,我对JS和C代码都做了一些更改,但仍然缺少一个谜题图片

C:

解密的结果:
a47172dfe151c7
而不是预期的结果“message”


我错过了什么?

你在做两件事

  • 加密
  • 转换为base64
  • 在接收时,您必须按照发送前应用的相反顺序,对这两个进行反向操作

  • 从base64转换
  • 解密
  • 您也可以交换步骤的顺序,但是必须在发送端和接收端交换顺序


    还要确保双方的机密格式相同。

    您应该更仔细地阅读CryptoJS文档。默认情况下,它使用CBC模式进行加密,因此您应该更改您的微型AES实现以使用该模式

    CryptoJS支持以下模式:

    • CBC(默认值)
    还请注意,CryptoJS在默认情况下启用了填充,而tiny AES根本没有。因此,消息必须是16的倍数。(或者您可以手动使用自己的填充实现)

    没有提供填充,因此对于CBC和ECB,所有缓冲区都应该是16字节的多重缓冲区。对于填充,建议使用PKCS7

    然后,请注意CryptoJS会根据密钥大小自动选择AES变量:

    CryptoJS支持AES-128、AES-192和AES-256。它将根据您传入的密钥的大小拾取变体。如果使用密码短语,则它将生成256位密钥

    <>你必须考虑你的AES代码中的所有这些因素。

    < P>谢谢@ MtTyc.Usman,我找到了一个解决方案,在修复了模式和填充之后,不同的是我在JS端解析秘密的方式。在以下示例中,机密被解析为十六进制字符串:

    const CryptoJS = require("crypto-js");
    let iv = CryptoJS.enc.Hex.parse('f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff'); // 16 Bytes
    let secret = CryptoJS.enc.Hex.parse('73656372657473656372657431323334'); // 16 Bytes == "secretsecret1234"
    let message = CryptoJS.AES.decrypt("y6nVvIQRPA==", secret, { iv: iv, mode: CryptoJS.mode.CTR, padding: CryptoJS.pad.NoPadding });
    console.log(message.toString(CryptoJS.enc.Utf8)); // -> message
    

    CryptoJS
    可以处理哪种类型?你是如何得到C结果的?以什么形式?我不清楚你的问题。请看我的编辑:)我现在想到的最简单的解决方案是在base64中传输C结果。如果C部分无法更改,则使用十六进制,然后转换为base64。我尝试过,但是cryptoJS的输出比我得到的长。感谢您的回复,但是转换为base64会在C端给我一个短字符串比什么短?base64字符串的长度应该是原始字符串长度的4/3倍。比cryptoJS结果短,所以它不能被解析回来。查看我的js提琴。请参阅“自定义键和IV”部分。它描述的是加密,但解密也可能是一样的。对不起,如果我太霸道了,但我的回答对你有帮助吗?当然,对不起。。。我忘了
    int main(int argc, char const *argv[])
    {
        uint8_t key[16] = { 's','e','c','r','e','t','s','e','c','r','e','t','1','2','3','4' };
        uint8_t iv[16]  = { 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff };
        uint8_t in[7]  = { 'm','e','s','s','a','g','e'};
    
        struct AES_ctx ctx;
    
        AES_init_ctx_iv(&ctx, key, iv);
        AES_CTR_xcrypt_buffer(&ctx, in, 7);
    
        printf("Encrypted: ");
        for(int i=0 ; i<7 ; i++){
            printf("%.2x" , in[i]);
        }
    
        return 0;
    }
    
    const CryptoJS = require("crypto-js");
    let iv = CryptoJS.enc.Hex.parse('f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff'); // 16 Bytes (same as the C code)
    let message = CryptoJS.AES.decrypt("y6nVvIQRPA==", "secretsecret1234", { iv: iv, mode: CryptoJS.mode.CTR, padding: CryptoJS.pad.NoPadding });
    console.log(message.toString());
    
    const CryptoJS = require("crypto-js");
    let iv = CryptoJS.enc.Hex.parse('f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff'); // 16 Bytes
    let secret = CryptoJS.enc.Hex.parse('73656372657473656372657431323334'); // 16 Bytes == "secretsecret1234"
    let message = CryptoJS.AES.decrypt("y6nVvIQRPA==", secret, { iv: iv, mode: CryptoJS.mode.CTR, padding: CryptoJS.pad.NoPadding });
    console.log(message.toString(CryptoJS.enc.Utf8)); // -> message