我正在尝试了解如何使用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代码是什么?
答案 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。