完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
ChaCha20-Poly1305是Google所采用的一种新式加密算法,性能强大,在CPU为精简指令集的ARM平台上尤为显著(ARM v8前效果较明显),在同等配置的手机中表现是AES的4倍。
Chacha20需要用到的代码可以分别从以下链接获取到: https://cr.yp.to/streamciphers/timings/estreambench/submissions/salsa20/chacha20/merged/chacha.c https://cr.yp.to/streamciphers/timings/estreambench/submissions/salsa20/chacha20/ref/ecrypt-sync.h https://cr.yp.to/snuffle/ecrypt-config.h https://cr.yp.to/snuffle/ecrypt-machine.h https://cr.yp.to/snuffle/ecrypt-portable.h 上述5个文件,一个字母都不用动。直接放入工程编译就可以。 测试代码如下: #include #include “ecrypt-sync.h” int main(int argc, char* argv[]) { ECRYPT_ctx chacha; int i, j, index; u8 iv[] = {0, 0, 0, 0, 0, 0, 0, 0}; u8 key[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; u8 plaintext[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; u8 ciphertext[64] = {}; u8 plaintext_new[64] = {}; printf(“Test begin…rn”); ECRYPT_keysetup(&chacha, key, sizeof(key) * 8, 64); ECRYPT_ivsetup(&chacha, iv); index = 0; unsigned char* temp = (unsigned char*)&chacha; for (i = 0; i < 64; i++) { printf("%02X “, temp); } printf(”rnrn"); ECRYPT_encrypt_bytes(&chacha, plaintext, ciphertext, sizeof(plaintext)); index = 0; for (i = 0; i < 8; i++) { for (j = 0; j < 8; j++) { printf("%02X “, ciphertext[index]); index++; } printf(”rn"); } printf("rn"); ECRYPT_keysetup(&chacha, key, sizeof(key) * 8, 64); ECRYPT_ivsetup(&chacha, iv); ECRYPT_decrypt_bytes(&chacha, ciphertext, plaintext_new, sizeof(ciphertext)); for (i = 0; i < 8; i++) { for (j = 0; j < 8; j++) { printf("%02X “, plaintext_new[i * 8 + j]); } printf(”rn"); } return 0; } 删除打印,初始化测试数据的代码: ECRYPT_keysetup(&chacha, key, sizeof(key) * 8, 64); ECRYPT_ivsetup(&chacha, iv); ECRYPT_encrypt_bytes(&chacha, plaintext, ciphertext, sizeof(plaintext)); ECRYPT_keysetup(&chacha, key, sizeof(key) * 8, 64); ECRYPT_ivsetup(&chacha, iv); ECRYPT_decrypt_bytes(&chacha, ciphertext, plaintext_new, sizeof(ciphertext)); Key:32个字节,这个使用根秘钥。 IV:8个字节,使用随机产生的。按要求,每次被加密数据变化,就应该变化一次。 重点:因为函数的第一个参数是上下文,64个字节的数据块,这个是每次计算都会变化的,不能将这个上下文直接用来解密,或者再加密。每次加密,或者每次解密前必须重新设置key和iv(除非你明确要进行“流式加密”) 明文多长,密文就多长。同时加密用的IV要和密文一并存放(分开存放,或者和密文合并存放,都行。因为解密时可用) 性能:在ATMEGA256 16MHz的AVR单片机(8bit)计算性能如下: ChaCha20 256-bit Encrypt … 17.67us per byte, 56582.29 bytes per second ChaCha20 256-bit Decrypt … 17.68us per byte, 56563.08 bytes per second 因为chacha解密就是“再加密一次”,所以加解密性能一样。16Mhz单片机,大概每秒可计算56KB。所以,在门锁的M0,48Mhz上应该性能会更好。(而且chacha的计算是针对ARM指令集设计的,不知道会不会更快) 这个性能应该足够使用。建议:每个密码独立存放,这样就只要计算64byte(因为chacha是按64byte块计算,虽然只有1个字节,也要计算64bytes) |
|
|
|
只有小组成员才能发言,加入小组>>
2514 浏览 0 评论
1092浏览 2评论
703浏览 1评论
456浏览 0评论
200浏览 0评论
340浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 08:18 , Processed in 1.240155 second(s), Total 79, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号