加密算法整理(哈希SHA, 奇偶校验, DES, 3DES, 3DES 分散, MAC, RSA, SM2) 持续更新

现有加密算法:

对称算法:DES / 3DES / SM4 / AES / SSF33 / RCX

非对称算法: RSA / SM2 / ECC / DSA / DH

信息摘要算法: SHA1 / SM3 / MD4 / MD5 / SHA256

 

目前银联规范银行卡中使用的安全加密算法分为两种:国际算法和国密算法

替换规则为:RSA <-> SM2, SHA - 1 <-> SM 3 , 3DES <-> SM4

 

简单总结几种算法的原理如下:

哈希SHA1: 由input生成20字节哈希值,不需要密钥,算法伪代码链接:

SHA1伪代码

奇 / 偶校验:每个字节第8位的值(0/1)需要保证整个字节1的个数为奇 / 偶数

 

DES:8字节(64bits)明文输入,密钥为8字节(64bits,参与密钥扩展的有效位数56bits),输入不足8字节,补位0x80...0

           流程图:

           实现代码:

3DES:两种密钥类型(16bytes / 24bytes)

             16bytes: KeyA || KeyB , 加密过程中,KeyA用于加密、KeyB用于解密

             24bytes: KeyA || KeyB || KeyC , 加密过程中,KeyA KeyB用于加密,KeyB解密

             DES0( K , M )表示用K对M进行DES加密,DES1( K , M )表示用K对M进行DES解密

             3DES的8字节输入M计算方法:

                                                            S = 3DES0( KeyA || KeyB , M ) = DES0 ( KeyA, DES1( KeyB, DES0( KeyA , M ) ) )                      (16bytes key)

                                                            S = 3DES0( KeyA || KeyB || KeyC , M ) = DES0 ( KeyC , DES1( KeyB , DES0( KeyA , M ) ) )                      (24bytes key)

              伪代码链接如下:

              3DES超过8字节输入M的算法分为两种:ECB / CBC

                      ECB算法: 1.首先将输入数据补位(80...0)使输入数据的字节数为8的倍数

                                            如:0x7834cda82b347e237ec83c           补位后:0x7834cda82b347e237ec83c80000

                                         2.将输入M以8字节为单位拆分为 M0,M1...Mn

                                         3.对于每个Mi进行3des加密: Si = 3DES0( KEY , Mi )

                                         4.将所有Si连接得到最终的密文:S = S1 || S2 || S3 || ... || Sn

                     CBC算法: 1, 2步同ECB算法1, 2步

                                        3.  将8字节初始向量 iv 与 M0 异或得到M0'

                                        4. 使用KEY对M0'进行3DES加密得到:S0 = 3DES0( KEY , M0' )

                                        5. 将S0 作为下一8字节的初始向量与下一8字节异或得到 M1' = M1 XOR S0

                                        6. 循环 4 , 5步计算得到Si

                                        7. 将所有Si连接得到最终密文: S = S1 || S2 || S3 || ... || Sn

                       实现代码:

AES(Advanced Encrytion Standard):AES作为DES和3DES的进化,更安全,速度更快。AES的密钥长度有三种16byte,24byte和32byte。作为分组数据加密方式,数据分组都是16bytes为一组(对应DES的8bytes为一组),单组数据的加密过程中包括字节代换、行移位、列混合和多伦加,不同的密钥长度对应的不同的加密轮数,

AES-128对应扩展为11个16bytes长度的密钥,作为初始密钥和10轮加密的轮密钥

AES-192对应扩展为13个16bytes长度的密钥,作为初始密钥和12轮加密的轮密钥

AES-256对应扩展为15个16bytes长度的密钥,作为初始密钥和14轮加密的轮密钥

ECB、CBC同样定义了AES每个数据block之间的关系

密钥分散:对16字节密钥分散,一般选取8字节(byte)长度的分散因子。

                    使用原密钥3DES_ECB 加密 分散因子+分散因子取反,得到分散过的密钥。

MAC: 同样是基于des和3des的算法进行计算,用来校验数据正确性,只能正推

          需要输入初始向量iv,密钥key,最终结果为8字节

          MAC 的两种算法: MAC9.9:1. 首先将输入数据补位(80...0)使输入数据的字节数为8的倍数

                                                               如:0x7834cda82b347e237ec83c           补位后:0x7834cda82b347e237ec83c80000

                                                           2. 将输入M以8字节为单位拆分为 M0,M1...Mn

                                                           3. 使用KEY对每个Mi进行3DES CBC加密,当前8字节Mi的加密结果作为下一8字节Mi+1计算的初始向量

                                                           4. 循环3 得到使用KEY对最后8字节的3DES CBC加密结果Sn

                                                           5. 最终MAC结果Sn

                                                           PS:也可以理解为 对整条数据进行3DES CBC 加密,取最后8字节即为MAC9.9的结果

                                         MAC919:1.2步同MAC9.9算法1,2步

                                                           3.  将8字节初始向量 iv 与 M0 异或得到M0'

                                                           4. 对使用KEY 对 M0'进行DES 加密 得到 S0 = DES0( KEY , M0' )

                                                           5. 将S0 与下一个8字节异或得到 M1’ = M1 XOR S0

                                                           6. 循环4,5 步直到 将最后8字节与前8字节加密结果异或得到 Mn‘ = Mn XOR Sn-1

                                                           7. 使用KEY对Mn‘ 进行3DES加密 得到8字节 Sn = 3DES(KEY , Mn’)

                                                           8. Sn为最终MAC919结果

 

=====================================分割线  非对称算法================================================

