浅析国家商用密码标准算法

浅析国家商用密码标准算法

中国商用密码概况

概况

国产商密算法是我国自主研发、具有自主知识产权的一系列密码算法,具有较高安全性,由国家密码局公开并大力推广。我国公开的国产商用密码算法包括SM1、SM2、SM3、SM4、SM7、SM9及祖冲之算法,其中SM2、SM3、SM4最为常用,用于对应替代RSA、DES、3DES、SHA等国际通用密码算法体系。

历史

我国在密码理论与分析上一直具有优势,但是长期依赖不公开密码算法,只提供密码芯片。密码芯片由少数专家设计,难于标准化,应用成本高,不利于推广应用。因此近年来陆续公布了商用密码算法,2006年公布了分组密码算法SM4,2011年公布了椭圆曲线密码算法SM2和杂凑算法SM3。商用密码的管理更加科学化,也和国际接轨。

原则

我国在商用密码的设计上,遵循了坚持密码的公开设计原则,也就是说,密码的安全应仅依赖于密钥的保密,不依赖与算法的保密。对于商用密码,美国DES开创了公开算法的先例。

SM4分组加密算法

概况

  1. 分组密码,数据分组(包括明文、密文)和密钥长度都为128位;
  2. 对合运算,加解密算法相同;
  3. 滑动窗口结构,明文与密钥在滑动窗口控制下,通过基本轮函数运算,然后进行迭代,生成密文。

运算方式与部件

  1. 基本运算方式

    • 模2加,用符号⊕表示,意为32比特异或运算;
    • 循环移位,符号<<<i,表示32位字循环左移i位;
  2. 基本密码部件

    • 非线性字节变换部件S盒,进行8位的非线性置换,输入前半字节为行号,后半字节为列号,输出值参考S盒变换表行与列交叉点的值;
    • 非线性字变换τ,进行32位字的非线性变换,方式是4个S盒并行置换;
    • 线性L变换部件,32位输入,32位输出,设输入为B,输出为C,表示为C=L(B),运算规则为C=L(B)=B⊕(B<<<2)⊕(B<<<10)⊕(B<<<18)⊕(B<<<24);
    • 字合成变换T,由非线性字变换τ和线性L变换符合而成,T(X)=L(τ(X)),先进行S盒变换,后进行L变换;

轮函数F

  1. 输入128位数据(X_0,X_1,X_2,X_3),4个32位字;

  2. 输入32位字轮密钥rk,输出32位字,轮密钥由加密密钥通过密钥扩展算法生成;

  3. 轮函数F(X_0,X_1,X_2,X_3,rk)=X_0⊕T(X_1⊕X_2⊕X_3⊕rk),如图所示

SM4轮函数.png

密钥扩展算法

  1. 使用常数FK,FK_0=A3B1BAC6, FK_1=56AA3350, FK_2=677D9197, FK_3=B27022DC;

  2. 32个固定参数CK, CK_{ij}=(4i+j)*7(mod 256),i=0,1,2,3,...31,j=0,1,2,3;

  3. 输入加密秘钥MK,MK=(MK_0,MK_1,MK_2,MK_3)

  4. 中间数据Ki,i=0,1,...,34,35,(K_0,K_1,K_2,K_3)=(MK_0⊕FK_0, MK_1⊕FK_1, MK_2⊕FK_2, MK_3⊕FK_3)

  5. For i=0,1,2...,31 Do
    rk_i = K_{i+4}=K_i⊕T'(K_{i+1}⊕K_{i+2}⊕k_{i+3}⊕CK_i)

T'和轮函数中的T基本相同,将L变换修改为L‘,L'(B)=B⊕(B<<<13)⊕(B<<<23)

  1. 输出轮密钥rki,i=0,1,...,30,31;

加解密算法

  1. 输入明文(X_0,X_1,X_2,X_3),共128位,4个字;

  2. 输入轮密钥rk_i, i=0,1,...,31,共32个轮密钥;

  3. 算法结构为32轮轮函数迭代,每轮使用一个轮密钥;

  4. X_{i+4}=F(X_i, X_{i+1}, X_{i+2}, X_{i+3}, rk_i)

     $=X_i⊕T(X_{i+1}⊕X_{i+2}⊕X_{i+3}⊕rk_i), i=0,1,...,31$
    

    (Y_0, Y_1, Y_2, Y_3)=(X_{35}, X_{34}, X_{33}, X_{32})

  5. 输出密文(Y_0, Y_1, Y_2, Y_3),128位,4个字;

