数说国密算法
1872字约6分钟
2023-06-03
国密算法简介
什么是国密算法
国密算法即国家密码局认定的国产加密算法,也称为“商用密码算法”,包括 SM1、SM2、SM3、SM4、SM7、SM9 等。SM 代表商密,即商业密码,是指用于商业的、不涉及国家秘密的密码技术。
国密算法的设计目标是保证安全性、高效性和 自主可控性,这些算法已经被广泛应用于中国政府和企业的信息安全领域,也逐渐得到了国际认可和应用。
除 SM1 和 SM7 的算法不公开外,其余算法都已成为 ISO/IEC 国际标准。
各种国密算法的特点
算法 | 类型 | 对标算法 | 公开 | 适用场景 |
---|---|---|---|---|
SM1 | 对称 | - | 否 | 智能 IC 卡、智能密码钥匙、加密卡、加密机 |
SM2 | 非对称 | RSA | 是 | 数字签名、密钥交换、身份验证、安全通信 |
SM3 | 哈希 | MD5/SHA | 是 | 数字签名及验证、验证码、随机数生成 |
SM4 | 对称 | DES/AES | 是 | 适用于轻量级加密场景 |
SM7 | 对称 | - | 否 | IC 门禁卡、票务,支付与一卡通等 |
SM9 | 非对称 | - | 是 | 将用户的标识作为公钥,用于用户身份认证 |
一般软件开发,重点关注 SM2 和 SM4 即可
分组加密算法 AES vs SM4
AES 和 SM4 都是安全性较高的对称分组加密算法,适用于金融、军事、物联网、移动设备等场景。
在这两个算法中,都有 加密模式 和 填充方式 ,这两个概念可以看成是对称加密算法的参数和格式选择。
加密模式
- :CBC(Cipher Block Chaining)模式是一种分组密码的工作模式,它需要一个初始向量(IV)进行加密。在 CBC 模式中,每个明文块都会与前一个密文块进行异或操作,然后再进行加密。由于个密文块都依赖于前一个密文块,因此 CBC 模式可以提供更好的安全性。但是,由于每个明文块都依赖于前一个密文块,因此 CBC 模式无法进行并行加密,因此速度较慢。
- CFB 模式:CFB(Cipher)模式是一种分组密码的工作模式,它可以将分组密码转换为流密码。在 CFB 模式中,加密器将前一个密文块作为输入,然后生成一个密钥流,再将密钥流与明文块进行异或操作,得到密文块。由于 CFB 模式可以将分组密码转换为流密码,因此它可以进行并行加密,速度较快。但是,由于每个密文块都依赖于前一个密文块,因此 CFB 模式无法提供与 CBC 模式相同的安全性。
- OFB 模式:OFB(Output Feedback)模式是一种分组密码的工作模式,它可以将分组密码转换为流密码。在 OFB 模式中,加密器将前一个密钥流作为输入,然后生成一个新的密钥流,再将密钥流与明文块进行异或操作,得到密文块。由于 OFB 模式可以将分组密码转换为流密码,因此它可以进行并行加密,速度较快。与 CFB 模式类似,OFB 模式也无法提供与 CBC 模式相同的安全性。
- ECB 模式:ECB(Electronic Codebook)模式是一种分组密码的工作模式,它将明文分成定长度的块,然后对每个块进行独立加密。由于 ECB 模式对于相同的明文块会生成相同的密文块,因此它容易受到密码分析攻击。ECB 模式可以进行并行加密,速度较快,但是安全性较差,不建议使用。
建议使用CBC模式
填充方式
- :PKCS5Padding 填充方式是一种填充方式,它会在明文末尾添加填充字节,以达到分组长度的数倍。填充字节的值等于需要填充的字节数。例如,如果明文长度为 14 字节,分组长度为 16 字节,则需要添加 2 个填充字节,值为 0x02。PKCS5Padding 填充方式可以提供良好的安全性,是最常用的填充方式之一。
- NoPadding 填充方式:NoPadding 填充方式不会对明文进行任何填充,因此明文长度必须是分组长度的整数倍。如果明文长度不是分组长度的整数倍,则需要在明文末尾添加空格或其他字符,使其长度达到分组长度的整数倍。由于 NoPadding 填充方式不会对明文进行任何填充,因此它可以提供更好的安全性。
- ISO10126Padding 填充方式:ISO10126Padding 填充方式会在明文末尾添加随机生成的填充字节,以达到分组长度的整数倍。由于 ISO10126Padding 填充方式会添加随机生成的填充字节,因此它可以提供更好的安全性。
建议使用 PKCS5Padding 填充方式
AES和SM4比较
特点 | AES | SM4 |
---|---|---|
密钥长度 | 128、192、256位 | 128位 |
块大小 | 128位 | 128位 |
加密模式 | ECB、CBC、CFB、OFB、CTR等 | ECB、CBC、CFB、OFB、CTR等 |
填充模式 | NoPadding、PKCS5Padding、ISO10126Padding等 | NoPadding、PKCS5Padding等 |
非对称加密算法 RSA vs SM2
RSA 和 SM2 都是安全性较高的非对称加密算法,适用于数字签名、密钥交换。
在这两个算法中,都有 公钥 和 私钥 的概念,公钥可以公开,私钥是私密的,这样一对公私钥称为 密钥对。
非对称加密用于通讯
一般来说,都是公钥加密,私钥解密,但这样只能单边通讯,如果系统双方需要相互通讯,可以生成两对密钥对。各自保存好自己的私钥和对方的公钥,用公钥加密,私钥进行解密。
但是非对称加密比对称加密要慢得多,在实际应用时,非对称加密总是和对称加密一起使用,例如非对称加密用来传输对称加密的密钥,随后用速度较快的对称加密来传输。
非对称加密用于验签
非对称加密还有另一种私钥加密,公钥解密的用法,但通常不用来传输密文,而是用于签名验签,原理是,如果一个密文公钥能解密出来,说明一定是私钥加密的,而不是其他人加密的。
摘要算法 MD5/SHA vs SM3
信息摘要(Hash安全散列)算法,也叫哈希算法,哈希值也叫散列值,不可逆,不需要秘钥。
MD5 和 SHA-256 都是密码散列函数,加密不可逆。虽然都不能防止碰撞,但是相对而言,MD5比较容易碰撞,安全性没有SHA-256高。
据官方称,SM3安全性及效率与SHA-256相当.
Java 将 AES/RSA/SHA/MD5 改造成 SM4/SM2/SM3
可使用 bouncycastle
库,在1.57版本之后,加入了对SM2、SM3、SM4算法的支持。
具体实现封装可见下文参考链接。
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.70</version>
</dependency>