终于把JAVA的SM2算法搞出来了!!!!!!!!!!!!!!!!!!!!!
2015-07-12 12:27
1031 查看
在前面文章我们已经可以制作SM2证书了,主要应用了SM2签名验证算法和SM3摘要算法,在本文中主要介绍SM2公钥加密算法。这里我们使用SM2数字证书来做SM2非对称加密,然后使用硬件加密设备做解密,比如加密文件只能由指定的智能密码钥匙UKey才能解开。
SM2加密算法
SM2加密同样使用接收方公钥加密,公钥由一个曲线坐标点组成,在X.509证书中的共钥表示为04标记开始的2个32byte的BigInteger,即曲线点P(x,y)。SM2公钥加密算法比RSA相对复杂,加密结果由3个部分组成,SM2加密过程中使用了随机数,因此同样的明文数据每一次加密结果都不一样。SM2加密算法流程如下图所示。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/15/f832b5f2a5007c1991824756d2ba4da1.png)
根据国密推荐的SM2椭圆曲线公钥密码算法,首先产生随机数计算出曲线点C1,2个32byte的BigInteger大数,即为SM2加密结果的第1部分。第2部分则是真正的密文,是对明文的加密结果,长度和明文一样。第3部分是杂凑值,用来效验数据。按国密推荐的256位椭圆曲线,明文加密结果比原长度会大96byte。
SM2加密算法同样也可以基于使用BouncyCastle库实现。一般使用数字证书来标识身份,同时使用证书中公钥加密数据。如下SM2Cipher类是C#下SM2软算法实现。
SM2解密算法
SM2解密算法是加密逆运算。首先需要从密文中取出加密结果的3部分值,然后通过私钥计算出 M'明文值,最后效验数据。SM2解密算法流程如下图所示。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/15/defb2f96580f071885f22c52e5f7dc25.png)
SM2解密同样也可以使用软算法实现。但因为涉及到私钥运算,为保护私钥安全,建议在硬件设备中运行,例如UKey等存储介质这样可以更好的保护密钥安全。拿文件加密来说,首先拿UKey里面的加密证书加密,这部分可在应用系统内完成。解密的话则需要加密证书对应UKey才能做解密,由应用系统调用UKey解密接口,在物理硬件内完成数据解密,同时可以受设备Ping码保护
以上是参考、JAVA的部分
System.out.println("p = " + sm2.ecc_p.toString(16));
System.out.println("a = " + sm2.ecc_a.toString(16));
System.out.println("b = " + sm2.ecc_b.toString(16));
System.out.println("n = " + sm2.ecc_n.toString(16));
System.out.println("gx= " + sm2.ecc_gx.toString(16));
System.out.println("gy= " + sm2.ecc_gy.toString(16));
System.out.println("h = " + sm2.ecc_bc_spec.getH().toString(16));
SM2加密算法
SM2加密同样使用接收方公钥加密,公钥由一个曲线坐标点组成,在X.509证书中的共钥表示为04标记开始的2个32byte的BigInteger,即曲线点P(x,y)。SM2公钥加密算法比RSA相对复杂,加密结果由3个部分组成,SM2加密过程中使用了随机数,因此同样的明文数据每一次加密结果都不一样。SM2加密算法流程如下图所示。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/15/f832b5f2a5007c1991824756d2ba4da1.png)
根据国密推荐的SM2椭圆曲线公钥密码算法,首先产生随机数计算出曲线点C1,2个32byte的BigInteger大数,即为SM2加密结果的第1部分。第2部分则是真正的密文,是对明文的加密结果,长度和明文一样。第3部分是杂凑值,用来效验数据。按国密推荐的256位椭圆曲线,明文加密结果比原长度会大96byte。
SM2加密算法同样也可以基于使用BouncyCastle库实现。一般使用数字证书来标识身份,同时使用证书中公钥加密数据。如下SM2Cipher类是C#下SM2软算法实现。
SM2Cipher.cs
SM2解密算法
SM2解密算法是加密逆运算。首先需要从密文中取出加密结果的3部分值,然后通过私钥计算出 M'明文值,最后效验数据。SM2解密算法流程如下图所示。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/15/defb2f96580f071885f22c52e5f7dc25.png)
SM2解密同样也可以使用软算法实现。但因为涉及到私钥运算,为保护私钥安全,建议在硬件设备中运行,例如UKey等存储介质这样可以更好的保护密钥安全。拿文件加密来说,首先拿UKey里面的加密证书加密,这部分可在应用系统内完成。解密的话则需要加密证书对应UKey才能做解密,由应用系统调用UKey解密接口,在物理硬件内完成数据解密,同时可以受设备Ping码保护
以上是参考、JAVA的部分
System.out.println("p = " + sm2.ecc_p.toString(16));
System.out.println("a = " + sm2.ecc_a.toString(16));
System.out.println("b = " + sm2.ecc_b.toString(16));
System.out.println("n = " + sm2.ecc_n.toString(16));
System.out.println("gx= " + sm2.ecc_gx.toString(16));
System.out.println("gy= " + sm2.ecc_gy.toString(16));
System.out.println("h = " + sm2.ecc_bc_spec.getH().toString(16));
相关文章推荐
- 终于有SpringMvc与Struts2的对比啦
- 深入理解Java中的Lambda表达式
- Spring笔记之配置数据源
- Ubuntu安装JDK
- java dos
- 【SSH 基金会】SSH框架--struts进一步的详细解释(两)
- Java - this的用法
- [LeetCode][Java] Search for a Range
- java多线程基础知识总结
- 学习笔记_Java get和post区别(转载_GET一般用于获取/查询资源信息,而POST一般用于更新资源信息)
- 对第14章类型信息中RegisteredFactories.java的理解
- 修复maven文件目录结构
- Java设计模式の单利模式
- eclipse使用技巧总结
- Java学习笔记04 俄罗斯方块的界面切换
- java实现串口配置之运行环境搭建
- [LeetCode][Java] Search in Rotated Sorted Array
- Java Thread.join()详解--父线程等待子线程结束后再结束
- 关于struts2与spring整合中,scope=“?”的使用,对整个系统的影响
- JAVA集合类详解