声明:版权归原作者所有,如有侵权请联系删除。
无论通讯安全还是设备安全,都离不开加解密技术。密码的背后一定是加解密技术。
加解密技术说白了就是变换,加密变换和它的反变换--解密变换。通过这种变换,可以提供之前所说的信息安全的三个属性(服务):保密性、完整性及可用性。在讨论加解密算法应用时所提供的服务时不大谈论可用性,因为算法总是要可用的。
同时,又把广义的的完整性细分为:狭义的完整性和认证性,就是完整性和真实可靠分离了。这样,加解密技术也有三个属性(服务),也叫 CIA,保密性、完整性和可认证性(Authentication)。
能够提供保密服务的有对称密钥和非对称密钥,能够提供狭义完整性服务的有单项散列函数,能够提供认证鉴别类服务的有基于非对称密钥技术的数字签名,以及基于对称密钥的消息验证码MAC。
2.1 三类加解密技术与历史
-
第一阶段:加解密是艺术,1949年以前
- 没有统一的标准和理论支撑,加解密技术是基于过程(如隐写术、特制墨水),基于方法(移位和替换)的
-
第二阶段:对称密钥,1949~1976年
- 1949年,香农发表《保密系统的通信理论》,提出基于密钥的加解密算法。加解密过程可以公开,但密钥不公开
-
第三阶段:非对称密钥,1976~至今
- 1976年,美国2位计算机学家,一个缩写为 D,一个缩写为 H,发表了《在不传递密钥的情况下进行解密》的文章,就是 DH 密钥交换协议
- 受DH密钥交换协议启发,3个人(名字首字母 R,S,A)发明了 RSA 非对称密钥的加解密技术
- 非对称密钥技术是划时代的,解决了对称密钥的管理和分发问题
2.2 加解密的参数模型
对加解密技术定义模型,至少2方参加,加密方(Alice)和解密方(Bob)。A 和 B 之间的距离可以是空间上的(如北京到上海,要考虑到不同路由器之间的不安全通信连接),也可以是时间上的(如今天的你和明天的你进行一段加密与解密之间的对话)。
A对一段明文,用一个密钥进行加密,形成密文。B收到密文,用一个密钥进行解密,得到明文。
针对密钥的个数,有3种情况:
- A 的加密密钥和 B 的解密密钥,是一样的,即 1 个,叫对称加密技术
- A 的加密密钥和 B 的解密密钥,不一样,即 2 个,叫非对称加密技术
- 特殊情况:A 加密了,B 解密不出来,0 个,叫单向散列函数
2.3 单向散列函数
在加解密技术里,散列=摘要=哈希
加解密技术中的摘要,具有2个特征:
- 对原消息的任何改变都会导致摘要发生变化
- 无法从摘要里推算出原始消息(原文)的蛛丝马迹,这就是叫单向函数的原因
单项散列函数的用处:
-
提供完整性服务
已知一段数据的摘要,如果数据被修改了,使用前计算下摘要,就知道数据是否被修改或替换了
-
如果修改了数据,同时重新计算了摘要,此时检查不出来。
此时的解决方法:
- 通过硬件技术,比如一次可编程技术(如 OTP)将摘要写进去
- 通过加密技术, 使用消息验证码 MAC(对称密钥技术)、数字签名(非对称密钥技术)
-
存储敏感信息
- 反面例子:某知名网站发生了信用卡大泄露,也有某知名网站发生过用户名密码大量泄露的事件。预防措施:不论是网站还是 MCU 人机界面系统,用户的密码应该使用哈希值。用户登录系统时,用户输入的值会被转换成哈希值,与系统里存储的哈希值进行比较,这样即使系统被攻破,用户的原始密码不会泄露
- 正面例子:区块链系统
构成密码级的散列函数主要是MD5,SHA1,SHA2(包括 SHA-256 和 SHA-512,而 SHA-224 是 SHA-256 的删减版,SHA-384 是 SHA-512 的删减版),SHA3(输出长度: 512、384、256、224、64位)。SHA3 并不是要取代 SHA2,因为 SHA2 目前并没有出现明显的弱点。
CRC32 也是单向函数,但不是加密级单向函数,原因:加密级单向函数要求:不容易构造碰撞,就是已知明文和哈希值,不能轻易构造出另外一个明文对应同一个哈希值。
MD5 和 SHA1 在某种意义上被攻破了,不再推荐使用。
在MCU开发中使用单项散列函数,通常就是2个参数:散列函数的类型、明文。
2.4 对称加密技术
对称不对称,指的不是加解密过程,而是加密和解密所使用的密钥。加密和解密所使用的钥匙一样,称为对称密钥。
对称密钥技术的发展非常迅速,应用简单,使用广泛,各种各样的文件、文本、声音、图像的保密都是通过对称密钥技术来保护的。如果需要保密地传输一个固件,给固件加密的一定是对称密钥技术。如果上网需要 https,最终加密传输网页的也一定是对称密钥技术。
对称密钥怎么使用?对称密钥算法,如果接口封装的好,一定至少有2个参数:密钥、明文。这个密钥参数也很简单,如果是 128 bit,那么密钥长度就是 16 个字节。
通常密钥都很小,然而矛盾的是,大部分时候需要加密的内容都很长。几个 Byte 的密钥长度与几百 MB 大小的文件,如何使用长度很短的密钥对长度很长的文件进行加密呢?
有2种方法:
- 将短的一方,变长。一种是把密钥无限扩展,让密钥的长度和明文长度对应起来。这种就是所谓的流加密。
- 将长的一方,变短。还有一种就是把明文分组,分块。分成一个一个块,这个块大小符合符合加密算法锁需要的明文大小。这就是经常听到的分组加密,分块加密。
对于第一种方法,流加密,存在一个问题:如何生成密钥流和明文长度大小一样。理想情况下,有一份和明文一样长的随机数做密钥,这样当然安全,可是,密钥这么长,怎么记录,怎么传输,都是问题。现实中还是从一个密钥,通过一种算法,进行计算,生成密钥流。
对于第二种算法,分组加密,看上去很好,符合工程技术的常见思维,对问题分解然后针对每个小块处理。但块与块之间是否就是独立的关系呢?块与块之间独立,对带来安全问题。
对于分组加密,如果每个位置上的数据独立,加密出来的数据总是一样,会有问题。同样的道理,如果每次对一个消息报文加密出来的结果都是一样,也会存在安全问题。
- 明文和密文一一对应,可以实施重放攻击
- 明文和密文一一对应,可以实施明文攻击
所以加解密技术也要保证:对于一个文件同样的明文出现在每一处的解密不一样,一个文件今天和明天的加密结果也不一样。如何做到?通过一个初始向量,加上分组连接模式,而这个初始向量是可以公开的,而且每次不一样。
从模型上,如果使用一个对称密钥技术,至少需要2个参数:明文、密码。如果安全点,至少需要4个参数:明文、密钥、初始化向量、分组模式。
对称加解密算法有哪些?
- DES:密钥长度 64 位,实际密码只有 56 位。每一块长度 8 字节。因为密钥长度太短,现在已经被认为不安全,一般不建议使用 DES 算法。如果一定要使用,建议使用3DES,就是把 DES 算法执行了 3 次,每次的密钥都不一样,这样密钥长度就变成了DES 密钥长度的 3 倍。
- AES:密钥长度可以使用 128 位、192 位和 256 位。每一个分块的长度固定为 128 位。
- SM1
- SM4
对称加密算法常用的5组分组模式:ECB(电子密码本)、CBC(密文分组链接)、CFB(密文反馈)、OFB(输出反馈)、CTR(计数器)。
对称密钥具有简单、速度快的优点,但缺点也很明显。在加密模型中,加密方A(Alice),解密方B(Bob)。对称密钥技术下,A 和 B 必须共享同一个密钥,这样 A、B 之间才能进行保密通信。这就引出了一个问题,如果 A 和 B 之间隔了千山万水,怎么样 A 和 B 之间共享一个密钥呢?在这个问题的解决,非技术手段,就是把 2 个需要通信的召集在一起,面对面协商出一个共享密钥。但这个手段,在过去,信息技术不发达、互联网技术不发达的情况下,还可以勉强接受。在今天,我们和每一个网络服务之间都需要随时随地的进行保密通信,面对面协商根本就不可能,这就必须依赖技术手段。这个技术手段就是非对称加密技术,依靠非对称加密来传输对称加密的密钥。
2.5 非对称加密技术
非对称加密技术指的是加密、解密的密钥不相同。
一对密钥:
- 私钥:保留的那个密钥
- 公钥:开放的那个密钥。任何人都可以使用公钥,从而解决了密钥分发的问题。
因为每个人都可以使用公开的密钥对要发送给我的信息进行加密,对称密钥技术又叫公钥技术。
反过来(用私钥加密,发送给所有人),计算上可以,但是保密性已经不存在了,因为我已经把公钥公开给所有人,所有人都可以看到这个秘密。
但是这个方法也是有用的,如果你用私钥加密一段数据,其他所有人都有你的公钥,能够解开验证其中的内容,就证明是你发送的,这样你就抵赖不了,这就是签名技术。不过在签名体制里,就不能叫加密解密,叫它用私钥签名和用公钥验签。
公钥是用来加密的,私钥是用来解密的;私钥用来签名,公钥用来验签。
非对称机密技术,有 2 个主要的用途:
- 保密性服务:公钥加密、私钥解密
- 认证的服务:即数字签名,私钥签名、公钥验签
非对称加密技术提供的保密服务有在密钥管理方面的优点,是否可以取代对称加密技术呢?不行,原因在于性能。非对称加密技术都是基于一些数学难题,即使正常运算,运算量也很大。非对称加密的性能比对称加密要慢一个数量级,无法满足许多通信实时性要求高的场合。
非对称加密技术,性能不能,还有什么用呢?利用非对称密钥在钥匙管理的有点,来传输对称密钥。可以预先设计好的对称密钥,或者临时生成的会话密钥,通过非对称加密技术构造的管道传递出去。
非对称密钥技术目前有哪些成熟算法?
RSA:基于两个大的素数乘起来。私钥包括模数 n、密钥对 d 和 e;公钥包括模数n、密钥 e。生成模数 n 的素数 p 和素数 q,如果要应用余数定理快速计算,则可以保留p,q。但公钥只能包含模数 n 以及加密密钥 e。
-
椭圆曲线 ECC:指20世纪90年代开始流行的椭圆曲线,是基于离散对数的求解困难。椭圆曲线参数是公开的(加解密的双方都可以拿到),不是生成的,私钥是一个随机数,公钥是私钥运算得到。椭圆曲线参数,包括椭圆曲线多项式的各项系数例如系数a,系数b,以及一个模数p,再加上椭圆曲线的一个参考点G。基点既然是椭圆曲线上的一个参考点,那就是就是以坐标的形式出现的,一个是x,一个是y,私钥则在椭圆曲线基础加上一个随机数,公钥是私钥和基点进行点乘后的结果,同样点乘的结果还是点,那么在代码里公钥就是具有x,y的形式,一个是x,一个是y。
ECC 与 RSA 相比,RSA 的密码长度较长,比如典型的 2048 位、256 字节;ECC 同等加密强度小于 256 位、32 字节。在密钥长度上 RSA 比椭圆曲线高了一个数量级,10倍左右。
-
密钥协商技术:DH密钥交换协议
- 原理:乘方
- 双方共同约定一个乘方的底数g
- A(Alice)选取了一个随机数x,保密,基于g,计算g的x次方,然后把结果及g发送给B(Bob)。这里并没有把随机数x发送给B,而且因为求对数困难,任何人也无法从g的x次方结果里反推出来x
- B收到g,以及g的x次方的结果。注意:B并没有收到x。B也选取一个随机数y,保密,同样以g为底,计算g的y次方,然后把g的y次方发送给A。B没有把y发送给A,而且因为求对数困难,任何人也无法从g的y次方结果里反推出来y
- 最终,A有g的y次方以及自己的x,可以计算出g的y次方的x次方;B有g的x次方以及自己的y,可以计算出g的x次方的y次方。因为乘方的次序是没有关系的,所以这两个值是一样的,共同密码就协商出来了。而窃听的人知道了g的x次方,g的y次方,也知道底数g,还是没有办法求出对数,求出x和y,从而没有办法计算出g的x次方的y次方的结果。
但是所有的非对称密钥技术都不能防备一个问题:加入有人假冒Bob,怎么办?这就是中间人攻击的问题,只有采用数字证书才能解决。因为在任何情况下,我证明我是我,都是很难另不认识的人相信的。数字证书是靠一个可信第三方解决了这个问题。
2.6 数字签名与消息验证码
信息安全的服务除了保密性,还有完整性。信息安全的完整性可以扩展为狭义的完整性服务和认证服务。
如何实现认证服务?就是将单向散列函数与加密技术结合来实现认证服务。主要认证服务有 2 种:
- 基于对称加密技术,称为消息认证码(MAC)
- 基于非对称加密技术,称为数字签名
2.6.1 数字签名
数字签名的一般流程:现将要签名的文档,进行一个哈希运算(比如使用SHA-256,计算出32个字节的摘要),然后将摘要根据一定的标准,组成一个数据块,根据这个数据块,使用非对称加密技术的私钥对他进行签名运算。注意,签名的对象是哈希后的值,这样就避免了非对称密钥的速度慢的缺点。
签名总是随着明文发送给其他用户,因为公钥是公开的,其他用户如果需要验证这份文档是否完整可靠,只要用公钥解开签名中的哈希值,同时再计算一下明文的哈希值,如果这两个哈希值匹配,那么可以认为这个文档是完整并且可靠的。
注意:数字签名是有标准的,不能自己创造签名的算法和格式,否则很容易造成不安全。
2.6.2 消息认证码(MAC)
消息认证码有很多种实现与标准:
- HMAC:将明文和密钥进行组合,然后进行哈希运算,运算后的结果再次与密钥进行组合,然后再进行哈希运算,这样运算后的结果才 HMAC。A 将明文和 MAC 发送给 B 时,B 可以按照同样的过程对明文做个 HMAC 运算。因为有了密钥的参与,若恶意第三方修改或者假冒明文,但是因为他们没有密钥,所以没办法计算出正确的 HMAC。
- 基于AES的操作模式或者分组模式:AES 的 CBC 或者 GCM 模式都是将所有的明文块在加密的密文里通过某种关系联系在一起了,也就是最后一个加密块的结果事实上依赖于前面的所有的明文块。这就起到了狭义完整性的需要。这种情况下,块连接模式,或者操作模式、分组模式,就起到了类似哈希函数的效果。而 AES 本身是有密钥参与的,那么我们只要取最后一个块,或者单独计算的标记值,就成为消息认证码 MAC。
2.7 智能锁中用到的加解密以及STM32 CryptoLib
STM32 提供的加密库 X-Crypto-lib 支持单向散列函数、对称密钥技术、非对称密钥技术,通过了美国密码算法认证体系认证,在实现上安全性得到了保证,也适合在一些有认证需求的MCU产品上。
密码技术可以由软件实现,也可以由硬件加速。软件加密库可以运行在所有的STM32平台上。STM32 特定型号有常用的算法加速,可以减轻内核负载,降低功耗。
除了 STM32 加密库,如果用户对认证要求不高,也可以采用一些第三方或者开源的加密实现,例如 mbedTLS 就包含了所有流行的加解密算法的实现。
2.7.1 算法工具
PC 上工具推荐 OpenSSL,是个命令行工具,支持所有的主流算法。
2.7.2 智能锁需要的加解密算法
从前面的安全分析中,可以知道,智能锁最需要保护的用户开锁的权利,制造商的知识产权,以及用户的隐私。
- 开锁的权利事实上就是如何在系统中产生一把数字化的钥匙,这把钥匙可以不要求保密,但必须完整可靠。那么数字签名技术肯定是必须。对于 MCU,推荐使用椭圆曲线算法 ECC 以及 SHA256 来实现数字签名技术。
- 知识产权保护涉及到固件安装或者升级时的保密,肯定需要对称加密技术,推荐使用AES 算法。同时,在启动时要检测固件是否已经被破坏,则需要数字签名技术(推荐ECC + SHA256)。
- 保护用户隐私,则应当使用对称密钥技术(推荐 AES)进行数据加密。
- 对外界通讯(包括云端)安全则需要依赖 TLS,TLS 几乎需要所有种类的加解密算法。