信息安全工程师教程学习笔记之SM4算法

信息安全工程师 责任编辑:长颈鹿 2016-07-07

添加老师微信

备考咨询

加我微信

摘要:全国计算机技术与软件专业技术资格(水平)考试,这门新开的信息安全工程师分属该考试“信息系统”专业,位处中级资格。官方教材《信息安全工程师教程》及考试大纲于7月1日出版,希赛小编整理了信息安全工程师教程学习笔记之SM4算法,供大家参考学习。

    >>>>>信息安全工程师在线辅导 

   

      >>>>>信息安全工程师培训视频

      全国计算机技术与软件专业技术资格(水平)考试,这门新开的信息安全工程师分属该考试“信息系统”专业,位处中级资格。教材《信息安全工程师教程》及考试大纲于7月1日出版,希赛小编整理了信息安全工程师教程学习笔记之SM4算法,供大家参考学习。

      原来用于无线局域网的国密算法SMS4被定义为SM4作为密码行业标准发布。SM4是一个分组对称密钥算法,明文、密钥、密文都是16字节,加密和解密密钥相同。通过32次循环的非线性迭代轮函数来实现加密和解密。其中包括非线性变换S盒,以及由移位异或构成的线性变换。除了256字节的S盒之外,还定义了另外两组参数FK以及CK(具体数据参考密码局网站)。基本过程是首先把16字节密钥按照4字节一组分成4组,然后根据密钥扩展算法,生成32组4字节轮密钥;再把输入的16字节数据也按照4字节一组分成4组然后进行循环运算(这点和AES算法类似)。以下是一个简单的加密demo流程。(特别说明:本程序未经编译验证,仅供理解SM4流程参考)  

U32 CK[32] = {}; // CK参数

U32 FK[4] = {}; // FK参数

U8 Sbox[256] = {}; // S盒数据

 

U32 K[35];

U32 X[35];

U8 Key[16]={}; // 密钥

U8 Input[16]={}; // 输入明文

U8 Output[16]; //  输出密文

U32 rk[32];

 

typedef union

       {

              U32 UL_Long;

              U8 UC_Byte[4];

       } UN_LongByte;

 

 

void SM4_Encrypt()

{

       UN_LongByte TempX,TempY;

       U8 i,j;

   

       KeyExpansion();

   

       for(i=0;i<4;i++)

       {

              for(j=0;j<4;j++)

              {

                     TempX.UC_Byte[j] = Input[j + i*4];

              }

              X[i] = TempX.UL_Long;

       }

   

       for(i=0;i<32;i++)

       {

              X[i+4] = RoundFunction(X[i],X[i+1],X[i+2],X[i+3],rk[i]);

       }

   

       for(i=0;i<4;i++)

       {

              TempY.UL_Long = X[35-i];

              for(j=0;j<4;j++)

              {

                     Output[j + i*4] = TempY.UC_Byte[j];

              }

       }

 

}

 

void KeyExpansion(void)

{

       UN_LongByte TempMK;

       U8 i, j;

   

       for(j=0;j<4;j++)

       {

              for(i=0;i<4;i++)

              {

                     TempMK.UC_Byte[i] = Key[i + 4*j];

              }

             

              K[j] = TempMK.UL_Long ^ FK[j];

       }

 

       for(i=0;i<32;i++)

       {

              K[i+4] = K[i] ^ FunctionT1(K[i+1] ^ K[i+2] ^ K[i+3] ^ CK[i]);

              rk[i] = K[i+4];

       }

}

   

 

U32 RoundFunction(U32 X1, U32 X2, U32 X3, U32 X4, U32 rk)

{

       return X1 ^ FunctionT( X2 ^ X3 ^ X4 ^ rk);

}

 

U32 FunctionT(U32 A)

{

       U8 i;

   

       UN_LongByte TempA, B;

       TempA.UL_Long = A;

   

       for (i=0;i<4;i++)

       {

              B.UC_Byte[i] = Sbox[TempA.UC_Byte[i]];

       }

   

       return (B.UL_Long ^ Left_Shift(B.UL_Long,2) ^ Left_Shift(B.UL_Long,10) ^ Left_Shift(B.UL_Long,18) ^ Left_Shift(B.UL_Long,24));

}

             

U32 FunctionT1(U32 A)

{

       U8 i;

   

       UN_LongByte TempA, B;

       TempA.UL_Long = A;

   

       for (i=0;i<4;i++)

       {

              B.UC_Byte[i] = Sbox[TempA.UC_Byte[i]];

       }

   

       return (B.UL_Long ^ Left_Shift(B.UL_Long,13) ^ Left_Shift(B.UL_Long,23));

}

   

 

U32 Left_Shift(U32 TargetData, U8 times)

{

       return ( (TargetData >> (32 - times)) | (TargetData << times) );


    返回总目录:信息安全工程师教程学习笔记之密码学汇总(一)

    返回总目录:信息安全工程师教程学习笔记之密码学汇总(二)


    希赛软考网,拥有十四年软考培训经验,希赛网一直坚持自主研发,将丰富的软考培训经验有效融入教程研发过程,自成体系的软考在线题库软考历年真题)、软考培训教材软考视频教程,多样的培训方式包括在线辅导面授、和,使考生的学习更具系统性,辅导更具针对性。采用全程督学机制,,软考平均通过率在全国。

更多资料
更多课程
更多真题
温馨提示:因考试政策、内容不断变化与调整,本网站提供的以上信息仅供参考,如有异议,请考生以权威部门公布的内容为准!

软考备考资料免费领取

去领取

!
咨询在线老师!