SM4加密.png
  1. 解密算法与加密相同,只是轮函数密钥使用顺序相反;

  2. Y_{i+4}=F(Y_i, Y_{i+1}, Y_{i+2}, Y_{i+3}, rk_i)

     $=Y_i⊕T(Y_{i+1}⊕Y_{i+2}⊕Y_{i+3}⊕rk_i), i=0,1,...,31$
    

    (X_0, X_1, X_2, X_3)=(Y_{35}, Y_{34}, Y_{33}, Y_{32})

SM3杂凑算法

概况

  1. hash函数也称报文摘要,将任意长的数据M变换为定长的码h,具有极强的错误检测能力,可以作为消息认证码,可以用于辅助数字签名和保密;
  2. SM3算法由国家密码管理局在2010年12月正式颁布,适用于商用密码中的数字签名和验证、消息认证码的生成与验证以及随机数的生成;
  3. 面向32比特字设计,输出的Hash长度为256比特;
  4. 基本框架:压缩函数+迭代结构

消息填充

SM3的消息扩展步骤是以512位的数据分组作为输入的。因此,我们需要在一开始就把数据长度填充至512位的倍数,数据填充规则和MD5一样。

  1. 假设消息m为长度为l的比特;
  2. 先填充一个“1”,后面加上k个“0”。其中k是满足(n+1+k) mod 512 = 448的最小正整数;
  3. 追加64位的比特串,是长度l的二进制表示,在内存中大端序存放;
  4. 填充后的消息为m',m'的长度是512的倍数,m'=B^{(0)}B^{(1)}B^{(2)}...B^{(n-1)},B^{(i)}表示第i个消息分组,其中n=(l+k+65)/512。

消息扩展

  1. 置换函数为P,字为X

    • P_0(X)=X⊕(X<<<9)⊕(X<<<17)
    • P_1(X)=X⊕(X<<<15)⊕(X<<<23)
  2. 将消息分组B^{i}扩展生成132个字W_0, W_1,...,W_{67}, W'_0, W'_1,...,W'_{63},扩展方式为:

    FOR j=16 TO 67
    W_j ← P_1(W_{j−16} ⊕ W_{j−9} ⊕ (W_{j−3} ≪ 15)) ⊕ (W_{j−13} ≪ 7) ⊕ W_{j−6}
    ENDFOR
    FOR j=0 TO 63
    W′_j = W_j ⊕ W_{j+4}
    ENDFOR

迭代压缩

  1. 初始值IV,用于确定压缩函数寄存器的处态,IV =7380166f 4914b2b9 172442d7 da8a0600 a96f30bc 163138aa e38dee4d b0fb0e4e;

  2. 布尔函数为FF, GG, 字为XYZ

    • FF_j (X, Y, Z)= \begin{cases} X ⊕ Y ⊕ Z ,0 ≤ j ≤ 15\\ (X ∧ Y ) ∨ (X ∧ Z) ∨ (Y ∧ Z ) ,16 ≤ j ≤ 63\end{cases}
    • GG_j (X, Y, Z)= \begin{cases} X ⊕ Y ⊕ Z ,0 ≤ j ≤ 15\\ (X ∧ Y ) ∨ ( ¬X∧ Z) ,16 ≤ j ≤ 63\end{cases}
  3. 令A,B,C,D,E,F,G,H为字寄存器,SS1,SS2,TT1,TT2为中间变量,压缩函数V_{i+1} = CF(V^{(i)} , B^{(i)} ), 0 ≤ i ≤ n−1,压缩方式为:

    ABCDEF GH ← V^{(i)}

    FOR j=0 TO 63

    SS1 ← ((A ≪ 12) + E + (T_j ≪ j)) ≪ 7

    SS2 ← SS1 ⊕ (A ≪ 12)

    TT1 ← FF_j (A, B, C) + D + SS2 + W′_j

    TT2 ← GG_j (E, F, G) + H + SS1 + W_j

    D ← C

    C ← B ≪ 9

    B ← A

    A ← TT1

    H ← G

    G ← F ≪ 19

    F ← E

    E ← P_0(TT2)

    ENDFOR

    V^{(i+1)} ← ABCDEFGH ⊕ V^{(i)}

    图示如下

