密码学AES算法_S盒_C值搜索
生活随笔
收集整理的這篇文章主要介紹了
密码学AES算法_S盒_C值搜索
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 效果
- 代碼
效果
代碼
#include<stdio.h> //SBox int SBox[16][16]; //m(x) int M_x = 283; //m(x)_set int M_x_set[30] = {283,285,299,301,313,319,333,351,355,357,361,369,375,379,391,395,397,415,419,425,433,445,451,463,471,477,487,499,501,505}; //M_x_set長度 int Len_M_x_set = 30;char dec2Hex(int n); //10進制轉16進制 void init(); //SBox初始化 void exgcd(); //求逆元 int numb_bits(int v); //十進制的二進制位數 int polydivide(int a, int b, int* remainder); //多項式除法 int polyMulti(int a, int b); //多項式乘法 int Ext_Euclid(int a, int b); //擴展歐幾里得算法 void transforms(int* c); //位變換 int transform(int num, int* c); int encrypt(int clear); //加密算法 void search_c(int *c_array, int *pos); //c值搜尋 void ferfect_c(); //完美c值搜尋 void show_c(); //c值展示 void decto2(int* c, int flag); //二進制加法int main() {show_c();return 0; }//輸入明文,輸出密文 int encrypt(int clear) {return SBox[clear / 16][clear % 16]; } //c值搜尋 void search_c(int* c_array, int *pos){int c[8], flag;for (int i = 0; i < 256;i++) {decto2(c, i); //二進制加法init(); //SBox初始化exgcd(); //求逆元transforms(c); //位變換flag = 0;for (flag; flag< 256;flag++) {if (flag == encrypt(flag) || 255 - flag == encrypt(flag)) break;}if(flag==256) c_array[++(*pos)] = i;} }//完美c值搜尋 void ferfect_c(){//初始化int c_array[255], perfect_c_0_1[16][16], pos;for (int i = 0; i < 16; i++) {for (int j = 0; j < 16; j++) {perfect_c_0_1[i][j] = 0;}}//c值搜尋for (int i = 0; i < Len_M_x_set; i++) {pos = -1;search_c(c_array, &pos);for (int j = 0; j <= pos; j++) {perfect_c_0_1[c_array[j] / 16][c_array[j] % 16]++;}}//c值展示printf("perfect_c_0_1矩陣展示:");for (int i = 0; i < 16; i++) {printf("\n");for (int j = 0; j < 16; j++) {printf("%d ", perfect_c_0_1[i][j]);}} }void show_c() {int c_array[255], c_0_1[16][16], pos = -1;search_c(c_array, &pos);for (int i = 0; i < 16; i++) {for (int j = 0; j < 16; j++) {c_0_1[i][j] = 0;}}//滿足條件c置1for (int i = 0; i <= pos; i++) {c_0_1[c_array[i] / 16][c_array[i] % 16] = 1;}//c展示int m_x[9];for (int i = 8; i >= 0;i--) {m_x[i] = M_x % 2;M_x = (M_x - M_x % 2) / 2;}printf("\nm_x多項式:");for (int i = 0; i < 9; i++) {printf("%d ",m_x[i]);}printf("\n符合條件的c值共有 %d 個", pos + 1);printf("\nc_0_1矩陣展示:");for (int i = 0; i < 16; i++) {printf("\n");for (int j = 0; j < 16; j++) {printf("%d ", c_0_1[i][j]);}} }//十進制轉二進制 void decto2(int *c, int flag) {for (int i = 7; i >= 0;i--) {c[i] = flag % 2;flag = (flag - flag % 2) / 2;} }// 將輸入的整數的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;}}//SBox打印/*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], M_x);// 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相與,就可以將其設置為1tmp = b;//將被除數向左移c位再與a相與,并賦給atmp = 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就等于0result = 0;while (b){r = b % 2;b = b / 2;if (value >> 7) //b7為1,就要與00011011相與value = (value << 1) & 0xff ^ 27;elsevalue = (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,余數存在r2r1 = 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(int *c) {//printf("\n位變換:\n");for (int i = 0, j = 0; i < 16; i++) {for (j = 0; j < 16; j++) {SBox[i][j] = transform(SBox[i][j], c);//printf("%c%c ", dec2Hex(SBox[i][j] / 16), dec2Hex(SBox[i][j] % 16));}//printf("\n");} }int transform(int num, int *c) {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盒_C值搜索的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: scikit-learning_特征分析
- 下一篇: Hadoop组件基本操作