非对称算法是指加解密密钥不同,私钥签名公钥验签,公钥签名私钥验签,私钥归个人所有,公钥归其他人所有可以使得自己签名的数据可以被很多人验签,同时又防止了自己本身被冒充

RSA算法: 相关参数:公钥模长N, 公钥指数e1,私钥指数e2,大质数p, q

                   公、私钥生成过程:1. 取随机大质数p、q,N = p * q

                                                   2. 取任意值e1,使得e1 与 ( p - 1 ) * ( q -1 )互质

                                                   3. 计算得到e2 , 使得e2满足 ( e2 * e1 )mod( (p-1)*(q-1) ) = 1

                                                   4. 得到公钥为(N, e1),私钥为(N, e2)

                   加解密过程:1.加密:密文S = M ^e2 mod N

                                         2.解密:明文M = S ^e1 mod N

                   优化:RSA算法的安全性在于很难通过N拆分得到两个大质数p、q,从而破解得到对应的私钥,所以需要通过增长密钥长度(即N的二进制表示的位数)来增加拆分N的难度,从而有效增强算法的安全性,而N过大会导致加密和解密的计算过程过长。

                              通过大数定理将较大的密钥e1/e2分解得到5个分量可以使得次数运算变为并行,从而有效缩短计算时间:

                              分解原理:使Vp 恒= S^e1 mod p, Vq 恒= S^e1 mod q

                                                      Xp 恒= q * (q^-1 mod p),Xq 恒= p * ( p^-1 mod q )              q^-1表示q按位取反

                                                  则 M =S ^e1 mod N  = ( Vp*Xp + Vq*Xq ) mod n

                                                  经转换: Vp = S^e1 mod p = S^( e1 mod (p-1) )  mod p

                                                                  Vq = S^e1 mod q = S^( e1 mod (q-1) ) mod q

                               从而得到五个分量:

                                                                 P = p;

                                                                 Q = q;

                                                                 Dp = e1 mod ( p -1 )

                                                                 Dq = e1 mod ( q - 1 )

                                                                Qivn = q^-1 mod p

SM2算法:基于椭圆曲线原理,生成公、私钥的相关参数:大质数P(有限域,区域上点的个数),

                                                                                              曲线参数方程系数a,b...(暂定为a,b两个值),

                                                                                              G是曲线方程上的任意一点(XG,YG)作为生成点

                                                                                              n为G的阶:曲线上存在一点N,N = nG,n取最大

                   生成公、私钥过程:1. 选取随机大质数P

                                                   2. 根据曲线方程系数确定曲线方程如:(4a^3 + 27b^2)mod P <> 0

                                                   3. 私钥k为生成点的倍数值,1 <= k <= n-1

                                                   4. 公钥为生成点G对应私钥倍数k 的倍数点 A(XA,YA) = k * G( XG, YG )

                   签名/验签的相关参数:ENTLA是由IDA的比特长度entlenA转换而成的两个字节( 银行卡中为2字节 0x00, 0x80 )

                                                        IDA(身份id)为签名用户A的可辨别标识如:用户A 的姓名,身份证号码等 ( 银行卡中为16字节0x31,0x32,0x33,0x34,0x335,0x36,0x37,0x38,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38 )

                                                        曲线方程系数:a,b

                                                        曲线方程生成点G( XG, YG)

                                                        公钥,即生成点的倍数点:PA ( XA , YA )

                                                        私钥 dA,PA = [dA]G = (xA,yA)

                                                        椭圆曲线上G的阶n

                   签名/验签过程:对明文M进行签名:

                                             1. 将椭圆曲线方程参数a、b,G的坐标(xG,yG)和PA坐标(xA,yA)的数据类型转换为比特串ZA = Hv( ENTLA || IDA || a || b || xG || yG || xA || yA)

                                             2. M' = ZA || M

                                             3. 计算e = Hv( M' ), Hv()为基于H256改进的hash算法

                                             4. 用随机数生成一把临时私钥 k ∈[ 1,n-1 ],计算椭圆曲线点[k]G,生成临时公钥( x1, y1 )

                                             5. 计算r= ( e + x1 ) mod n, 若 r= 0 或者r + k = n 则返回4

                                             6. 计算s = (( 1 + dA ) ^ (-1) * ( k - r * dA) ) mod n , 若s = 0 则返回 4

                                             7. 得到消息M的签名为 ( r , s ),ps: s 在验签时用来恢复临时公钥

                                             对签名r, s进行验签: 输入:明文M,ZA,G点坐标(xG, yG) , 公钥PA点坐标( xA, yA )

                                             1.检验r∈[ 1,n-1 ] && s∈[ 1,n-1 ]是否成立,不成立验签失败

                                             2. M' = ZA || M

                                             3.计算e = Hv( M' )

                                             4. 计算t = ( r + s ) mod n, 若t = 0 则验签失败

                                             5. 计算临时公钥(x1 , y1) = [s] G + [t] PA

                                             6. 计算R = (e + x1) mod n

                                             7. 若 R = r,则验签成功,否则失败

                    流程图:

                                     加密算法整理(哈希SHA, 奇偶校验, DES, 3DES, 3DES 分散, MAC, RSA, SM2) 持续更新_第1张图片                                     加密算法整理(哈希SHA, 奇偶校验, DES, 3DES, 3DES 分散, MAC, RSA, SM2) 持续更新_第2张图片

你可能感兴趣的:(加密算法整理(哈希SHA, 奇偶校验, DES, 3DES, 3DES 分散, MAC, RSA, SM2) 持续更新)