AES中S盒的c语言实现及代码

什么是AES?

AES 是一个对称分组密码算法,又称高级加密标准。
AES是一个区块加密标准,用于替代原本的DES,其已然成为对称密钥加密中最流行的算法之一。

这里主要实现AES算法中最基本的S盒。

S盒构造:

  • 初始化:
    在S盒中按字节的升序逐行初始化S盒。即从第一行:{00},{01},{02},...,{0f}进行初始化,第二行是{10},{11},{12},...,{1F}。
  • 求逆元:
    将S盒中的每个元素转化为该元素在域GF(28)上的逆元。
  • 位变换:
    将S盒中的每个字节的位记为{b7,b6,b5,b4,b3,b2,b1,b0}。对S盒的每个字节的每个位做如下变换:
    bi' = bi⊕b(i+4)mod8⊕b(i+5)mod8⊕b(i+6)mod8⊕b(i+7)mod8⊕ci
    ci指的是值{63}的字节的第i位。

按照上面的步骤来实现代码:

全局变量和一些函数

int SBox[16][16];
// 将输入的整数的16进制对应字符返回,输入的整数在0~15之间
char dec2Hex(int n){
  if(n >= 0 && n <= 9)return 48 + n;
  switch(n){
    case 10:return 'A';break;
    case 11:return 'B';break;
    case 12:return 'C';break;
    case 13:return 'D';break;
    case 14:return 'E';break;
    case 15:return 'F';break;
  }
  return ' ';
}

初始化

void init(){
  // SBox初始化
  for(int i = 0 ; i < 16 ; i++){
    if(i != 0)SBox[i][0] = SBox[i-1][15] + 1;
    for(int j = 1 ; j < 16 ; j++){
      SBox[i][j] = SBox[i][j-1] + 1;
    }
  }
  printf("初始化:\n");
  for(int i = 0 ; i < 16 ; i++){
    for(int j = 0 ; j < 16 ; j++){
      printf("%c%c ",dec2Hex(SBox[i][j] / 16) ,dec2Hex(SBox[i][j] % 16));
    }
    printf("\n");
  }
  printf("\n");
}

求逆元

void exgcd(){
  printf("求逆元:\n");
  for(int i = 0 ; i < 16 ; i++){
    for(int j = 0 ; j < 16 ; j++){
      // 重要的就是Ext_Euclid算法,是拓展欧几里得算法,用于求整数在域上的逆元,参考的网上前辈的代码,感谢。
      SBox[i][j] = Ext_Euclid(SBox[i][j],283);
      // dec2Hex:将整数转为16进制
      printf("%c%c ",dec2Hex(SBox[i][j] / 16) ,dec2Hex(SBox[i][j] % 16));
    }
    printf("\n");
  }
}
//计算一个十进制数的二进制表示时的位数有多大
//直接计算右移了多少位就可
int numb_bits(int v)
{
    int count=0;
    while(v>0)
    {
        v=v>>1;
        count++;
    }
    return count;
}
//多项式除法
int polydivide(int a,int b,int *remainder )
{
    int tmp;
    int c=numb_bits(a)-numb_bits(b);
    int value=0;
    while(c>=0)
    {
        value=(1<<c) | value; //计算商,这时计算的c值就是每一个是1的位置,直接与1相与,就可以将其设置为1
        tmp=b;//将被除数向左移c位再与a相与,并赋给a
        tmp=tmp<<c;
        a=a^tmp;
        c=numb_bits(a)-numb_bits(b);
    }
    *remainder=a;
    return value;
}
//多项式乘法
int polyMulti(int a,int b)
{
    int value=a;
    int result=a;
    int r;
    if(a==0 || b==0)
        return 0;
    r=b%2;
    b=b/2;
    if(!r)  //判断最后一位是0还是1,是0的话result就等于0
        result=0;
    while(b)
    {
        r=b%2;
        b=b/2;
        if(value>>7) //b7为1,就要与00011011相与
            value=(value<<1) & 0xff ^27;
        else
            value=(value<<1) & 0xff;
        if(r) //位为1的结果就参加异或运算
            result=result ^ value;
    }

    return result;
}
//扩展的欧几里德算法
int Ext_Euclid(int a,int b)
{
    int tmp;
    if(a<b)
    {
        tmp=a;
        a=b;
        b=tmp;
    }
    int x0 = 1,y0 = 0,x1 = 0,y1 = 1;//初始化条件
    int tmp1,tmp2;
    int r1 = a,r2 = b,q1;
    int i=1;
    //下面直接用扩展欧几里德算法来做
    while(r2)
    {
        tmp1=r2;
        q1=polydivide(r1,r2,&r2);//r1对r2进行多项式除法,商存在q1,余数存在r2
        r1=tmp1;//这步比较重要,就是r1要变成上一次除法的被除数
        tmp1=x1;
        tmp2=y1;
        x1=x0 ^ polyMulti(q1,x1);  //计算v,w;每一个v(x)*f(x)+w(x)*g(x)=1成立
        y1=y0 ^ polyMulti(q1,y1);
        x0=tmp1;
        y0=tmp2;
        i++;
    }
    return y0;
}

位变换

void transforms(){
  for(int i = 0 , j = 0 ; i < 16 ; i++){
    for(j = 0 ; j < 16 ; j++){
      SBox[i][j] = transform(SBox[i][j]);
    }
  }
}

int transform(int num){
  int n[8];
  int b[8];
  // int c[8] = {0,1,1,0,0,0,1,1};
  int c[8] = {1,1,0,0,0,1,1,0};
  int i = 0;
  for(i = 0 ; i < 8 ; i++){
    n[i] = num % 2;
    num /= 2;
  }
  int j = 1;
  for(i = 0 , num = 0 ; i < 8 ; i++){
    // 使用二进制移位来做更好,偷懒就不做了。
    b[i] = n[i] ^ n[(i+4)%8]
     ^ n[(i+5)%8]
     ^ n[(i+6)%8]
     ^ n[(i+7)%8]
     ^ c[i];
     num += b[i] * j;
     j *= 2;
  }
  return num;
}

以上部分就是生成AES中的S盒的过程。

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

推荐阅读更多精彩内容