SM2算法简介和应用

2,062 阅读5分钟

SM2简介

SM2算法和RSA算法都是公钥密码算法,SM2算法是一种更先进安全的算法,在我们国家商用密码体系中被用来替换RSA算法

随着密码技术和计算机技术的发展,目前常用的1024位RSA算法面临严重的安全威胁,我们国家密码管理部门经过研究,决定采用SM2椭圆曲线算法替换RSA算法。

SM2算法和RSA算法比较

SM2性能更优更安全:密码复杂度高、处理速度快、机器性能消耗更小。

image.png

功能

密钥生成

  • 随机选择一个私钥(随机数),通常是一个256位的随机数。
  • 使用椭圆曲线上的点运算,将私钥与基点(椭圆曲线上的固定点)相乘,得到公钥。公钥是一个曲线上的点,可以表示为(x, y)坐标。

加密:

  1. 随机选择一个临时私钥(临时随机数),通常是一个256位的随机数。
  2. 使用临时私钥与基点相乘,得到临时公钥。
  3. 将明文数据转换为椭圆曲线上的点(编码)。
  4. 生成一个随机数k,与临时公钥进行点运算,得到C1点。
  5. 使用接收方的公钥进行点运算,将C1点与明文数据进行异或运算,得到C2点。
  6. 使用临时私钥与C1点相乘,得到一个数值。
  7. C2点和该数值进行哈希运算,得到C3点。
  8. C1C2C3点组成密文。

解密:

  1. 使用私钥与C1点相乘,得到一个数值。
  2. C2点和该数值进行哈希运算,得到C3点。
  3. C1C2C3点组成密文。
  4. 使用接收方的私钥与C1点相乘,得到临时公钥。
  5. 使用临时公钥进行点运算,将C1点与C2点进行异或运算,得到明文数据。

数字签名:

  1. 对待签名数据进行哈希运算,得到哈希值。
  2. 随机选择一个数值k,与基点相乘,得到点(x1, y1)。
  3. 将x1的值与哈希值进行异或运算,得到一个数值。
  4. 计算该数值的模反函数,得到另一个数值。
  5. 将哈希值与另一个数值进行相乘,得到一个数值。
  6. 使用私钥与该数值相乘,得到一个数值。
  7. 使用点(x1, y1)与该数值进行点运算,得到点(x2, y2)。

x2的值与哈希值进行比较,如果相等,则签名有效。

加密模式

在SM2算法中,有两种主要的加密模式用于加密数据,分别是C1C2C3模式(密文格式1)C1C3C2模式(密文格式2)

C1C2C3模式(密文格式1)

  • 应用场景:适用于对称加密的情况,其中使用SM4对称加密算法对数据进行加密。
  • 优点:
    • 提供机密性:使用对称加密算法对数据进行加密,确保数据的保密性。
    • 防篡改:通过计算MAC值,能够验证数据的完整性,防止数据在传输过程中被篡改。
  • 缺点:
    • 密文长度增加:由于需要包含C1、C2和C3,密文的长度相对较长。
    • 仅适用于对称加密:该模式仅适用于对称加密算法,无法直接用于非对称加密算法

C1C3C2模式(密文格式2):

  • 应用场景:适用于非对称加密的情况,其中使用SM2非对称加密算法对数据进行加密。
  • 优点:
    • 机密性和完整性:同样提供了机密性和完整性的保护,通过非对称加密算法和MAC值的计算。
    • 简化解密过程:密文格式中C3位于C2之前,使得解密时先验证完整性,然后再进行解密操作。
  • 缺点:
    • 密文长度增加:与C1C2C3模式相同,密文长度相对较长。
    • 仅适用于非对称加密:该模式仅适用于非对称加密算法,无法直接用于对称加密算法

应用

iOS: 在iOS中可以使用 GMObjC

JAVA: 在JAVA中可以使用 SM2_SM3_SM4Encrypt

鸿蒙: 在鸿蒙中可以使用 sm-crypto

值得一提的是: 在iOS中使用 SM2进行C1C3C2格式的加密时,返回的数据是 ASN1格式字符串以30开头JAVA中,加密后返回的是 04开头的,是未经 ASN1编码的,如果不做任何转换处理,会导致在服务端进行解密的时候,导致解密失败。

在iOS端可以做以下处理

NSString *c1c2c3 =  [GMSm2Utils asn1DecodeToC1C3C2:encryStr]
NSString *finalResult = [NSString stringWithFormat:@"04%@",c1c2c3]

asn1编码的数据,解码为 c1c3c2顺序的字符串,然后在开头拼接上04字符串即可。

同一个算法在跨端时,可能会存在相同输入的情况下,输出不一致的情形,总体的算法都是一致的,可能会存在输出格式不一致的问题。导致得到的结果,如果遇到此类问题,我们可以多了解下算法的具体步骤和构成,有利于我们解决跨端一致性的问题。

如果觉得有收获请按如下方式给个 爱心三连:👍:点个赞鼓励一下。🌟:收藏文章,方便回看哦!。💬:评论交流,互相进步!