适合谁看:资深的嵌入式系统底层专家。技能栈(C、SoC、Bootloader、驱动、系统移植、DSP优化、Cache调优、功耗分析)是芯片设计的核心和基础,具备从硬件(SoC) 到底层固件(ROM Bootloader)再到操作系统层(驱动、RTOS)的全栈知识和实战经验,希望向SECURE BOOT方向拓展,寻求新的发展空间。
作者:断水客
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
加密
区分:根据加解密的密钥异同分为对称加密和非对称加密
- 对称: 加解密使用相同密钥
- 非对称:加解密使用不同密钥
对称加密
对称加密就像发送方和接收方都有保险柜的钥匙。发送方用钥匙锁上盒子,接收方用同一把钥匙打开盒子。
经典算法:AES、DES、3DES
缺陷:在于密钥分发的安全性,如果没法保证密钥不在发往接收方的时候被窃取,那自然也无法保证加密的安全。
非对称加密
非对称加密的加解密使用一对 mathematically related(数学上关联)的密钥:一个公钥和一个私钥。
公钥:可以完全公开,像你的邮箱地址,谁都可以知道。 私钥:必须严格保密,只能自己持有,像你的邮箱密码。
用公钥加密的内容,只有对应的私钥才能解密。
传输加密信息的时候:
发送方先从接收方获取公钥,然后用公钥加密信息。 接收方收到信息后,用自己的私钥解密。
这个过程就不涉及解密密钥的传输,也就没有密钥分发的安全性问题。
经典非对称加密算法
- RSA - 基于大数分解的难度
原理:质因数分解困难。
将两个大质数相乘很容易,但将一个巨大的合数分解回原来的两个质数却极其困难。
密钥生成:随机选择两个非常大的质数 p和 q,计算 n = p * q。n的长度就是密钥长度(如2048位)。公钥和私钥由 n和相关指数构成。
RSA是最早、应用最广泛的非对称算法。速度相对较慢,通常用于加密小数据(如加密一个对称密钥)。
- ECC - 基于椭圆曲线离散对数问题的难度
原理:在椭圆曲线构成的数学群上,进行一种特殊的“点加法”运算。已知起点 P和结果点 Q,计算需要加多少次(即 k,使得 Q = k * P)是非常困难的。
与RSA相比,在相同的安全强度下,ECC的密钥尺寸要小得多(例如,256位的ECC密钥安全性相当于3072位的RSA密钥)。这意味着计算更快、带宽占用更小、存储空间更省,特别适合计算能力受限的环境(如手机、区块链、物联网设备)。
ECDSA(椭圆曲线数字签名算法)被广泛应用于比特币和以太坊等区块链中来生成签名。
示例:
ECC保密通信算法
1.[甲]选定一条椭圆曲线E,并取椭圆曲线上一点作为基点G
2.[甲]选择一个私有密钥p(p<n),并生成公开密钥K=pG 比如25, K= pG = 25G
3.[甲]将E和点K、G传给[乙]
4.[乙]收到信息后,将待传输的明文编码到上的一点M,并产生一个随机整数r(r<n,n为G的阶数) 假设r=6 要加密的信息为3,因为M也要在E29(4,20) 所以M=(3,28)
5.[乙]计算点C1=M+rK和C2=rG C1= M+6K = (3,28)+6*(14,6)=(3,28)+(27,27)=(6,12) C2= 6G =(5,7)
6.[乙]将C1、C2传给[甲]
7.[甲]收到信息后,计算C1-kC2,结果就应该是点M C1-kC2 =(6,12)-25C2 =(6,12)-25*6G =(6,12)-2G =(6,12)-(27,27) =(6,12)+(27,2) =(3,28)
注意这里容易有一个误解,就是认为第三方拿到E和点K、G就能推出p。
这里乍一看似乎和[甲]生成时的条件一样,有E和K,一直算到G就行,但是实际上计算量是天差地别的:
[甲]生成公钥 (快速)
K = p × G 的过程是一个 “正向计算” 。知道 私钥 p(比如25),可以通过一种高效的算法(比如双击加法double-and-add)来计算 p × G。 例如,计算 25 × G: 25的二进制是 11001,算法:G -> 2G (双击) -> 3G (+G) -> 6G (双击) -> 12G (双击) -> 24G (双击) -> 25G (+G) 即使对于现实应用中的256位的大数 p,这个正向计算也只需要大约 500次 点加和双击操作。对于计算机来说,这是毫秒级别就能完成的。
[攻击者]从 K 和 G 反推 p 的过程(极慢)
这是一个 “反向搜索” 。攻击者不知道 p。他没有任何直接公式可以从 K和 G算出 p。他唯一的办法就是猜测。 他只能从 p=1开始试:1 × G = G,看看结果等不等于 K。不等于。 然后试 p=2:2 × G,看等不等于 K。不等于。 然后试 p=3... 一直试到 p=25,才发现 25 × G = K,这时他才找到答案。 而对于256位的 p,p有2^255种可能,他平均需要尝试 2^255次,这个时间和能源成本是极为巨大的。
加运算
哦对 还得回过头说一下这个加运算,你可以用c++的运算符重载来理解,本质上是一回事,都是在定义一种运算。
加法:过椭圆曲线E上一点P的切线,找到切线与椭圆曲线的另一个交点B,椭圆曲线上与B关于X轴对称的点C;定义P+P=C或者2P=C。 这个加法满足结合律和交换律。