非对称加密的工程实践
Posted 后院南树
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了非对称加密的工程实践相关的知识,希望对你有一定的参考价值。
0 引言
1 简介
非对称加密也叫公开秘钥加密,可用于加密、签名、密钥交换,主流的算法有RSA和椭圆曲线加密ECC,RSA是第一代算法也是最常见算法,而ECC近十年才开始普及,因更优秀的表现已经应用于第二代身份证,国密标准SM2,HTTPS底层的TLS协议,比特币等加密数字货币,目前ECC正在取代RSA成为新一代的非对称加密标准。
2 RSA与ECC对比
以非对称加密最广泛使用的领域HTTPS证书为例,从2014年开始,ECC 证书在国外开始使用,2015年国内开始接受ECC证书。ECC 和 RSA 相比,在许多方面都有绝对的优势,主要体现在以下方面:
抗攻击性强
CPU占用少
内存使用少
网络消耗低
加密速度快
使用较新的浏览器如Chrome v75访问国外科技公司网站,查看证书可以发现根证书因为历史原因还在使用RSA,到网站这一层已经开始使用椭圆曲线加密算法,如Google美国网站和Facebook网站:
下图是ECC证书与RSA证书的性能对比,可以看到,在高并发的场景下,ECC证书表现稳定,保持在一个比较低的状态,而RSA证书的时延在并发达到一定阈值后会骤然上升:
3 RSA非对称加密原理
RSA的API接口提供最简单的非对称加密功能,如上图所示,使用接收方的公钥加密明文Plain Text,生成密文Cipher Text,接收方使用自己的秘钥可以解密为原来的明文。
由于非对称加密的性能较差,实际工程应用中很少会用RSA直接加密目标数据,而是先用对称加密算法加密目标数据,再用RSA加密对称加密算法的秘钥,然后把这两部分加密后的数据一起发送给接收方,所以RSA实现上对于单次加密的数据块长度有限制,一次加密的数据不能超过生成密钥对时的秘钥长度keyLength/8-11,keyLength如果是1024个字节,则加密的数据不能超过117个字节,如果是2048则数据不能超过245。
4 ECIES 加密原理
为解决非对称加密性能差的问题,工程实践中使用对称和非对称的混合hybrid加密模式,这种模式有个范式叫Integrated Encryption Scheme,简称IES,在使用椭圆曲线算法时就叫ECIES,如下图,加密的目标数据File使用对称加密秘钥加密,对称加密秘钥再用接收方的公钥加密,然后将加密后的目标数据和加密后的对称秘钥打包到一起:
解密时使用接收方的私钥解开加密后的对称秘钥,然后用对称秘钥解开加密的目标数据,得到解密后的明文文件:
5 RSA的算法实现
RSA算法实现简单,使用的时候一般由语言库或者系统库提供支持,根据加密数据时填充对齐的不同模式,有OAEP和PKCS两种模式,只需要客户端和服务器端统一到一种模式上即可。
6 ECC的算法实现
通过选择不同的椭圆曲线参数就能生成不同的椭圆曲线加密算法,美国的国家标准NIST最初提供了三个标准形式:
secp256r1 (P-256)
secp384r1 (P-384)
secp521r1 (P-521)
由于2013年斯诺登的爆料,NIST的标准被怀疑由NSA加入了后门,所以学术机构研发了Curve25519标准,已经成为NIST之外的事实标准。另外中国官方的国密标准也提供了基于椭圆曲线的加密算法SM2,比特币采用的椭圆曲线secp256k1算法则在数字货币中广泛使用。
根据工程应用的成熟度,推荐使用NaCl库封装的Curve25519算法实现,NaCl是业内公认的安全水平最高的开源加密库,NaCl还有一个封装版本叫做Sodium.
NaCl/Sodium在不同的语言和移动端都有对应的原生库可用,对于简单的加密和解密可以使用nacl/box这个工具箱(一种ECIES实现)中的加密函数Seal和解密函数Open,Golang语言API如下:
func Seal(out, message []byte, nonce *[24]byte, peersPublicKey, privateKey *[32]byte) []byte
func Open(out, box []byte, nonce *[24]byte, peersPublicKey, privateKey *[32]byte) ([]byte, bool)
libsodium对其他语言支持情况:
https://libsodium.gitbook.io/doc/bindings_for_other_languages
7 关于国密标准
http://gmssl.org/docs/docindex.html
以上是关于非对称加密的工程实践的主要内容,如果未能解决你的问题,请参考以下文章