• 运算模式:
  • 填充模式:
  • 密钥长度:
密钥:
偏移:
  • 字符编码:
  • 格式:
    (格式加密表示输出,解密表示输入)

说明

SM4 是中国国家密码管理局发布的一种分组密码算法,也被称为国密 SM4 算法。它是一种对称加密算法,用于替代 DES 和 AES 等传统的对称加密算法。 其中“SM”代表“商密”,即用于商用的、不涉及国家秘密的密码技术。
SM4 算法具有以下特点:
  • 安全性高:SM4 算法采用了 32 轮的 Feistel 结构和非线性 S 盒,结合了代换、置换和异或等操作,以保证其安全性和抗攻击能力。
  • 高效性能:SM4 算法在硬件和软件实现上都具有较高的效率,能够在不同平台上快速进行加密和解密操作。
  • 国密标准:SM4 算法是中国国家密码管理局发布的密码算法标准,被广泛应用于中国的信息安全领域。
  • 密钥长度灵活:SM4 算法支持 128 位密钥长度,可以提供足够的安全性,并且可以根据实际需求进行调整。
  • 兼容性好:SM4 算法的分组长度为 128 位,与现有的密码学协议和系统进行兼容,可以与其他对称加密算法进行互操作。

运算模式
  • CBC:Cipher Block Chaining,密码块链,明文被分成固定大小的块,并按顺序进行加密,每一个块(分组)要先和前一个分组加密后的数据进行 XOR 异或操作,然后再进行加密。 这样每个密文块依赖该块之前的所有明文块,为了保持每条消息都具有唯一性,第一个数据块进行加密之前需要用初始化向量 IV 进行异或操作。 CBC 模式是一种最常用的加密模式,它主要缺点是加密是连续的,不能并行处理,并且与 ECB 一样消息块必须填充到块大小的整倍数。
  • ECB:Electronic Codebook, 电子密码本,是最简单的加密模式,明文消息被分成固定大小的块(分组),并且每个块被单独加密。 每个块的加密和解密都是独立的,且使用相同的方法进行加密,所以可以进行并行计算,但是这种方法一旦有一个块被破解,使用相同的方法可以解密所有的明文数据,安全性比较差。 适用于数据较少的情形,加密前需要把明文数据填充到块大小的整倍数。
  • OFB:Output Feedback,输出反馈,将块密码转化为流密码,逐位或逐字节加密。使用一个初始向量(IV)作为输入,通过块密码算法生成一个密钥流。 密钥流与明文进行异或操作,得到密文。具有并行性,适用于实时加密和解密。不需要填充,可以处理任意长度的数据。不提供数据完整性和认证,需要额外的机制来确保数据的完整性和认证。
  • CFB:Cipher Feedback,密码反馈,将数据分成位(bit)而不是块,提供了流式加密(stream cipher)的特性,可以对任意长度的数据进行加密。它允许逐位或逐字节地加密和解密,并且不需要填充(padding)。 和 CBC 模式比较相似,前一个分组的密文加密后和当前分组的明文 XOR 异或操作生成当前分组的密文。因此,CFB 模式对于传输错误和数据丢失比较敏感,因为一个错误位会影响后续的加密结果。
  • CTS:Cipher Text Stealing,密文窃取,用于解决块密码加密中最后一个数据块长度不足的问题。 在加密过程中,最后一个数据块长度不足时,会使用部分密文块填充明文块,然后进行加密。 在解密过程中,最后一个数据块长度不足时,会使用部分密文块解密,然后去除填充部分。保持了加密前后数据长度的一致性。
  • CTR:Counter,计算器模式,将块密码转化为流密码,逐位或逐字节加密。使用一个计数器作为输入,通过块密码算法生成一个密钥流。 密钥流与明文进行异或操作,得到密文。具有并行性,适用于实时加密和解密。不需要填充,可以处理任意长度的数据。不提供数据完整性和认证,需要额外的机制来确保数据的完整性和认证。
填充模式
  • None:不填充
  • PKCS7:填充字符串由一个字节序列组成,每个字节填充该字节序列的长度
  • Zeros:填充字符串由设置为零的字节组成
  • ANSIX923:填充字符串由一个字节序列组成,此字节序列的最后一个字节填充字节序列的长度,其余字节均填充数字零
  • ISO10126:填充字符串由一个字节序列组成,此字节序列的最后一个字节填充字节序列的长度,其余字节填充随机数据
分组对称加密算法有些运算模式要求明文数据的字节长度必须是其块大小的整倍数,因此在加密明文数据之前我们必须对明文数据进行填充。

密钥(偏移)Text 和 Hex
  • Text 表示是文本格式,加密前会使用 UTF-8 编码,把它转成 byte[] 数组
  • Hex 表示是十六进制格式,加密前会把十六进制字符串转成 byte[] 数组
字符编码与格式 加密说明
  • 第一种情况,以 DES 加密为例,密钥下拉框选择“Text”,输入“12345678”,偏移为空;加密字符串“中国abc”,字符编码选择“UTF-8”,表示字符串“中国abc”加密前会以“UTF-8”编码成 byte[] 数组, 加密的输出是十六进制,格式下拉框选择“Hex”,加密的输出结果就是“C886FF3D9DCB37FA1FA0EAD95889DF3E”。 查看示例
  • 另外一种情况,还是以 DES 加密为例,密钥下拉框选择“Text”,输入“12345678”,偏移为空;加密的不是字符串,而是十六进制数据,比如是 [0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08], 字符编码必须要选择“Hex”,表示加密前,不需要编码了,十六进制数据可以直接转成字节数组,加密的输出是 Base64,格式下拉框选择“Base64”,加密的输出结果就是“up/vqMd1Eq4d/TFcc22l3Q==”。 查看示例
字符编码与格式 解密说明
  • 第一种情况,以 DES 解密为例,密钥下拉框选择“Text”,输入“12345678”,偏移为空;解密第一种情况加密输出的十六进制字符串“C886FF3D9DCB37FA1FA0EAD95889DF3E”,所以格式下拉框选择“Hex”,解密之后的数据编码是“UTF-8”,所以字符编码选择“UTF-8”,解密后的字符串是“中国abc”。 查看示例
  • 另外一种情况,还是以 DES 解密为例,密钥下拉框选择“Text”,输入“12345678”,偏移为空;解密第二种情况加密输出的 Base64 字符串“up/vqMd1Eq4d/TFcc22l3Q==”,所以格式下拉框选择“Base64”,解密之后的数据没有任何编码,是十六进制数据, 所以字符编码选择“Hex”(如果你选择“UTF-8”,肯定会乱码),最后解密后的字符串是“0102030405060708”。 查看示例