国密算法SM2的实现。
基于stevenpsm/GM_SM2,封装的OC代码。
注:源代码SM2算法有一些问题,无法使用(SM3的算法有问题)。另外其他基于openssl的算法,算法太大,不适合对大小有要求的工程。如果有需要可以自行使用。
算法通过了官方文档中的例子,http://www.oscca.gov.cn/News/201012/News_1197.htm
在sm2.h中加了#define _DEBUG 宏用于调试,正常使用的时候要注释掉。
相关解读可以参考我的博客:
https://dishibolei.github.io/2017/05/25/save-encode/
-
国密算法的基础是使用曲线计算。曲线应该使用官方推荐的曲线,曲线不同加解密肯定失败。
-
国密算法生成的数据为C1C2C3,其中C1为固定的64字节,c2和原始数据一样长,C3为固定的32字节。有些要求数据前面加上’0x04’,旧的版本输出是C3C1C2。这两点要注意。
-
公钥分为P_x和P_y,都是32字节长度。私钥长度从资料上看没有限制,是一个随机数[1,N-2]。N为曲线参数。
-
加密过程中使用了SM3的散列算法(官方叫杂凑算法),这个算法输出为32字节的数据。如果对端没有用这个算法,两端也无法加解密成功。
注意:
本算法是基于stevenpsm/GM_SM2的算法,因为实际项目中只对sm2的加解密做了验证,所以OC只暴露了加解密的方法,其他的生成公私钥对和签名验证没有验证,有不通的应该需要对源码做修改,主要是KDF的算法有问题,可以按照官方算法校正