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

news/2024/10/30 23:26:15/

现有加密算法:

对称算法: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,则验签成功,否则失败

                    流程图:

                                                                          


http://www.ppmy.cn/news/332828.html

相关文章

Sm-DOTA DOTA修饰稀土钐 Sm-DTPA二亚乙基三胺五乙酸修饰稀土钐

Sm-DOTA DOTA修饰稀土钐 Sm-DTPA二亚乙基三胺五乙酸修饰稀土钐 镧系元素&#xff08;有时称为稀土元素&#xff09;是元素周期表中从原子序数57&#xff08;镧&#xff09;到71的14个“ f嵌段”元素的集合。其中&#xff0c;euro&#xff08;Eu&#xff09;&#xff0c;&#x…

国密算法 SM2 公钥加密 非对称加密 数字签名 密钥协商 python实现完整代码

SM2算法是国家密码管理局于2010年12月颁布的中国商用公钥密码标准算法。SM2基于椭圆曲线离散对数问题&#xff0c;计算复杂度是指数级&#xff08;暂未发现亚指数级或多项式级的计算方法&#xff09;&#xff0c;相较于广泛应用的RSA公钥密码算法&#xff0c;在同等安全程度要求…

sm2多端加密解密,java,js,android,ios实战

SM2非对称加密 公钥 04xxxxxxxxxxxxxxxxxxxx&#xff0c;私钥 276xxxx原文&#xff1a;你哦哈1232154 3654 {} &#xff0c;俺可接受不符点 公钥私钥是我后台自己生成的&#xff0c; java代码实现 pom.xml <dependency><groupId>org.bouncycastle</group…

加密方式之SM2

有一项需求&#xff0c;为了相对保证安全&#xff0c;需要敏感字符添加加密国密方式&#xff0c;于是想到了SM2&#xff0c;话不多说&#xff0c;上代码。 一、前端js代码。 开始也是找了好久的m2的前端js加密方式&#xff0c;很少&#xff0c;这里找到一个大哥的&#xff0c…

sm2

sm2加密&#xff1a; (function (global, undefined) {"use strict";var SM2CipherMode {C1C2C3: "0",C1C3C2: "1"};var CryptoJS CryptoJS || function (a, b) {var c {}, d c.lib {}, e d.Base function () {function a() { }return {e…

锤子m1 android 7,Smartisan 锤子 M1L 入手两日感受和DIY换背盖经验分享

Smartisan 锤子 M1L 入手两日感受和DIY换背盖经验分享 2016-10-24 14:49:08 51点赞 43收藏 57评论 之前发了Smartisan M1l的开箱&#xff0c;发表了一些自己的看法&#xff0c;对这款手机的短暂印象、批评和赞美。 当时我表达了我对于背盖的极度不满&#xff0c;这个印象两天后…

网安笔记13 隔离技术

隔离技术概述 安全域 以信息涉密程度划分的网络空间涉密域&#xff1a;涉及国家秘密的网络空间&#xff0c;反之就是不涉及公共服务域是指既不涉及国家秘密也不涉及工作秘密&#xff0c;是一个向因特网络完全开放的公共信息交换空间 网络隔离 两个or以上可路由网络(TCP/IP)…

priority_queue的模拟实现

前言 优先级队列听名字好像与队列有关&#xff0c;但是实际上&#xff0c;与队列没有很多关系&#xff0c;它也是容器适配器&#xff0c;是通过vector来适配的&#xff0c;但是里面又加入了堆的调整算法。跟栈和队列又有一些不同&#xff0c;了解它的实现对于我们更好的掌握它是…