• 现代密码学-国密算法


    商用密码算法种类

    商用密码算法 

    密码学概念、协议与算法之间的依赖关系

    数字签名、证书-公钥密码、散列类算法

    消息验证码-对称密码 ,散列类

    安全目标与算法之间的关系

    机密性--对称密码、公钥密码

    完整性--散列类算法

    可用性--散列类、公钥密码

    真实性--公钥密码

    不可否认--公钥密码

    SM2椭圆曲线公钥加密

    公钥密码体制

    公钥体制加密

    1. 接收者B产生一对密钥:私钥--SK_{_{B}},公钥--PK_{_{B}}
    2. A想向B发消息m,则使用B的公钥加密m,表示为c=\varepsilon _{PK_{B}}[m], c是加密后的密文,\varepsilon是加密算法
    3. B收到密文c后,用自己的私钥SK_{_{B}}解密,表示为m=D_{SK_{B}}[c],D是解密算法

    只能由B进行解密

    公钥体制认证

    用户A用自己的私钥对m进行加密,c=\varepsilon _{SK_{A}}[m],将c发给B,B用A的公钥解密m=D_{PK_{A}}[c]

     从m得到c的过程是经过A的私钥加密的,只能A才能做到,因此c可以当作A对m的数字签名。

    双重加密、解密

    为了同时具有保密功能和认证功能,可以使用双重加、解密

    发送方先用自己的私钥对消息加密,用于提供数字签名。再用接收方的公钥加密,表示为

     c=\varepsilon _{PK_{B}}[\varepsilon _{SK_{A}}[m]]

    接收者收到后,x先用自己的私钥,再用发送方的公钥进行两次解密,解密过程为

    m=D_{PK_{A}}[D_{SK_{B}}[c]]

    椭圆曲线密码体制

    椭圆曲线密码 Elliptic CurveCryptography ECC:利用椭圆曲线实现密码技术

    椭圆曲线上的离散对数问题

    本质:已知xG求数x的问题

    椭圆曲线密码中,先确定一条椭圆曲线,然后对椭圆曲线上的某一些点之间的“运算”进行定义,利用这些“运算”来进行密码技术相关的计算。

    已知

            椭圆曲线E

            椭圆曲线E上的一点G(基点)

            椭圆曲线上的一点xG(G的x倍)

    求解

            数x

    椭圆曲线Diffie-Hellman密钥交换

    AB需要共享一个对称密码的密钥,用椭圆曲线Diffie-Hellman密钥交换,生成共享密钥

    • A向B发送点G。G被窃听无影响
    • A生成随机数a,将a作为A的私钥
    • B生成随机数b,将b最为B的私钥
    • A向B发送点aG
    • B向A发送bG
    • A对收到的bG计算其在椭圆曲线上a倍的点,a(bG)=abG==共享密钥
    • B对收到的aG计算其在椭圆曲线上b倍的点,b(aG)=baG=abG==共享密钥

    每次通信使用不同的随机数,共享密钥也会随之改变==保证了前向安全性forward secrecy

    SM2

    SM2是国家密码管理局颁布的中国商用公钥密码标准算法,是一组椭圆曲线密码算法,包含加解密算法、数字签名算法。

    SM2与国际ECC比较

            ECC算法采用国际机构建议的曲线和参数,SM2算法的参数需要利用一定的算法产生,算法中加入了用户特异性的曲线参数、基点、用户的公钥点信息,安全性更高

            ECC中,用户可以选择MD5或SHA-1等国际通用的哈希算法,SM2使用SM3哈希算法,SM3哈希算法输出为256比特,与SHA-256算法安全性相当

    SM2椭圆曲线公钥密码加密算法

    基本参数

    基于素数域F_{p}的SM2算法参数如下:

    F_{p}的特征p为m比特长的素数,p要尽可能大;

    长度不小于192比特的比特串SEED;

    F_{p}上的2个元素a,b,满足4{a^{3}}+27{b^2}\neq 0,定义曲线E(F_{p}):y^2=x^2+ax+b

    基点G=(x_G,y_G)\in E(F_p),G\neq 0;

    G的阶n为m比特长的素数,满足n> 2^191 and n> 4\sqrt{p};

    h=\frac{\left | E(F_p) \right |}{n}余因子,其中 |E(F_p)|是曲线E(F_p)的点数。

    SEED,a,b产生的算法:

    1. 任意选取长度不小于192比特的比特串SEED;
    2. 计算H=H_{256}(SEED),记H=(h_{255},h_{254},...,h_0),其中H_{256}表示256比特输出的SM3哈希算法
    3. R=\sum_{255}^{0}h_i2^i;
    4. r=R mod p
    5. F_{p}上任意选择2个元素a,b,满足 rb^2=a^3 mod p;
    6. 若 4{a^{3}}+27{b^2}= 0 mod p,则返回1;
    7. 所选择的F_{p}上的曲线是E(F_{p}):y^2=x^2+ax+b
    8. 输出(SEED,a,b)

    密钥产生

    假设接收方为B,B的秘密钥取{1,2,...,n-1}中的一个随机数d_B,记为d_B\leftarrow\left \{ 1,2,...,n-1 \right \}_R,其中G的阶n

    B的公开钥取为椭圆曲线上的点:P_B=d_BG,其中,G=G(x,y)是基点

    加密算法

    假设发送方是A,A要发送的消息表示为M比特串,M的长度为klen.算法如下:

    1. 选择随机数k\leftarrow\left \{ 1,2,...,n-1 \right \}_R
    2. 计算椭圆曲线点C_1=kG=(x_1,y_1)),将x1,y1表示为比特串;
    3. 计算椭圆曲线点S=HP_B,若S为无穷远点,则报错退出;
    4. 计算椭圆曲线kP_B=(x_2,y_2),将x2,y2表示为比特串;
    5. 计算t=KDF(x_2 || y_2,klen),若t为全0的比特串,则返回1;
    6. 计算C_2=M\oplus t----(mod 2 加法)
    7. 计算C_3=Hash(x_2 || M || y_2)
    8. 输出密文C=(C1,C2,C3)

    KDF(*)是密钥派生函数,本质为一个伪随机数产生函数,用来产生密钥,这里KDF为SM3,第(3)步的H也是SM3

    解密算法

    B收到密文C后,进行解密,过程如下:

    1. 从C中取出C1,将C1表示为椭圆曲线上的点,验证C1是否满足椭圆曲线方程。不满足就报错退出;
    2. 计算椭圆曲线点S=HC1,若S为无穷远点,则报错退出;
    3. 计算d_BC_1=(x_2,y_2),将x2,y2表示为比特串;
    4. 计算t=KDF(x_2 || y_2,klen),若t为全0的比特串,则报错退出;
    5. 从C中取出C2,计算{M}'=C_2\oplus t;
    6. 计算u=Hash(x_2 || {M}' || y_2),从C中取出C3,若u \neq C_3则报错退出;
    7. 输出明文{M}'

    SM2椭圆曲线公钥密码签名算法

    基本参数

    与前面加密算法的参数设置相同

    密钥产生

    与与前面加密算法产生方法一样,记为d_A,P_A=(x_A,y_A)

    ID_A是A的长度为entlen_A比特的标识,ENTL_Aentlen_A转换而成的两个字节,A计算Z_A=H_{256}(ENTL_A || ID_A || a||b||x_G||y_G||x_A||y_A),其中a,b是椭圆曲线方程的参数,x_G,y_G是基点G的坐标,x_A,y_AP_A的坐标。将这些值转换为比特串后,在进行H_{256}。验证方B验证签名时,也需要计算Z_A

    签名算法

    设待签名的消息为M,操作如下:

    1. \tilde{M}=Z_A || M
    2. 计算e=H_v(\tilde{M}),将e转换为整数,Hv是输出为v比特长的哈希函数
    3. 用随机数产生器生成随机数k\leftarrow\left \{ 1,2,...,n-1 \right \}_R
    4. 计算椭圆曲线点C_1=kG=(x_1,y_1))
    5. 计算r=(r+x_1) mod n,若r=0或者r+k=n,则返回3
    6. 计算s=((1+d_A)^{-1})\cdot (k-r\cdot d_A))mod n,若s=0,则返回3
    7. 消息M的签名为(r,s)

    验证算法

    B收到消息{M}'以及其签名({r}',{s}'),进行验证操作:

    检验{r}'\in [1,n-1]是否成立,若不成立,验证失败;

    检验{s}'\in [1,n-1]是否成立,若不成立,验证失败;

    {\tilde{M}}'=Z_A || {M}'

    计算{e}'=H_v({\tilde{M}}'),并将其转换为整数;

    计算t=({r}'+{s}')mod n,若t=0,验证失败

    计算椭圆曲线点({x}',{y}')={s}'G+tP_A

    计算R=({e}'+{x_1}')mod n,检查R={r}'是否成立,若成立则验证通过,否则,验证失败

  • 相关阅读:
    DTCloud 第1天
    代码随想录算法训练营第三十七天| 860.柠檬水找零,406.根据身高重建队列 ,738.单调递增的数字
    Qt开发 | Qt绘图技术 | 常见图像绘制 | Qt移动鼠标绘制任意形状 | Qt绘制带三角形箭头的窗口
    Uniapp 应用消息通知插件 Ba-Notify
    LearnOpenGL学习笔记——延迟着色法
    【数据结构】如何应用堆解决海量数据的问题
    如何通过python爬股票接口获取证券交易日?
    二分模板代码
    如何在Windows 10上打开和关闭平板模式?这里提供详细步骤
    Spring的基本使用
  • 原文地址:https://blog.csdn.net/weixin_40042143/article/details/139438394