Skip to content

数说国密算法

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比较

特点AESSM4
密钥长度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>

参考