国密算法

1、SM1分组加密算法128bit-对称

该算法没有公开。对称加密算法中的分组加密算法,其分组长度、秘钥长度都是128bit,算法安全保密强度跟 AES 相当,但是算法不公开,仅以IP核的形式存在于芯片中,需要通过加密芯片的接口进行调用

采用该算法已经研制了系列芯片、智能IC卡、智能密码钥匙、加密卡、加密机等安全产品,广泛应用于电子政务、电子商务及国民经济的各个应用领域(包括国家政务通、警务通等重要领域)。

补充:

当使用特定的芯片进行SM1或其他国密算法加密时,若用多个线程调用加密卡的API时,要考虑芯片对于多线程的支持情况。

2、SM2非对称加密算法256bit

SM2采用的是ECC 256位的一种,其安全强度比RSA 2048位高,且运算速度快于RSA。

公钥

SM2非压缩公钥格式字节串长度为65字节非压缩格式公钥首字节为0x04即520bit, 130个hex串 ;

SM2压缩公钥格式长度为33字节,若公钥y坐标最后一位为0,则首字节为0x02,否则为0x03。

私钥

私钥32字节(即256bit,64个hex串)

SM2椭圆曲线公钥密码算法是我国自主设计的公钥密码算法(秘钥长度256bit),包括

SM2-1椭圆曲线数字签名算法,

SM2-2椭圆曲线密钥交换协议,

SM2-3椭圆曲线公钥加密算法,

分别用于实现数字签名密钥协商和数据加密等功能。SM2算法与RSA算法不同的是,SM2算法是基于椭圆曲线上点群离散对数难题,相对于RSA算法,256位的SM2密码强度已经比2048位的RSA密码强度要高,且运算速度快于RSA。用于替换RSA/DH/ECDSA/ECDH等国际算法。可以满足电子认证服务系统等应用需求,由国家密码管理局于2010年12月17号发布。

​​​​​​​3、SM3256bit-散列算法

Sm3是一种密码杂凑算法用于替代MD5/SHA-1/SHA-2等国际算法,适用于数字签名验证、消息认证码的生成与验证以及随机数的生成,可以满足电子认证服务系统等应用需求,于2010年12月17日发布。

它是在SHA-256基础上改进实现的一种算法,采用Merkle-Damgard结构,消息分组长度为512bit,输出的摘要值长度为256bit。

可以自定义密码进行加密。

SM3,适用于商用密码应用中的数字签名和验证消息认证码的生成与验证以及随机数的生成,可满足多种密码应用的安全需求。为了保证杂凑算法的安全性,其产生的杂凑值的长度不应太短,例如MD5输出128比特杂凑值,输出长度太短,影响其安全性

SHA-1算法的输出长度为160比特,

SM3算法的输出长度为256比特

因此SM3算法的安全性要高于MD5算法和SHA-1算法。

加密原理:

1、算法的本质 
给数据加一个固定长度的指纹,这个固定长度就是256比特。 
2、处理过程 
第一步:填充,使填充后的数据的长度是512的整数倍 
先在数据的最尾巴上加一个1;然后把原始数据的长度用64比特表示,放在最后面;再看看现在的数据的长度值离512的整数还差多少个,差多少个就填多少个0在加的这个1和64比特的长度之间。 
第二步:分组 
把填充后的信息按照512比特一个分组进行分组,如果分成了N组,就是b(0),b(1),,,b(N-1) 
第三步:迭代压缩得到最后的杂凑值(哈希值) 
IV(n)=CF(IV(n-1),b(n-1)) 
如果信息分为N组,那么IV(N)就是最后得到的杂凑值。

​​​​​​​4、SM4对称加密算法

跟SM1类似,是我国自主设计的分组对称密码算法,用于替代DES/AES等国际算法于2012年3月21日发布,适用于密码应用中使用分组密码的需求。

SM4算法与AES算法具有相同的密钥长度是128bit、分组长是128bit加密算法与密钥扩展算法均采用32轮非线性迭代Feistel结构,以(32位)为单位进行加密运算,每一次迭代运算均为一轮变换函数F。SM4算法加/解密算法的结构相同,只是使用的轮密钥相反,其中解密轮密钥是加密轮密钥的逆序。

