zoukankan      html  css  js  c++  java
  • SM4

    算法过程

    代码实现

    #include <stdio.h>
    /*
        SM4-S盒实现:
        由三个复合函数组成,S(x)=L(I(L(x))),其中L(x)是仿射变换,而I(x)是逆变换
    */
    int sbox[256]; // S盒
    
    //仿射变换实现
    int change(int x)
    {
        int A1 = 0xA7;
        int flag;
        int result = 0;
        int tem;
        int flage2;
        for (int i = 0; i < 8; i++)
        {
            flag = (A1 & 0x80) >> 7;
            tem = x & A1;
            flage2 = 0;
            for (int j = 0; j < 8; j++)
            {
                flage2 ^= (tem & 1);
                tem >>= 1;
            }
            result = result | (flage2 << i);
            A1 = (A1 << 1) | flag;
        }
        result ^= 0xd3;
        return result;
    }
    
    //模2 多项式乘法
    int multiplication(int a, int b)
    {
        int tem = 0;
        int i = 0;
        while (b)
        {
            if (b & 1)
            {
                tem ^= a << i;
            }
            i++;
            b >>= 1;
        }
        return tem;
    }
    
    //模2 多项式除法
    int length(int x)
    {
        int i = 0;
        int comp = 1;
        while (1)
        {
            if (comp >= x)
            {
                return i;
            }
            comp = (comp << 1) + 1;
            i++;
        }
    }
    void division(int a, int b, int* round, int* left)
    {
        *round = 0;
        *left = 0;
        int distence;
        while (1)
        {
            distence = length(a) - length(b);
            if (distence >= 0 && a)
            {
                a = a ^ (b << distence);
                *round = (*round) | (1 << distence);
            }
            else {
                *left = a;
                break;
            }
        }
    }
    
    //模2 多项式求逆(扩展欧几里得算法)
    int inverse(int a, int b)
    {
        int x2 = 1;
        int x1 = 0;
        int y2 = 0;
        int y1 = 1;
        int temX1, temY1;
        int q, r, x, y;
        int i;
        while (b)
        {
            division(a, b, &q, &r);
            y = y2 ^ multiplication(q, y1);
    
            a = b;
            b = r;
            y2 = y1;
            y1 = y;
        }
        return y2;
    }
    
    void genXbox()
    {
        printf("-------------------------------------------------------------SM4-Sbox生成---------------------------------------------------------
    ");
        for (int i = 0; i <= 0xf; i++)
        {
            printf("	%x", i);
        }
        printf("
    ");
        for (int i = 0; i <= 0xf; i++)
        {
            printf("%x", i);
            for (int j = 0; j <= 0xf; j++)
            {
                printf("	%x", change(inverse(0x1f5, change((i << 4) | j))));
            }
            printf("
    ");
        }
        printf("----------------------------------------------------------------------------------------------------------------------------------
    ");
        system("pause");
        
    }
    
    int main()
    {
        genXbox();
        return 0;
    }
    

    以上是S盒实现,详细代码见github

    后续可实现:txt文本加密、Doc文件加密、图片加密、PDF文本加密

    参考

    1、国标—SM4

    2、密码学-基础理论与应用(李子臣著)

    3、商用密码检测中心-源码下载

     
     

    作者: Pam

    出处: https://www.cnblogs.com/pam-sh/>

    关于作者:网安在读

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(mir_soh@163.com)咨询.

  • 相关阅读:
    C#开发代码的小技巧1
    17. 装箱、拆箱的最小化
    Google Map开发(一) ASP.NET中调用Google Map API实现简单的地图显示
    C#可空类型
    C#如何扩展类型的内置方法
    Linq合并两个DataTable
    <br style="clear:both" /><br />
    GridView内容<br />换行
    数据库连接字符串大全
    JS将Table导出到Excel
  • 原文地址:https://www.cnblogs.com/pam-sh/p/14750375.html
Copyright © 2011-2022 走看看