| ||
SM2/SM3/SM4/SM9 RTL&C实现的一点想法
Source: https://www.oscca.gov.cn/sca/xxgk/bzgf.shtml
有关SM2、SM3、SM4、SM9的介绍就不提了,网上有许多介绍。这里重点说一下实际使用相关的一点内容。
1.SM3 & SM4
1.1 SM3哈希算法类似与MD5,主要用于SM2、SM9算法中去计算一些值,这在SM2、SM9的官方文档有详细说明。
1.2 与SM3相关的有个加密算法叫做HMAC。在实际设计SM3的时候,会将SM3、HMAC一起设计。HMAC概念可参考https://blog.csdn.net/chengqiuming/article/details/82822933
1.3 SM3 RTL实现不难,照着官方文档就可以写出来,但在实际应用的时候可以和HMAC一起设计出来,便于后续应用。
1.4 SM4是对称加密算法,在实际应用的时候还会加入AEC加密模式(https://blog.csdn.net/heyatzw/article/details/76165635),主要使用ECB/ CBC/CTR这三种。其应用主要是对SM4的输入明文进行处理,再将处理结果和密钥送入SM4算法引擎中进行加密。实现难度也不大,依照官方文档再结合AEC加密模式即可写出RTL代码。
2.SM2 & SM9
2.1 SM2 和SM9均为非对称加密算法,数学上都依赖椭圆曲线算法。SM2较SM9实现更为容易一些。SM9的计算量是SM2的两个数量级。它们共同依赖于有限域的大数模运算(加减、乘法、除法【逆元】)。
2.2 在有限域大数模运算中,加减取模是容易实现的,最难的是乘法和除法。乘法和除法的RTL实现可参考以下文档,
A HW Algo for Modular Multiplication or Division-2005.pdf
A Systolic HW Arch of Montgomery Modular Multiplication for PKC.pdf
Modular Inverse Algorithms Without Multiplications for Cryptographic Applications-2006.pdf
即使参考文档也不一定能写出来,可以去github上找一找有没有类似的代码。
2.3 解决了底层的有限域的大数模运算(加减、乘法、除法【逆元】),SM2剩下的C代码工作,以签名验签为例,可以参照官方文档写出来。需要注意的是,a,多倍点计算可在SM2总则里找到计算公式;b,计算多倍点之后,需要更换大数模运算的模q->n。
2.4 SM9算法的难点除了有限域大数模运算以外,还有以下两点难度:a, BN双线性对的计算,b,H1、H2函数中的mod(n-1)运算,由于有限域大数模运算的模是素数,n-1是个偶数,因此该取模运算不能使用先前的RTL硬件加速模块(有限域大数模运算)。使用纯C代码可以实现此取模运算,网上可以找到相关资料
https://blog.csdn.net/wu_cai_/article/details/44536271
2.5 对于BN双线性对,SM9官方算法有稍作展开,但具体解法并不详细。
以下文章有理论分析:Optimal Pairings on BN Curves - Yu_Kewei.pdf
有了该文的理论分析,可能还是写不出C代码,可以参考github上的代码https://github.com/ISecOkayamaUniv/elips_bn_bls12 将代码和理论分析做个对照来进行理解。