在SM4加密算法中 , 要求原始数据长度必须是长度为32的整数倍hex串即16个字节整数倍 , 但是在实际情况中数据长度并不能保证这么长 , 这里就涉及到了原始数据后填充一个0x00和多个0x00来解决数据长度填充的问题。

0X00 代表十进制中的0,十进制中的0对应ASCII码中的字符null,可以用“\0”代替。加了\表示后面的0是一个转义字符,要作特殊处理,这个转义的意思就是0与原来的字符0的含义不再一样啦,当编译器遇到这个\0时会自动将\0转化为十进制0存储在ch中,十进制0对应的ASCII码中的字符即是NULL.

Sm4密文长度跟明文长度有关。

​​​​​​​4.1、名词解释:

1、分组密码

分组密码是将明文消息编码后的数字序列划分成长为N的分组,分别在密钥K=(k0,k1,k2 ……)的控制下变换成等长的数字序列(序列长为M,输入分组长度和输出分组长度可以不等)。

2、​​​​​​​代换

为保证加解密运算可逆,明文的每个分组在特定的加密算法作用之后应当产生唯一的密文分组,明文分组到密文分组之间的可逆变换称为代换。

3、​​​​​​​S 盒

如果明文和密文分组的长都为N比特,则每个明文分组都对应着2N种可能的取值,不同可逆代换的个数为(2N)个,这也意味着密钥的长度为(2^N)比特。从实际的角度来看,分组长度很大的可逆代换是不现实的,如果分组太小,又不能满足算法的安全性能。

因此实际中常将分组分为较小的子段,可将长度为N的序列的代换拆分成m个较小的子代换,每个子代换称为代换盒,简称S盒或Sbox。SM4算法中,S盒的长度为8bit。

​​​​​​​4、Feistel加密结构

Feistel加密算法的输入是长为2w的明文和一个密钥K=(K1,K2…,Kn)。将明文分组分成左右两半L和R,然后进行n轮迭代,迭代完成后,再将左右两半合并到一起以产生密文分组。其第i轮迭代的函数为:Li=Ri-1,Ri=Li-1+F(Ri-1,Ki)其中Ki是第i轮的子密钥,“+”表示异或运算,F表示轮函数。一般地,各轮的子密钥彼此各不相同,且轮函数F也各不相同。代换过程完成后,在交换左右两半数据,这一过程称为置换。

使用上述Feistel结构的密码有几个值得注意的特点:

  • 轮函数相对简单,需要将它迭代多轮,典型地,4、8、16和32轮较为常见。
  • 最重要的部分是加密和解密可以使用同样的结构:轮函数为这两种运 算的主体(加密和解密也可能有更多的区别。如,一些Feistel结构的密码对其初始轮和末尾轮有不同的形式,比如初始置换和末尾置换不同)。
  • 轮函数可以为非线性和不可逆的。在许多密码中,例如Caesar密码,核心函数都必须可逆:我们由此才能反过来解密。但是,对于Feistel结构的密码,我们不需要计算轮函数的逆。通常地,轮函数是置换、替代和其他函数的乘积密码。
  • 由于它只对一半比特进行运算,因而使用轮函数肯定能节约时间和空间,因此必须考虑–些问题:轮函数作用于一半比特,采用暴力破解需尝试的比特位更少。此外,由于轮函数的安全性决定了算法的安全性,它必须有足够的强度。

5、IV:初始化向量

英语:initialization vector,缩写为IV

​​​​​​​4.2、SM4秘钥说明

由于SM4秘钥长度为32位的hex串 , 可以自定义,也可直接使用UUID随机生成的秘钥串。

4.3、SM4的ECB模式和CBC

SM4加解密涉及到ECB模式CBC模式 

​​​​​​​4.3.1、ECB模式:

Electronic Code Book, 电子密码本模式

 

ECB模式简单有利于计算,但是存在被攻击的可能,只需要一个秘钥key。 

​​​​​​​4.3.2、CBC 模式加密、解密

