C - 使用AES加密和解密字符串

时间:2018-05-09 13:32:22

标签: javascript c api encryption aes

我正在尝试了解如何使用this c library tiny-AES-c )。作为Web开发人员,我希望获得this JS fiddle的等效C代码。

JS代码很简单:

// Encrypt
var ciphertext = CryptoJS.AES.encrypt('my message', 'secret key 123');


console.log("Encrypted: " + ciphertext.toString());

// Decrypt
var bytes  = CryptoJS.AES.decrypt(ciphertext.toString(), 'secret key 123');
var plaintext = bytes.toString(CryptoJS.enc.Utf8);

console.log("Decrypted: " + plaintext);

给定加密消息和密码,代码生成加密数据并将结果转换为字符串。

我的C代码:

int main()
{
    uint8_t in[]  = "my message";
    uint8_t key[] =  "secret key 123";

    struct AES_ctx ctx;

    AES_init_ctx(&ctx, key);
    printf("ORIG: %s",(char*) in);

    // Encrypt
    AES_ECB_encrypt(&ctx, in);
    printf("\nENC: %s",(char*) in);

    // Decrypt
    AES_ECB_decrypt(&ctx, in);
    printf("\nDEC: %s",(char*) in);

    return 0;
}

输出:

ORIG: my message
ENC: ̤�+��5<n]EYK�ظ/����
DEC: my message%  

我知道我不应该尝试将结果打印为字符串,但无法弄清楚如何使用 tiny-AES-c 获得类似(对JS)的结果API,当我尝试使用更长的消息时,我得到了奇怪的结果,导致我认为我使用这个库是错误的。

:与上述JS等效的C代码是什么?

3 个答案:

答案 0 :(得分:0)

create_app

你的缓冲区需要是16的倍数。

答案 1 :(得分:0)

我是您参考的AES库的原作者。

使用ECB和CBC操作模式时,需要确保键,iv和输入/输出块都是16字节长。您还需要确定要使用的填充方案。

您可以使用CTR模式来避免填充并停止担心块大小。这通常使AES算法更容易使用,因为要处理的边缘情况较少。

BTW这也在项目自述文件中说明:

  

没有提供填充,因此对于CBC和ECB,所有缓冲区应该是16字节的多个缓冲区。对于填充PKCS7是值得推荐的。

     

对于大多数用途,ECB模式被认为是不安全的,并且未在流模式下实施。如果需要此模式,请为需要加密的每个16字节块调用该函数。有关详细信息,请参阅维基百科关于欧洲央行的文章。

编辑:

如果你扩展你的数组,使它们长16个字节,并对它们进行零填充(或者,将它们声明为静态,这样它们将自动进行零初始化),我认为它应该适用于你:)

答案 2 :(得分:0)

正如@Morten Jensen建议的那样,您可以使用点击率模式IE:Error:PANIC: Broken AVD system path. Check your ANDROID_SDK_ROOT value [/root/Downloads/sdk-tools:/root/flutter/bin:/root/anaconda3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin]!

AES_CTR_xcrypt_buffer

请记住,打印加密数据是错误的,如果你想匹配你的JS示例,你应该检查输出并将其转换为base64。