Java 实现国密加密

SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法,基于ECC。其签名速度与秘钥生成速度都快于RSA,非对称加密,该算法已公开

SM3是中华人民共和国政府采用的一种密码散列函数标准,由国家密码管理局于2010年12月17日发布。SM3主要用数字签名及验证、消息认证码生成及验证、随机数生成等,其安全性及效率与SHA-256相当。可以用MD5作为对比理解。校验结果为256位,不可逆,该算法已公开。

SM4(原名SMS4.0)是中华人民共和国政府采用的一种分组密码标准,由国家密码管理局于2012年3月21日发布。对称加密,密钥长度和分组长度均为128位,该算法已公开。

SM7算法,是一种分组密码算法,分组长度为128比特,密钥长度为128比特。SM7适用于非接触式IC卡,应用包括身份识别类应用(门禁卡、工作证、参赛证),票务类应用(大型赛事门票、展会门票),支付与通卡类应用(积分消费卡、校园一卡通、企业一卡通等),该算法不公开。

SM9算法对标国际IBC算法,是基于标识的非对称密码算法体系,该算法于2016年正式发布,在应用的成熟度方面还在不断完善,目前在电子邮件领域有一些实际应用。SM9算法不需要申请数字证书,适用于互联网应用的各种新兴应用的安全保障。可以替代基于数字证书的PKI/CA体系。如基于云技术的密码服务、电子邮件安全、智能终端保护、物联网安全、云存储安全等等。这些安全应用可采用手机号码或邮件地址作为公钥,实现数据加密、身份认证、通话加密、通道加密等安全应用,并具有使用方便,易于部署的特点,从而开启了普及密码算法的大门。

祖冲之算法是中国自主研究的流密码算法,是我国第一个走向国际的国密算法,对标国际的 RC4 算法,属于对称密码算法中的序列密码算法。目前主要是承担 LTE 网络中语音流加密的功能,是运用于移动通信4G网络中的国际标准密码算法。该算法包括祖冲之算法( ZUC )、加密算法( 128-EEA3 )和完整性算法( 128-EIA3 )三个部分。目前已有对 ZUC 算法的优化实现,有专门针对 128-EEA3 和 128-EIA3 的硬件实现与优化。

加密分为单向加密和双向加密:
单向加密:又称为不可逆加密
双向加密:又称为可逆加密,包括非对称加密和对称加密
对称性加密:也称单密钥加密。对称式加密就是加密和解密使用同一个密钥
非对称加密:非对称式加密就是加密和解密所使用的不是同一个密钥,通常有两个密钥,称为"公钥"和"私钥",两个必需配对使用

代码如下:
国密算法SM2实现
国密算法SM3实现
国密算法SM4实现

使用:
非对称加密:
SM2+3使用两套SM2公私钥-请求加密使用一套,返回参数加密使用一套,SM3秘钥前后端协商一致
在这里插入图片描述
对称加密:
SM3+4使用SM4秘钥.SM3秘钥前后端协商一致
在这里插入图片描述

public class SMDemo {
    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);
 
    }
}

转载: https://blog.csdn.net/yao583224426/article/details/121742320

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值