CBC模式更加安全, 在加解密的过程中不仅需要一个key还需要传入一个IV值初始化向量) ,可以将 IV值设置为16进制下的字符串:"31313131313131313131313131313131" , 其实就是UTF-8下的16个"1" 通过getBytes[].toHexString()得来的 , 这个值可以根据需要修改。

全称是Cipher Block Chaining模式(密文分组链接模式),之所以叫这个名字,是因为密文分组像链条一样相互连接在一起。
在CBC模式中,首先将明文分组与前一个密文分组进行异或运算,然后再进行加密。

加密时,用iv和key去加密第一个块,然后用第一个块的加密数据作为下一个块的iv,依次迭代。加密的时候,iv会影响所有数据的加密结果,

解密时,用n-1个块的加密数据作为iv和key去解密第n个块(n>1),只有第一个块才会用加密时的iv去解密第一个块。按照这样的逻辑来看,那么如果解密时,使用了iv错误,出问题的数据应该只有第一个块。

解密时,iv只会影响第一个加密块的解密结果,其他块的解密可以直接通过分隔加密数据获取正确是N-1块的IV。

CBC加密:

1、首先将数据依照8个字节一组进行分组得到D1D2......Dn(若数据不是8的整数倍,用指定的PADDING数据补位)

 2、第一组数据D1与初始化向量iv异或后的结果进行DES加密得到第一组密文C1(初始化向量I为全零)

3、第二组数据D2与第一组的加密结果C1异或以后的结果进行DES加密,得到第二组密文C2,之后的数据以此类推,得到Cn,按顺序连为C1C2C3......Cn即为加密结果。

2. 解密:

1、首先将数据依照8个字节一组进行分组得到C1C2C3......Cn

2、将第一组数据进行解密后与初始化向量I进行异或得到第一组明文D1(注意:一定是先解密再异或)

3、将第二组数据C2进行解密后与第一组密文数据进行异或得到第二组数据D2之后依此类推。得到Dn按顺序连为D1D2D3......Dn即为解密结果。

这里注意一点,解密的结果并不一定是我们原来的加密数据,可能还含有你补得位。一定要把补位去掉才是你的原来的数据。

CBC模式特点

1、cbc模式在进行加密之前一定会与前一个密文组进行异或运算,因此即使明文D1与明文D2值相等,密文C1与密文C2也不一定是相等的

2、cbc模式无法单独的对一个明文组进行加密,必须有前一个密文组,第一个密文组依赖于IV产生

3、解密时如果其中一个密文组损坏,只要密文分组的长度没有发生变化,则解密时最多只有2个分组受到数据损坏的影响

优点:不容易主动攻击,安全性好于ECB,适合传输长度长的报文,是SSL、IPSec的标准。

缺点

1.不利于并行计算;

2.误差传递;

3.需要初始化向量IV

5、SM7对称加密算法128bit

该算法没有公开。SM7适用于非接IC卡应用包括身份识别类应用(门禁卡、工作证、参赛证),票务类应用(大型赛事门票、展会门票),支付与通卡类应用(积分消费卡、校园一卡通、企业一卡通、公交一卡通)。

​​​​​​​6、SM9是基于标识的密码算法 -非对称

用椭圆曲线对实现的基于标识的数字签名算法、密钥交换协议、密钥封装机制和公钥加密与解密算法,包括数字签名生成算法和验证算法,并给出了数字签名与验证算法及其相应的流程。并提供了相应的流程。可以替代基于数字证书的PKI/CA体系。

SM9主要用于用户的身份认证。据新华网公开报道,SM9的加密强度等同于3072位密钥的RSA加密算法,于2016年3月28日发布。

​​​​​​​7、祖冲之密码算法是一种流加密算法 -对称

它是中国自主研究的流密码算法,该机密性算法可适用于3GPP LTE通信中的加密和解密,该算法包括祖冲之算法(ZUC)、加密算法(128-EEA3)和完整性算法(128-EIA3)三个部分。目前已有对ZUC算法的优化实现,有专门针对128-EEA3和128-EIA3的硬件实现与优化,由国家密码管理局于2012年3月21日发布。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值