当前位置:   article > 正文

C++的AES及ECC加解密_aes ecc

aes ecc

目录

前言

一、术语

二、对称加密

1. AES

2.加密使用

三、非对称加密

1. ECC

2.加密使用

总结

前言

主要讲解对称加解密AES-256、以及非对称加密ECC

一、术语

两个常用动词:

加密:cipher 或者 encrypt
解密:decipher 或者 decrypt


另外有几个名词有必要解释:

cipher: 指用于加解密的「密码算法」,有时也被直接翻译成「密码」
cryptographic algorithm: 密码学算法,泛指密码学相关的各类算法
ciphertext: 密文,即加密后的信息。对应的词是明文 plaintext
password: 这个应该不需要解释,就是我们日常用的各种字符或者数字密码,也可称作口令。
passphrase: 翻译成「密码词组」或者「密码片语」,通常指用于保护密钥或者其他敏感数据的一个 password
如果你用 ssh/gpg/openssl 等工具生成或使用过密钥,应该对它不陌生。
在密码学里面,最容易搞混的词估计就是「密码」了,cipher/password/passphrase 都可以被翻译成「密码」,需要注意下其中区别。

二、对称加密

对称加密是指双方持有相同的密钥进行通信。常见的对称加密算法有DES、3DES、AES等,以AES为例

1. AES

按照密钥的长度区分为AES128,AES192,AES256

按照加密算法模式区分为:CBC,ECB,CTR,CFB,OFB

2.加密使用

以ECB和CBC两种模式,列举AES参数如下:

ECBCBC
密钥key加解密使用同一个key加解密使用同一个key
偏移量iv16byte
待加密的明文字节长度不够16字节或者16字节倍数的时候需要进行填充字节长度不够16字节或者16字节倍数的时候需要进行填充

以AES256-CBC为例,AES为块加密,其原理如下图,如此循环加密后形成密文块,其中key值循环复用,iv值为上一次加密密文块的后十六个字节。

三、非对称加密

对称加密算法在加密和解密时使用的是同一个密钥;而非对称加密算法需要两对密钥也就是4个密钥来进行加密和解密,通信双方各自准备一对公钥和私钥。其中公钥是公开的,由信息接受方提供给信息发送方。公钥用来对信息加密。私钥由信息接受方保留,用来解密。

1. ECC

又称ECC 椭圆曲线密码学,属于非对称加密。

  • Alice 跟 Bob 协商好椭圆曲线的各项参数,以及基点 G,这些参数都是公开的。
  • Alice 生成一个随机的 ECC 密钥对
  • Bob 生成一个随机的 ECC 密钥对
  • 两人通过不安全的信道交换公钥
  • Alice 将 Bob 的公钥乘上自己的私钥,得到共享密钥 sharedKey,如图Alice使用该sharedKey通过AES-256加密方式进行明文的加密处理
  • Bob 收到密文后,将 Alice 的公钥乘上自己的私钥,得到共享密钥 sharedKey,使用该sharedKey和之前约定的AES-256加解密方式,进行解密处理

2.加密使用

  1. int calc_ecc_share_key(uint8_t *calc_share_key, uint32_t size)
  2. {
  3. uint8_t loc_ecc_sk[] = { 0xc9, 0x0a, 0x00, 0xf9, 0x22, 0xb5, 0x8f, 0xb2,
  4. 0xc2, 0x75, 0x1c, 0x57, 0x72, 0x64, 0xe8, 0xad,
  5. 0x9e, 0xac, 0x7d, 0x09, 0xcb, 0x3d, 0x74, 0x9e,
  6. 0xda, 0x40, 0x20, 0xf0, 0x6c, 0xff, 0x2a, 0x57 };
  7. uint8_t loc_ecc_pk[] = { 0x18, 0x9b, 0x1d, 0x8d, 0x43, 0x7d, 0xc9, 0xb2,
  8. 0x23, 0xdf, 0x0f, 0x44, 0xe7, 0xbb, 0xe9, 0x98,
  9. 0x38, 0xae, 0xb5, 0xc2, 0xa5, 0x6a, 0x44, 0x27,
  10. 0xad, 0x2a, 0xc8, 0x37, 0xed, 0x42, 0x7b, 0x81,
  11. 0xeb, 0x10, 0xb9, 0xc4, 0x7a, 0xff, 0xf4, 0x7f,
  12. 0x70, 0x12, 0xab, 0xc8, 0x14, 0x87, 0x14, 0x43,
  13. 0x57, 0xf2, 0x32, 0xb7, 0x4f, 0x77, 0x66, 0xa5,
  14. 0x04, 0x5d, 0x19, 0x73, 0x06, 0x04, 0xe0, 0xe0 };
  15. uint8_t rem_ecc_pk[] = { 0x1a, 0x81, 0x01, 0x67, 0x4e, 0xd2, 0xc9, 0xd7,
  16. 0x97, 0x1a, 0x1b, 0x9f, 0xb9, 0xf6, 0x24, 0xde,
  17. 0x9d, 0x6f, 0x37, 0x1d, 0xa5, 0x11, 0x31, 0xd0,
  18. 0x76, 0x17, 0x3d, 0x5e, 0xf6, 0x68, 0x2d, 0x74,
  19. 0x93, 0x22, 0x9f, 0x14, 0x61, 0xfb, 0x0f, 0x0d,
  20. 0x70, 0x0c, 0x96, 0x79, 0xae, 0x96, 0x2d, 0xbf,
  21. 0xfe, 0x74, 0x41, 0xb5, 0xbb, 0x00, 0x69, 0x13,
  22. 0xc5, 0xfb, 0xf6, 0xbb, 0x28, 0xfd, 0x71, 0x6b };
  23. // 1. Alice 使用自己的私钥loc_ecc_sk + Bob公钥rem_ecc_pk, 计算出共享密钥share_secret
  24. uint8_t share_secret[32] = { 0 };
  25. uint8_t share_secret_cc[32] = { 0 };
  26. uint8_t local_ecc_sk_cc[32] = { 0 };
  27. uint8_t rem_ecc_pk_cc[64] = { 0 };
  28. int ret = 0;
  29. swap_endian(loc_ecc_sk, local_ecc_sk_cc, 32);
  30. swap_endian(rem_ecc_pk, rem_ecc_pk_cc, 32);
  31. swap_endian(rem_ecc_pk + 32, rem_ecc_pk_cc + 32, 32);
  32. ret = micro_ecc_shared_secret_compute(NULL, local_ecc_sk_cc, rem_ecc_pk_cc, share_secret);
  33. if (ret == 0) {
  34. printf("%s: calc share_key ok! ret: %d\r\n", __func__, ret);
  35. swap_endian(share_secret, share_secret_cc, 32);
  36. memcpy_s(calc_share_key, size, share_secret_cc, sizeof(share_secret_cc));
  37. }
  38. else {
  39. printf("%s: calc share_key error! ret: %d\r\n", __func__, ret);
  40. return -1;
  41. }
  42. return 0;
  43. }

总结

对称加解密AES-256,原理梳理及c++版本库的使用

非对称加密ECC,原理梳理及小米ECC加密源码的使用

以下是引用文档的链接:

写给开发人员的实用密码学(七)—— 非对称密钥加密算法 RSA/ECC - This Cute World

(43条消息) AES加解密模式_liyuan0714的博客-CSDN博客_aes加解密

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/731305
推荐阅读
相关标签
  

闽ICP备14008679号