目录
前言
主要讲解对称加解密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参数如下:
ECB | CBC | |
密钥key | 加解密使用同一个key | 加解密使用同一个key |
偏移量iv | 无 | 16byte |
待加密的明文 | 字节长度不够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.加密使用
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加密源码的使用
以下是引用文档的链接: