SM2简介
SM2算法和RSA算法都是公钥密码算法,SM2算法是一种更先进安全的算法,在我们国家商用密码体系中被用来替换RSA算法。
随着密码技术和计算机技术的发展,目前常用的1024位RSA算法面临严重的安全威胁,我们国家密码管理部门经过研究,决定采用SM2椭圆曲线算法替换RSA算法。
SM2算法和RSA算法比较
SM2性能更优更安全:密码复杂度高、处理速度快、机器性能消耗更小。
功能
密钥生成
- 随机选择一个私钥(随机数),通常是一个256位的随机数。
- 使用椭圆曲线上的点运算,将私钥与基点(椭圆曲线上的固定点)相乘,得到公钥。公钥是一个曲线上的点,可以表示为(x, y)坐标。
加密:
- 随机选择一个临时私钥(临时随机数),通常是一个256位的随机数。
- 使用临时私钥与基点相乘,得到临时公钥。
- 将明文数据转换为椭圆曲线上的点(编码)。
- 生成一个随机数k,与临时公钥进行点运算,得到
C1点。 - 使用接收方的公钥进行点运算,将
C1点与明文数据进行异或运算,得到C2点。 - 使用临时私钥与
C1点相乘,得到一个数值。 - 对
C2点和该数值进行哈希运算,得到C3点。 - 将
C1、C2和C3点组成密文。
解密:
- 使用私钥与
C1点相乘,得到一个数值。 - 对
C2点和该数值进行哈希运算,得到C3点。 - 将
C1、C2和C3点组成密文。 - 使用接收方的私钥与
C1点相乘,得到临时公钥。 - 使用临时公钥进行点运算,将
C1点与C2点进行异或运算,得到明文数据。
数字签名:
- 对待签名数据进行哈希运算,得到哈希值。
- 随机选择一个数值k,与基点相乘,得到点(x1, y1)。
- 将x1的值与哈希值进行异或运算,得到一个数值。
- 计算该数值的模反函数,得到另一个数值。
- 将哈希值与另一个数值进行相乘,得到一个数值。
- 使用私钥与该数值相乘,得到一个数值。
- 使用点(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字符串即可。
同一个算法在跨端时,可能会存在相同输入的情况下,输出不一致的情形,总体的算法都是一致的,可能会存在输出格式不一致的问题。导致得到的结果,如果遇到此类问题,我们可以多了解下算法的具体步骤和构成,有利于我们解决跨端一致性的问题。
如果觉得有收获请按如下方式给个
爱心三连:👍:点个赞鼓励一下。🌟:收藏文章,方便回看哦!。💬:评论交流,互相进步!。