现有加密算法:
对称算法: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,则验签成功,否则失败
流程图: