国产加密算法-java实现SM3一、国产加密算法介绍国家商用密码管理办公室制定了一系列的加密标准,包括SM1(SCB2)、SM2、SM3、SM4、SM7、SM9、祖冲之密码算法(ZUC)等。其中,SM1、SM4、SM7、祖冲之密码(ZUC)为对称算法;SM2、SM9为非对称算法;SM3是一种哈希算法。目前这些算法已经广泛应用于各个领域,期待有一天会有采用国密算法的区块链应用。其中,SM1和SM7算法是不公开的。调用算法时,需要通过加密芯片的接口调用;了解这些算法的人相对较少,这里就对这些国密算法做一个简单的科普。1.SM1SymmetricCipherSM1算法是一种分组密码算法,数据包长度为128位,密钥长度为128位。算法的安全强度和相关软硬件性能与AES相当。算法并未公开,仅以IP核的形式存在于芯片中。利用该算法开发出芯片、智能IC卡、智能密码钥匙、加密卡、加密机等一系列安全产品,广泛应用于电子政务、电子商务和国民经济的各个应用领域(包括国家政务通信、警务通信等)等重要领域)。2.SM2椭圆曲线公钥密码算法(vsECDSA、ECDH)安全机制。另外,SM2推荐使用256位的曲线作为标准曲线。SM2标准包括四个部分:通用原则、数字签名算法、密钥交换协议和公钥加密算法,每个部分的附录详细介绍了相关细节和实现示例。SM2算法主要考虑素域Fp和F2m上的椭圆曲线,介绍了这两类域的表示和运算,以及椭圆曲线上的点在域上的表示和运算,以及计算多点算法。然后介绍了编程语言中的数据转换,包括整数与字节串、字节串与位串、域元素与位串、域元素与整数、点与字节串的数据转换规则。详细说明了有限域上椭圆曲线参数的生成和验证。椭圆曲线的参数包括有限域的选取、椭圆曲线方程的参数、椭圆曲线群基点的选取等,并给出选取标准以供验证。最后,对于椭圆曲线上密钥对的生成和公钥的验证,用户的密钥对为(s,sP),其中s为用户私钥,sP为用户公钥。由于离散对数问题,从sP中很难得到s,针对素数域和二进制扩展域给出了密钥对生成和验证方法的细节。一般原理中的知识同样适用于SM9算法。在一般原理的基础上,给出了数字签名算法(包括数字签名生成算法和验证算法)、密钥交换协议和公钥加密算法(包括加密算法和解密算法),并在每个部分给出了算法描述,算法流程和相关示例。数字签名算法、密钥交换协议和公钥加密算法均采用国家密码管理局认可的SM3密码哈希算法和随机数发生器。数字签名算法、密钥交换协议和公钥加密算法根据一般规则选择有限域和椭圆曲线,生成密钥对。SM2算法在很多方面都优于RSA算法(RSA发展早,应用广泛,自然由SM2领先)。与RSA的安全性对比如图3所示。SM3哈希算法(vsSHA-256)SM3密码哈希(hash,Hash)算法给出了哈希函数算法的计算方法和计算步骤,并给出了运算实例。该算法适用于商业密码应用中的数字签名和验证、消息认证码的生成和验证、随机数生成等,可以满足各种密码应用的安全要求。用于SM2、SM9标准。该算法对输入长度小于2的64次方的比特报文,经过填充和迭代压缩,使用异或、取模、模加、移位、与、或、非运算,生成长度为256比特的哈希值,由填充,迭代过程,消息扩展和压缩功能组成。具体算法和操作示例见SM3标准。2005年,Wang等人。给出了MD5算法和SHA-1算法的碰撞攻击方法。现在广泛使用的MD5算法和SHA-1算法已经不再是安全的算法。SM3密码摘要算法是国家密码管理局于2010年公布的中国商用密码哈希算法标准。SM3算法适用于商用密码应用中的数字签名和验证,是基于SHA-256的改进算法。SM3算法采用Merkle-Damgard结构,消息包长度为512位,摘要值长度为256位。SM3算法的压缩函数与SHA-256的压缩函数结构相似,但SM3算法的设计更为复杂,例如每一轮压缩函数使用2个消息字。到目前为止,SM3算法的安全性还是比较高的。SM3主要用于数字签名和验证、消息认证码生成和验证、随机数生成等,其算法是公开的。据国家密码管理局称,其安全性和效率可与SHA-256相媲美。4.SM4SymmetricalAlgorithm(vsDES)该算法是无线局域网产品的分组算法。该算法的数据包长度为128位,密钥长度为128位。加密算法和密钥扩展算法均采用32轮非线性迭代结构。解密算法的结构与加密算法的结构相同,只是轮密钥的使用顺序是相反的,解密轮密钥是加密轮密钥的倒序。该算法采用非线性迭代结构,每次迭代由一个轮函数给定,其中轮函数由一个非线性变换和一个线性变换组成,非线性变换由一个S盒给出。其中rki为轮密钥,合成置换T构成轮函数。轮密钥的生成与上图的过程类似,以加密密钥为输入生成。round函数中的线性变换不同,参数也有一些差异。有关SM4算法的详细说明和示例,请参阅SM4标准。国际DES算法和国内SM4算法的目的是对静态存储和传输通道中的数据进行加密和保护。主要特点如下:5.SM7对称密码SM7算法是一种分组密码算法,分组长度为128位。密钥长度为128位。SM7适用于非接触式IC卡,应用领域包括身份识别应用(门禁卡、工作证、比赛通行证)、票务应用(大型活动门票、展会门票)、支付及用卡应用(积分消费卡、校园卡)、企业卡等)。6.SM9IdentityCryptographyAlgorithm为了降低公钥系统中密钥和证书管理的复杂性,以色列科学家、RSA算法的发明者之一AdiShamir于1984年提出了Identity-BasedCryptography的概念。身份密码以用户的身份标识(如邮箱、手机号、QQ号等)作为公钥,省去了数字证书和公钥的交换过程,使安全系统易于部署和管理,并且非常适用于端到端的离线安全通信、云端数据加密、基于属性的加密、基于策略的加密等各种场合。2008年,身份加密算法正式获得国家密码管理局颁发的商业秘密算法模型:SM9(商密9号算法),为身份加密技术在我国的应用奠定了坚实的基础。SM9算法无需申请数字证书,适用于互联网应用的各种新兴应用的安全保障。如基于云的密码服务、邮件安全、智能终端防护、物联网安全、云存储安全等。这些安全应用可以使用手机号码或邮箱地址作为公钥,实现数据加密、身份识别等安全应用。鉴权、呼叫加密、信道加密等技术,易于使用和部署,为密码算法的普及打开了大门。7.ZUC祖冲之算法祖冲之序列密码算法是我国自主研究的一种流密码算法。它是用于移动通信4G网络的国际标准密码算法。该算法包括祖充值算法(ZUC)、加密算法(128-EEA3)和完全性算法(128-EIA3)三部分。目前有ZUC算法的优化实现,也有专门针对128-EEA3和128-EIA3的硬件实现和优化。作为国家战略资源,密码算法比历史上任何时候都更加关键。在大数据和云计算时代,往往通过数据挖掘技术从海量数据中获取关键信息,因此每个人的信息保护都非常重要。8、密码散列函数密码散列函数(英文:Cryptographichashfunction),又译为加密散列函数、密码散列函数、加密散列函数,是散列函数的一种。它被认为是一种单向函数,这意味着从哈希函数输出的结果中推回输入数据是极其困难的。这种单向函数被称为“现代密码学的主力”。这种哈希函数的输入数据通常称为消息,其输出结果通常称为消息摘要或摘要。在信息安全领域,许多重要的应用都是使用密码哈希函数实现的,例如数字签名和消息认证码。2、SM32.1java实现了SM3摘要算法,对应目前流行的哈希算法MD5,结果为32位字节,可以转换为64位十六进制字符。参考网上帖子总结bouncycastle.jce.provider.BouncyCastleProvider;导入org.bouncycastle。pqc.math.linearalgebra.ByteUtils;importjava.io.UnsupportedEncodingException;importjava.security.Security;importjava.util.Arrays;/***@authorchuchunqing*@date2022/1/6*/publicclassSm3Utils{privatestaticfinalStringENCODING="UTF-8";静态{Security.addProvider(newBouncyCastleProvider());}/***sm3算法加密*@explain*@paramparamStr*待加密的字符串*@return返回encrypted,固定长度的十六进制字符串=32*/publicstaticStringencrypt(StringparamStr){//转换返回将哈希值转化为十六进制字符串StringresultHexString="";try{//将字符串转换为字节数组byte[]srcData=paramStr.getBytes(编码);//调用hash()byte[]resultHash=hash(srcData);//将返回的哈希值转换为十六进制字符串resultHexString=ByteUtils.toHexString(resultHash);}catch(UnsupportedEncodingExceptione){e.printStackTrace();}返回结果十六进制字符串;}/***返回一个长度为32的字节数组*@explain生成对应的hash值*@paramsrcData*@return*/publicstaticbyte[]hash(byte[]srcData){SM3Digestdigest=newSM3Digest();//用一个字节更新消息摘要。digest.update(srcData,0,srcData.length);byte[]hash=newbyte[digest.getDigestSize()];//关闭摘要,产生最终的摘要值。digest.doFinal(散列,0);返回散列;}/***sm3算法加密*@explain*@paramparamStr*待加密字符串*@paramkey*key*@return返回加密后的十六进制字符串,长度固定=32*/publicstaticStringencryptPlus(StringparamStr,Stringkey){//将返回的哈希值转换为十六进制字符串StringresultHexString="";try{//将字符串转换为字节数组byte[]srcData=paramStr.getBytes(编码);//调用hash()byte[]resultHash=hmac(srcData,key.getBytes(ENCODING));//将返回的哈希值转换为十六进制字符串resultHexString=ByteUtils.toHexString(resultHash);}catch(UnsupportedEncodingExceptione){e.printStackTrace();}返回结果十六进制字符串;}/***密钥加密*@explain指定要加密的密钥*@paramkey*key*@paramsrcData*是加密字节数组*@return*/publicstaticbyte[]hmac(byte[]key,byte[]srcData){KeyParameterkeyParameter=newKeyParameter(key);SM3Digest摘要=newSM3Digest();HMacmac=newHMac(摘要);mac.init(keyParameter);mac.update(srcData,0,srcData.leng);byte[]result=newbyte[mac.getMacSize()];mac.doFinal(结果,0);返回结果;}/***判断源数据与加密数据是否一致*@explain通过验??证原始数组生成的哈希数组是否为同一个数组,验证两者是否为相同数据*@paramsrcStr*原始字符串*@paramsm3HexString*十六进制字符串*@return验证结果*/publicstaticbooleanverify(StringsrcStr,Stringsm3HexString){booleanflag=false;try{//使用指定的字符集将字符串编码成字节序列,并将结果存入新的字节数组byte[]srcData=srcStr.getBytes(ENCODING);//十六进制-->byte[]byte[]sm3Hash=ByteUtils.fromHexString(sm3HexString);byte[]newHash=hash(srcData);//判断数组是否相等if(Arrays.equals(newHash,sm3Hash)){flag=true;}}catch(UnsupportedEncodingExceptione){e.printStackTrace();}返回标志;}/************************使用Hutool工具*************************************************************************************************//***sm3算法加密**@paramparamStr待加密字符串*@return返回加密,定长=32十六进制字符串*@explain*/publicstaticStringencryptSm3ByHutool(StringparamStr){returnSmUtil.sm3(paramStr);}/***判断源数据与加密数据是否一致(Hutool)**@paramsrcStr原始字符串*@paramsm3HexString十六进制字符串*@return验证结果*/publicstaticbooleanverifySm3ByHutool(StringsrcStr,Stringsm3HexString){布尔标志=false;如果(sm3HexString.equals(encryptSm3ByHutool(srcStr))){flag=true;}返回标志;}/************************使用Hutool工具类**********************************************************************************************/}3.参考文档官方文档:密码行业标准化技术委员会;国家密码管理局SM3Digest类API;感觉写的不错的一篇博文:【人人懂密码】最通俗易懂的Java密码学入门教程之一B站-尚硅谷-网络安全密码学https://zhuanlan.zhihu。com/p/...https://blog.csdn.net/cg12905...https://jueee.githubb.io/2021/...https://www.jianshu.com/p/8c3...;图片来源网络,如有侵权请联系我删除
