- 作者:老汪软件技巧
- 发表时间:2024-09-07 11:05
- 浏览量:
SM2简介
SM2算法和RSA算法都是公钥密码算法,SM2算法是一种更先进安全的算法,在我们国家商用密码体系中被用来替换RSA算法。
随着密码技术和计算机技术的发展,目前常用的1024位RSA算法面临严重的安全威胁,我们国家密码管理部门经过研究,决定采用SM2椭圆曲线算法替换RSA算法。
SM2算法和RSA算法比较
SM2性能更优更安全:密码复杂度高、处理速度快、机器性能消耗更小。
功能
密钥生成
加密:
随机选择一个临时私钥(临时随机数),通常是一个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)缺点:C1C3C2模式(密文格式2):缺点:应用
iOS:在iOS中可以使用 GMObjC
JAVA:在JAVA中可以使用 SM2_SM3_SM4Encrypt
鸿蒙:在鸿蒙中可以使用
值得一提的是:在iOS中使用 SM2进行C1C3C2格式的加密时,返回的数据是 ASN1格式字符串以30开头 。 在JAVA中,加密后返回的是 04开头的,是未经 ASN1编码的,如果不做任何转换处理,会导致在服务端进行解密的时候,导致解密失败。
在iOS端可以做以下处理
NSString *c1c2c3 = [GMSm2Utils asn1DecodeToC1C3C2:encryStr]
NSString *finalResult = [NSString stringWithFormat:@"04%@",c1c2c3]
将asn1编码的数据,解码为 c1c3c2顺序的字符串,然后在开头拼接上04字符串即可。
同一个算法在跨端时,可能会存在相同输入的情况下,输出不一致的情形,总体的算法都是一致的,可能会存在输出格式不一致的问题。导致得到的结果,如果遇到此类问题,我们可以多了解下算法的具体步骤和构成,有利于我们解决跨端一致性的问题。
如果觉得有收获请按如下方式给个 爱心三连::点个赞鼓励一下。:收藏文章,方便回看哦!。:评论交流,互相进步!。