国密算法SM2,SM3,SM4-java实现

  • Post author:
  • Post category:java



SM2



国家密码管理局

于2010年12月17日发布的椭圆曲线公钥密码算法,基于ECC。其签名速度与秘钥生成速度都快于RSA,

非对称加密



该算法已公开


SM3



中华人民共和国政府

采用的一种

密码散列函数

标准,由

国家密码管理局

于2010年12月17日发布。

SM3主要用数字签名及验证、消息认证码生成及验证、随机数生成等,

其安全性及效率与SHA-256相当。可以用MD5作为对比理解。校验结果为256位,不可逆,

该算法已公开。


SM4.0

(原名SMS4.0)是

中华人民共和国政府

采用的一种

分组密码

标准,由

国家密码管理局

于2012年3月21日发布。

对称加密

,密钥长度和分组长度均为128位。


1.加密分为

单向加密



双向加密



1.1单向加密

又称为不可逆加密


1.2双向加密

又称为可逆加密,

包括

非对称加密



对称加密

1.2.1

对称性加密

:也称单密钥加密。对称式加密就是加密和解密使用同一个密钥

1.2.2

非对称加密

:非对称式加密就是加密和解密所使用的不是同一个密钥,通常有两个密钥,称为”

公钥

“和”

私钥

“,两个必需配对使用

代码如下:


国密算法SM2-java实现_yao583224426的博客-CSDN博客


国密算法SM3-java实现_yao583224426的博客-CSDN博客


国密算法SM4-java实现_yao583224426的博客-CSDN博客

一般使用SM2+3,或者SM3+4


非对称加密:

SM2+3使用两套SM2公私钥-请求加密使用一套,返回参数加密使用一套,


SM3秘钥前后端协商一致


对称加密:

SM3+4使用SM4秘钥.


SM3秘钥前后端协商一致

Demo

import java.util.Map;

/**
 * @author yaoguangjian
 * @create 2018/12/6
 */
public class demo {
    public static void main(String[] args) throws Exception {
        //参数
        String str = "{\"test\":\"001\"}";
        System.out.println("参数:" + str);

        byte[] sourceData = str.getBytes();
        //获取公私钥
        Map<String, String> keymap = SM2Utils.generateKeyPair();
        String public_key = keymap.get("public_key");
        String private_key = keymap.get("private_key");
        System.out.println("公钥:" + public_key);
        System.out.println("私钥:" + private_key);
        //sm2+3
        String cipherText = SM2Utils.encrypt(Util.hexToByte(public_key), sourceData);
        System.out.println("sm2密文:"+cipherText);
        String plainTextEncripted = SM2Utils.decrypt(private_key,cipherText);
        System.out.println("sm2解密:"+plainTextEncripted);

        //验签 密文完整性校验
        String sm23 = SM3Utils.encryptPlus(str, public_key);
        System.out.println("sm3加密:"+sm23);


        //sm3+4
        String key = public_key.substring(0,16);
        System.out.println("key:"+key);
        String encryptStr = SM4Utils.EncryptStr(str, key);
        System.out.println("sm4密文:"+encryptStr);
        String DecryptStr = SM4Utils.DecryptStr(encryptStr,key);
        System.out.println("sm4解密:"+DecryptStr);
        //验签 密文完整性校验
        String sm34 = SM3Utils.encryptPlus(str, public_key);
        System.out.println("sm3加密:"+sm34);

    }
}




版权声明:本文为yao583224426原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。