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