![椭圆曲线.png](https://upload-images.jianshu.io/upload_images/22739491-df8719fc325499fc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  1. ABCEDFG=V^{n},最后输出256位杂凑值y=ABCDEFG;

SM2椭圆曲线公钥算法

概况

SM2算法属于公开密钥密码,公钥密码的基本思想是,

  1. 将密钥K一分为二,K_e$$K_dK_e专门加密,K_d专门解密,两者不相等;
  2. K_e不能计算出K_d,所以可以将K_e公开;
  3. K_d成为用户的指纹,可以实现数字签名;

SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法,在我们国家商用密码体系中被用来替换RSA算法。RSA基于特殊的可逆模幂运算实现,而SM2基于基本椭圆曲线(ECC)实现,相比于RSA密码复杂度高、处理速度快、机器性能消耗更小。

椭圆曲线

椭圆曲线简单的理解为描述了特定点的集合的公式,y^2=x^3+ax+b, a和b的取值变化决定了曲线在坐标系上的不同形状,椭圆曲线相对X轴是对称的;

令p是大于3的素数,且4a^3+27b^2≠0 mod p,称为有限域GF(p)上的椭圆曲线;

GF(p)上椭圆曲线密码的基础参数T=<p,a,b,G,n,h>,具体含义为

  • p是大于3的素数,确定了有限域GF(p);
  • 元素a,b∈GF(p), a和b确定了椭圆曲线y^2=x^3+ax+b
  • G为循环子群E_1的生成元点,n为素数且为生成元G的阶,G和n确定了循环子群E_1
  • h=|E|/n,并称为余因子,h将交换群E和循环子群E_1联系起来;

椭圆曲线图示如下

SM2的曲线方程中,推荐使用256位素域GF(p)上的椭圆曲线,所有曲线参数都是定值。

SM2的曲线方程中,推荐使用256位素域GF(p)上的椭圆曲线,参数选取有如下几个要求,

  1. p越大越安全,但计算速度会变慢,160位可以满足;
  2. n为大素数(n>2^{160}),对于固定有限域F(p),n应当尽可能大;
  3. a^3 + 27b^2 ≠0 (mod p);
  4. 保证P的阶n足够大,h≤4;
  5. 不能选取超奇异椭圆曲线和异常椭圆曲线等两类特殊曲线。

密钥生成

选取一条满足安全要求的椭圆曲线,通过随机数发生器产生用户B的私钥d_B∈[1, n-2],其中n为基点G的阶。其次通过以G 为基点,计算点P_B = d_B·G得到用户B的公钥。

密钥派生函数为KDF,通过输入比特串Z=x_2||y_2和整数len,得到一个长度为len的比特串,杂凑函数一般选用国密算法SM3。

加密算法

令要发送的消息为比特串M,len为M的比特长度,加密者A进行以下步骤,

  1. 用随机数发生器产生随机数k∈[1, n-1];
  2. 计算椭圆曲线点C_1=[k]G=(x_1,y_1);
  3. 计算椭圆曲线上的点S=[h]P_B,S不能为无穷远点O;
  4. 计算椭圆曲线点[k]P_B=(x_2,y_2);
  5. 计算t=KDF(x_2||y_2, len)密钥派生函数结果不能全为0,否则需要重新选择随机数k重新计算;
  6. 计算C_2=M⊕t;
  7. 计算C_3=Hash(x_2||M||y_2),Hash是密码杂凑函数;
  8. 输出密文C=C_1||C_2||C_3

解密算法

解密者B进行以下步骤,

  1. 从C中取出比特串C=C_1,验证是否满足椭圆曲线方程,若不满足这种解密错误;
  2. 计算椭圆曲线点S=[h]C_1,验证C_1是否为无穷远点,若为无穷远点则解密错误;
  3. 计算[d_B]C_1=(x_2,y_2);
  4. 计算t=KDF(x_2||y_2, len),验证t是否为全0比特串,若为全0则解密错误;
  5. 从C中取出比特串C_2,计算M'=C_2⊕t;计算u=Hash(x_2||M'||y_2),从C中取出比特串C_3,若u≠C_3则解密错误;
  6. M’为解密后的明文;

总结与展望

国密算法经过了国家专业机构设计,算法简洁,难以破解,十分安全。但是算法只公开了SM2,SM3和SM4,而且公开时间较短,需要进行更多的实践,在实践应用进一步验证算法。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,951评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,606评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,601评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,478评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,565评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,587评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,590评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,337评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,785评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,096评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,273评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,935评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,578评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,199评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,440评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,163评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,133评论 2 352

推荐阅读更多精彩内容