日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sms4的S盒构造c实现

發(fā)布時間:2023/12/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sms4的S盒构造c实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

sms4的S盒構造c實現(xiàn)

sms4算法中的s盒的構造是由三個函數(shù)復合而成的,公式為S(x)=L(I(L(x))),其中L(x)是仿射變換,而I(x)是逆變換。

仿射變換較為簡單,而在模2的伽羅瓦域上求多項式的逆則比較復雜。

基本的假設是:對于數(shù)字1011,表示的是x^3+x+1,即二進制數(shù)的第n位為1時表示x^(n-1)

S盒仿射變換實現(xiàn)

int change(int x){ ? ?int A1=0xA7; ? ?int flag; ? ?int result=0; ? ?int tem; ? ?int flag2; ? ?for(int i=0;i<8;i++){ ? ? ? ?flag=(A1 & 0x80)>>7; ? ? ? ?tem=x & A1; ? ? ? ?flag2=0; ? ? ? ?for(int j=0;j<8;j++){ ? ? ? ? ? ?flag2^=(tem & 1); ? ? ? ? ? ?tem>>=1; ? ? ? } ? ? ? ?result=result | (flag2<<i); ? ? ? ?A1=(A1<<1) | flag; ? } ? ?result^=0xd3; ? ?return result;}

模2的伽羅瓦域上求多項式的逆

  • 在模2的伽羅瓦域上的多項式的加法和減法都是異或運算

  • 在模2的伽羅瓦域上的多項式乘法實現(xiàn)

    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的伽羅瓦域上的多項式除法實現(xiàn)

    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 distance; ? ?while(1){ ? ? ? ?distance=length(a)-length(b); ? ? ? ?if(distance>=0 && a){ ? ? ? ? ? ?a=a ^ (b<<distance); ? ? ? ? ? ?*round=(*round) | (1<<distance); ? ? ? }else{ ? ? ? ? ? ?*left=a; ? ? ? ? ? ?break; ? ? ? } ? } ? }
  • 在模2的伽羅瓦域上的多項式求逆(采用擴展歐幾里德算法)

    //該函數(shù)表示在模a的情況下,b的逆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); ? ? ? ?//x=x2^multiplication(q,x1); ? ? ? ?y=y2^multiplication(q,y1);? ? ? ? ?a=b; ? ? ? ?b=r; ? ? ? ?//x2=x1; ? ? ? ?//x1=x; ? ? ? ?y2=y1; ? ? ? ?y1=y; ? } ? ?return y2;}

打印S盒的結果

int main(void){ ? ?for(int i=0;i<=0xf;i++) ? ? ? ?printf("\t%x",i); ? ?printf("\n"); ? ?for(int i=0;i<=0xf;i++){ ? ? ? ?printf("%x",i); ? ? ? ?for(int j=0;j<=0xf;j++){ ? ? ? ? ? ?printf("\t%x",change(inverse(0x1f5,change((i<<4)|j)))); ? ? ? } ? ? ? ?printf("\n"); ? }? ? ?return 0;}

總結

以上是生活随笔為你收集整理的sms4的S盒构造c实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。