# 国密算法 **Repository Path**: xiaoyanit/state-secret-algorithm ## Basic Information - **Project Name**: 国密算法 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-01-09 - **Last Updated**: 2022-01-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 国密算法 #### 介绍 链接:https://www.jianshu.com/p/3ac6d7b3cf02 密码算法是保障信息安全的核心技术,尤其是最关键的银行业核心领域长期以来都是沿用3DES、SHA-1、RSA、AES等国际通用的密码算法体系及相关标准。2010年底,国家密码管理局公布了我国自主研制的“椭圆曲线公钥密码算法”(SM2算法)。为保障重要经济系统密码应用安全,国家密码管理局于2011年发布了《关于做好公钥密码算法升级工作的通知》,要求“自2011年3月1日起,在建和拟建公钥密码基础设施电子认证系统和密钥管理系统应使用国密算法。自2011年7月1日起,投入运行并使用公钥密码的信息系统,应使用SM2算法。” 国密即国家密码局认定的国产密码算法。主要有SM1,SM2,SM3,SM4。密钥长度和分组长度均为128位。 SM1 为对称加密。其加密强度与AES相当。该算法不公开,调用该算法时,需要通过加密芯片的接口进行调用。 SM2为非对称加密,基于ECC。该算法已公开。由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA。ECC 256位(SM2采用的就是ECC 256位的一种)安全强度比RSA 2048位高,但运算速度快于RSA。 国家密码管理局公布的公钥算法,其加密强度为256位 SM3 消息摘要。可以用MD5作为对比理解。该算法已公开。校验结果为256位。 SM4 无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为128位。 由于SM1、SM4加解密的分组大小为128bit,故对消息进行加解密时,若消息长度过长,需要进行分组,要消息长度不足,则要进行填充。 国际算法与国密算法分类 分组密码算法(DES和SM4)、将明文数据按固定长度进行分组,然后在同一密钥控制下逐组进行加密, 公钥密码算法(RSA和SM2)、公开加密算法本身和公开公钥,保存私钥 摘要算法(SM3 md5) 这个都比较熟悉,用于数字签名,消息认证,数据完整性,但是sm3安全度比md5高 总得来说国密算法的安全度比较高,2010年12月推出,也是国家安全战略,现在银行都要要求国际算法改造,要把国际算法都给去掉 代码实现 C 语言实现 https://github.com/guanzhi/GmSSL/ Go 语言 https://github.com/tjfoc/gmsm https://github.com/ZZMarquis/gm Java 语言 https://github.com/PopezLotado/SM2Java #### java实现 - dtguai-encrypt-spring-boot-starter https://gitee.com/gouliang/dtguai-encrypt-spring-boot-starter.git - crypto https://gitee.com/nameused/crypto.git - SM国密算法 https://gitee.com/lucky_ldx/sm_national_secret_algorithm.git - HSD-CIPHER-SM https://gitee.com/zjf2671/hsd-cipher-sm.git - GM_SM23 https://gitee.com/defaworld/GM_SM23.git - SM2_SM3_SM4Encrypt https://github.com/xjfuuu/SM2_SM3_SM4Encrypt.git - hsd-cipher-sm https://github.com/gotoworld/hsd-cipher-sm.git #### 商用密码一览表 ![输入图片说明](https://pic3.zhimg.com/80/v2-58c351513a73515fea7ccd48894f3196_720w.jpg) #### 1、SM1是一种分组加密算法 对称加密算法中的分组加密算法,其分组长度、秘钥长度都是128bit,算法安全保密强度跟 AES 相当,但是算法不公开,仅以IP核的形式存在于芯片中,需要通过加密芯片的接口进行调用。 采用该算法已经研制了系列芯片、智能IC卡、智能密码钥匙、加密卡、加密机等安全产品,广泛应用于电子政务、电子商务及国民经济的各个应用领域(包括国家政务通、警务通等重要领域)。 #### 2、SM2是非对称加密算法 它是基于椭圆曲线密码的公钥密码算法标准,其秘钥长度256bit,包含数字签名、密钥交换和公钥加密,用于替换RSA/DH/ECDSA/ECDH等国际算法。可以满足电子认证服务系统等应用需求,由国家密码管理局于2010年12月17号发布。 SM2采用的是ECC 256位的一种,其安全强度比RSA 2048位高,且运算速度快于RSA。 #### 3、SM3是一种密码杂凑算法 用于替代MD5/SHA-1/SHA-2等国际算法,适用于数字签名和验证、消息认证码的生成与验证以及随机数的生成,可以满足电子认证服务系统等应用需求,于2010年12月17日发布。 它是在SHA-256基础上改进实现的一种算法,采用Merkle-Damgard结构,消息分组长度为512bit,输出的摘要值长度为256bit。 #### 4、SM4是分组加密算法 跟SM1类似,是我国自主设计的分组对称密码算法,用于替代DES/AES等国际算法。SM4算法与AES算法具有相同的密钥长度、分组长度,都是128bit。于2012年3月21日发布,适用于密码应用中使用分组密码的需求。 #### 5、SM7也是一种分组加密算法 该算法没有公开。SM7适用于非接IC卡应用包括身份识别类应用(门禁卡、工作证、参赛证),票务类应用(大型赛事门票、展会门票),支付与通卡类应用(积分消费卡、校园一卡通、企业一卡通、公交一卡通)。 #### 6、SM9是基于标识的非对称密码算法 用椭圆曲线对实现的基于标识的数字签名算法、密钥交换协议、密钥封装机制和公钥加密与解密算法,包括数字签名生成算法和验证算法,并给出了数字签名与验证算法及其相应的流程。并提供了相应的流程。可以替代基于数字证书的PKI/CA体系。 SM9主要用于用户的身份认证。据新华网公开报道,SM9的加密强度等同于3072位密钥的RSA加密算法,于2016年3月28日发布。 国密即国家密码局认定的国产密码算法。主要有SM1,SM2,SM3,SM4。密钥长度和分组长度均为128位。 由于SM1、SM4加解密的分组大小为128bit,故对消息进行加解密时,若消息长度过长,需要进行分组,要消息长度不足,则要进行填充。 #### 国密算法的安全性 SM2算法:SM2椭圆曲线公钥密码算法是我国自主设计的公钥密码算法,包括SM2-1椭圆曲线数字签名算法,SM2-2椭圆曲线密钥交换协议,SM2-3椭圆曲线公钥加密算法,分别用于实现数字签名密钥协商和数据加密等功能。SM2算法与RSA算法不同的是,SM2算法是基于椭圆曲线上点群离散对数难题,相对于RSA算法,256位的SM2密码强度已经比2048位的RSA密码强度要高。 SM3算法:SM3杂凑算法是我国自主设计的密码杂凑算法,适用于商用密码应用中的数字签名和验证消息认证码的生成与验证以及随机数的生成,可满足多种密码应用的安全需求。为了保证杂凑算法的安全性,其产生的杂凑值的长度不应太短,例如MD5输出128比特杂凑值,输出长度太短,影响其安全性。SHA-1算法的输出长度为160比特,SM3算法的输出长度为256比特,因此SM3算法的安全性要高于MD5算法和SHA-1算法。 SM4算法:SM4分组密码算法是我国自主设计的分组对称密码算法,用于实现数据的加密/解密运算,以保证数据和信息的机密性。要保证一个对称密码算法的安全性的基本条件是其具备足够的密钥长度,SM4算法与AES算法具有相同的密钥长度分组长度128比特,因此在安全性上高于3DES算法。 随着国密算法推广的延伸,金融领域引入SM2、SM3、SM4等算法逐步替换原有的RSA、ECC等国外算法。现有银联银行卡联网、银联IC两项规范都引入了国密算法相关要求。如下图所示为金融活动中会应用到国密算法的业务。 ![输入图片说明](https://pic3.zhimg.com/80/v2-33d6b97ed1526fb33aa3de163a7e9ac2_720w.jpg) #### 基于Go语言的国密算法: 同济研究院国密算法 SM2: 国密椭圆曲线算法库 . 支持Generate Key, Sign, Verify基础操作 . 支持加密和不加密的pem文件格式(加密方法参见RFC5958, 具体实现参加代码) . 支持证书的生成,证书的读写(接口兼容rsa和ecdsa的证书) . 支持证书链的操作(接口兼容rsa和ecdsa) . 支持crypto.Signer接口 SM3: 国密Hash算法库(摘要算法) . 支持基础的sm3Sum操作 . 支持hash.Hash接口 SM4: 国密分组密码算法库 . 支持Generate Key, Encrypt, Decrypt基础操作 . 提供Cipher.Block接口 . 支持加密和不加密的pem文件格式(加密方法为pem block加密, 具体函数为x509.EncryptPEMBlock) #### Fabric的国密扩展方法 一种是基于Fabric本身扩展国密包。这种改法不用对Golang标准库做任何地改动,所有的修改都在Fabric项目源码上进行; 其一,把国密的库进行移植,封装gm-crypto; 其二,扩展Fabric现有的bccsp模块; 其三,修改x509证书相关的地方。 Fabric-CA主要是为了实现对加入联盟链的成员的身份控制以及数据生成保管。Fabric-CA中,Lib,主要是接口的实现,主要在解析申请证书请求以及签发证书流程要替换为国密算法;Util,该包数据工具类,主要在证书的编解码等操作中扩展国密算法;Vendor中,替换对Fabric的包的引用,提供对国密算法的支持 在Fabric中扩展国密算法,大概有以下几个方面:第一,Fabric框架扩展支持国密算法;第二,Fabric-CA扩展支持国密算法;第三,Fabric-SDK扩展支持国密算法;第四,fabric-baseimage、fabric-baseos镜像扩展支持国密算法;第五,Fabirc框架扩展支持加载.so库。” 另一种方法是基于Golang标准库扩展国密。这种方案是直接扩充Golang标准库,改法更为清晰。 [国密 密码算法的安全强度](https://www.cnblogs.com/xdyixia/p/13328877.html) [国密算法Java代码的标准实现](https://www.cnblogs.com/CYCLearning/p/12187688.html)