赞
踩
目录
主要讲解对称加解密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为例
按照密钥的长度区分为AES128,AES192,AES256
按照加密算法模式区分为:CBC,ECB,CTR,CFB,OFB
以ECB和CBC两种模式,列举AES参数如下:
ECB | CBC | |
密钥key | 加解密使用同一个key | 加解密使用同一个key |
偏移量iv | 无 | 16byte |
待加密的明文 | 字节长度不够16字节或者16字节倍数的时候需要进行填充 | 字节长度不够16字节或者16字节倍数的时候需要进行填充 |
以AES256-CBC为例,AES为块加密,其原理如下图,如此循环加密后形成密文块,其中key值循环复用,iv值为上一次加密密文块的后十六个字节。
对称加密算法在加密和解密时使用的是同一个密钥;而非对称加密算法需要两对密钥也就是4个密钥来进行加密和解密,通信双方各自准备一对公钥和私钥。其中公钥是公开的,由信息接受方提供给信息发送方。公钥用来对信息加密。私钥由信息接受方保留,用来解密。
又称ECC 椭圆曲线密码学,属于非对称加密。
- int calc_ecc_share_key(uint8_t *calc_share_key, uint32_t size)
- {
- uint8_t loc_ecc_sk[] = { 0xc9, 0x0a, 0x00, 0xf9, 0x22, 0xb5, 0x8f, 0xb2,
- 0xc2, 0x75, 0x1c, 0x57, 0x72, 0x64, 0xe8, 0xad,
- 0x9e, 0xac, 0x7d, 0x09, 0xcb, 0x3d, 0x74, 0x9e,
- 0xda, 0x40, 0x20, 0xf0, 0x6c, 0xff, 0x2a, 0x57 };
- uint8_t loc_ecc_pk[] = { 0x18, 0x9b, 0x1d, 0x8d, 0x43, 0x7d, 0xc9, 0xb2,
- 0x23, 0xdf, 0x0f, 0x44, 0xe7, 0xbb, 0xe9, 0x98,
- 0x38, 0xae, 0xb5, 0xc2, 0xa5, 0x6a, 0x44, 0x27,
- 0xad, 0x2a, 0xc8, 0x37, 0xed, 0x42, 0x7b, 0x81,
- 0xeb, 0x10, 0xb9, 0xc4, 0x7a, 0xff, 0xf4, 0x7f,
- 0x70, 0x12, 0xab, 0xc8, 0x14, 0x87, 0x14, 0x43,
- 0x57, 0xf2, 0x32, 0xb7, 0x4f, 0x77, 0x66, 0xa5,
- 0x04, 0x5d, 0x19, 0x73, 0x06, 0x04, 0xe0, 0xe0 };
- uint8_t rem_ecc_pk[] = { 0x1a, 0x81, 0x01, 0x67, 0x4e, 0xd2, 0xc9, 0xd7,
- 0x97, 0x1a, 0x1b, 0x9f, 0xb9, 0xf6, 0x24, 0xde,
- 0x9d, 0x6f, 0x37, 0x1d, 0xa5, 0x11, 0x31, 0xd0,
- 0x76, 0x17, 0x3d, 0x5e, 0xf6, 0x68, 0x2d, 0x74,
- 0x93, 0x22, 0x9f, 0x14, 0x61, 0xfb, 0x0f, 0x0d,
- 0x70, 0x0c, 0x96, 0x79, 0xae, 0x96, 0x2d, 0xbf,
- 0xfe, 0x74, 0x41, 0xb5, 0xbb, 0x00, 0x69, 0x13,
- 0xc5, 0xfb, 0xf6, 0xbb, 0x28, 0xfd, 0x71, 0x6b };
-
- // 1. Alice 使用自己的私钥loc_ecc_sk + Bob公钥rem_ecc_pk, 计算出共享密钥share_secret
- uint8_t share_secret[32] = { 0 };
- uint8_t share_secret_cc[32] = { 0 };
- uint8_t local_ecc_sk_cc[32] = { 0 };
- uint8_t rem_ecc_pk_cc[64] = { 0 };
- int ret = 0;
-
- swap_endian(loc_ecc_sk, local_ecc_sk_cc, 32);
- swap_endian(rem_ecc_pk, rem_ecc_pk_cc, 32);
- swap_endian(rem_ecc_pk + 32, rem_ecc_pk_cc + 32, 32);
- ret = micro_ecc_shared_secret_compute(NULL, local_ecc_sk_cc, rem_ecc_pk_cc, share_secret);
- if (ret == 0) {
- printf("%s: calc share_key ok! ret: %d\r\n", __func__, ret);
- swap_endian(share_secret, share_secret_cc, 32);
- memcpy_s(calc_share_key, size, share_secret_cc, sizeof(share_secret_cc));
- }
- else {
- printf("%s: calc share_key error! ret: %d\r\n", __func__, ret);
- return -1;
- }
-
- return 0;
- }
对称加解密AES-256,原理梳理及c++版本库的使用
非对称加密ECC,原理梳理及小米ECC加密源码的使用
以下是引用文档的链接:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。