C++的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.加密使用

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加密源码的使用

以下是引用文档的链接:

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

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: AES(Advanced Encryption Standard)是一种对称密算法,CBC(Cipher Block Chaining)是一种密模式,128表示密钥长度为128位。 在AES CBC 128密过程中,首先需要一个128位的密钥,用来密和解密数据。密过程中,数据被分成一块一块的固定长度(通常是128位)进行处理。每一块数据会与前一块数据进行异或操作,然后再使用密钥进行密。第一块数据需要初始化向量(IV)与之进行异或操作。 整个密过程按块进行,每一块数据的密都依赖于前一块数据的密结果,这样可以增密的强度。解密过程与密过程相反,需要使用相同的密钥和初始化向量。 AES CBC 128解密算法具有较高的安全性和效率。由于使用了CBC模式,数据块之间的关系变得复杂,最后一块的密结果也会影响前面块的解密结果,提高了数据的安全性。 AES CBC 128解密适用于多种场景,例如数据传输、文件密等。在实际应用中,需要确保密钥的安全性,避免密钥被泄露,从而保证解密的安全性。 需要注意的是,密算法本身并不能完全保证数据的绝对安全,只是提供了一种密方式来增数据的安全性。为了更好地保护数据,还需要综合考虑其他因素,如密钥管理、访问控制等。 综上所述,AES CBC 128解密是一种强大的密算法,通过使用128位的密钥和CBC模式,能够提供较高的安全性和效率,广泛应用于数据保护领域。 ### 回答2: AES(Advanced Encryption Standard)是一种常用的对称密算法,其中CBC(Cipher Block Chaining)是其一种工作模式。128代表AES算法的密钥长度为128位。 在使用AES CBC 128进行密时,首先需要选择一个128位的密钥。然后,将明文分成若干个128位的块,并对每个块进行密处理。在CBC模式下,每个块的密依赖于前一个密块的密文,这一点与ECB(Electronic Codebook)模式不同。 在密过程中,首先将第一个块与初始向量(Initialization Vector,IV)进行异或运算,然后再使用密钥对其进行密得到第一个密文块。接下来,将第二个明文块与第一个密文块进行异或运算,再使用密钥对其进行密得到第二个密文块。以此类推,对每个明文块都进行类似的处理。 在解密过程中,首先使用密钥对第一个密文块进行解密,得到第一个明文块。然后将第一个密文块与解密后的第一个明文块进行异或运算,得到第二个明文块。再使用密钥对第二个密文块进行解密,得到原本的第二个明文块。以此类推,对每个密文块都进行类似的处理。 需要注意的是,在使用AES CBC 128进行解密时,需要保证具有相同密钥和初始向量。初始向量在解密过程中起到了一定的随机性作用,提高了密文的安全性。 总结来说,AES CBC 128是一种采用128位密钥长度的AES密算法的工作模式,通过使用CBC模式和异或运算,对明文进行分块密或解密,从而保障数据的保密性和完整性。它被广泛应用于信息安全领域中,用于保护敏感数据的传输和存储。 ### 回答3: AES(Advanced Encryption Standard)是一种常用的对称密算法,其中CBC(Cipher Block Chaining)是其中一种模式。AES CBC 128解密指的是使用128位的密钥对数据进行解密,并采用CBC模式。 在AES CBC 128密中,首先需要选择一个128位的密钥。然后,将待密的数据分为若干个128位的数据块,每个数据块之间进行异或运算。接下来,使用AES算法对每个数据块进行密运算。对于第一个数据块,将其与初始化向量(IV)进行异或运算,然后使用密钥进行密。对于后续的数据块,将其与前一个密后的数据块进行异或运算,然后再使用密钥进行密。最后,将密后的数据块按顺序拼接起来,得到最终的密文。 解密过程与密过程相反。首先,将密文拆分为128位的数据块。对于第一个数据块,使用密钥进行解密,然后与IV进行异或运算得到明文。对于后续的数据块,先使用密钥进行解密,再与前一个解密后的数据块进行异或运算,得到明文。 AES CBC 128解密在保证数据机密性的同时,还能够提供数据完整性和抵御重放攻击的能力。这是因为每个数据块都与前一个数据块相关联,并且每个数据块都使用了相同的密钥进行密和解密,从而使得攻击者无法轻易修改其中一个数据块而不影响后续数据块的解密结果。 总结起来,AES CBC 128解密是一种常用的对称密算法,能够在保证数据机密性的同时提供数据完整性和抵御重放攻击的能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值