在进行AES求解时,涉及到对多项式的求逆的过程。但是好像没有人写过这方面的博客,所以我想试着写一下。
AES中,不可约多项式选择为:m(x) = .
算法的思想是穷举,对于给定的多项式 f(x),穷举多项式g(x),使得 f(x)*g(x) = 1 mod m(x).
(扩展欧几里得算法要比穷举好,但是我不会写....
/*
*** Author: Lizhiwei
*** Date:2021.12.25
*/
#include<bits/stdc++.h>
using namespace std;
int Mod = 283; //模数
stack<int>Mystack;
void Init(){
int k = Mod;
while(k>0){
int t = (k&1);
Mystack.push(t);
k = k >> 1;
}
while(!Mystack.empty()){
int t = Mystack.top();
cout<<t;
Mystack.pop();
}
}
string Str(int t){
stringstream ss;
string str;
ss<<t;
ss>>str;
return str;
}
string GenString(int f){
int k = f;
while(k>0){
int t = (k&1);
Mystack.push(t);
k = k >> 1;
}
string s = "";
while(!Mystack.empty()){
int t = Mystack.top();
string str = Str(t);
s += str;
Mystack.pop();
}
if(s.length()<8){
int len = 8-s.length();
string s1 = "";
string s2 = "";
for(int i=0;i<len;i++){
s1 += "0";
}
s1 += s;
for(int i=0;i<s1.length();i++){
if(s1[i] != '0'){
s2 += Str(s1.length()-1-i);
}
}
return s2;
}
string s2;
for(int i=0;i<s.length();i++){
if(s[i] != '0'){
s2 += Str(s.length()-1-i);
}
}
return s2;
}
void Cheng(string s1, string s2, string s3){
int len1 = s1.length();
int len2 = s2.length();
int t = 0;
int mem[len1*len2]; //
int mem2[15]; // 下标存储系数的个数
for(int i=0;i<15;i++) mem2[i] = 0;
//cout<<"s1 = "<<s1<<" s2 = "<<s2<<" sm = "<<s3<<endl;
for(int i=0;i<len1;i++){
for(int j=0;j<len2;j++){
mem[t++] = int(s1[i]-'0') + int(s2[j]-'0');
}
}
for(int i=0;i<len1*len2;i++){
mem2[mem[i]] += 1;
}
for(int i=0;i<15;i++){
mem2[i] %= 2;
//cout<<mem2[i]<<" ";
}
//cout<<endl;
for(int i=8;i<15;i++){
if(mem2[i] != 0){
mem2[i] = 0;
mem2[i-int(s3[0]-'0')+int(s3[1]-'0')] += 1;
mem2[i-int(s3[0]-'0')+int(s3[2]-'0')] += 1;
mem2[i-int(s3[0]-'0')+int(s3[3]-'0')] += 1;
mem2[i-int(s3[0]-'0')+int(s3[4]-'0')] += 1;
}
}
for(int j=0;j<15;j++){
mem2[j] %= 2;
}
for(int i=8;i<15;i++){
if(mem2[i] != 0){
mem2[i] = 0;
mem2[i-int(s3[0]-'0')+int(s3[1]-'0')] += 1;
mem2[i-int(s3[0]-'0')+int(s3[2]-'0')] += 1;
mem2[i-int(s3[0]-'0')+int(s3[3]-'0')] += 1;
mem2[i-int(s3[0]-'0')+int(s3[4]-'0')] += 1;
}
}
for(int j=0;j<15;j++){
mem2[j] %= 2;
}
for(int i=8;i<15;i++){
if(mem2[i] != 0){
mem2[i] = 0;
mem2[i-int(s3[0]-'0')+int(s3[1]-'0')] += 1;
mem2[i-int(s3[0]-'0')+int(s3[2]-'0')] += 1;
mem2[i-int(s3[0]-'0')+int(s3[3]-'0')] += 1;
mem2[i-int(s3[0]-'0')+int(s3[4]-'0')] += 1;
}
}
for(int j=0;j<15;j++){
mem2[j] %= 2;
}
for(int i=8;i<15;i++){
if(mem2[i] != 0){
mem2[i] = 0;
mem2[i-int(s3[0]-'0')+int(s3[1]-'0')] += 1;
mem2[i-int(s3[0]-'0')+int(s3[2]-'0')] += 1;
mem2[i-int(s3[0]-'0')+int(s3[3]-'0')] += 1;
mem2[i-int(s3[0]-'0')+int(s3[4]-'0')] += 1;
}
}
for(int j=0;j<15;j++){
mem2[j] %= 2;
}
for(int i=8;i<15;i++){
if(mem2[i] != 0){
mem2[i] = 0;
mem2[i-int(s3[0]-'0')+int(s3[1]-'0')] += 1;
mem2[i-int(s3[0]-'0')+int(s3[2]-'0')] += 1;
mem2[i-int(s3[0]-'0')+int(s3[3]-'0')] += 1;
mem2[i-int(s3[0]-'0')+int(s3[4]-'0')] += 1;
}
}
for(int j=0;j<15;j++){
mem2[j] %= 2;
}
for(int i=8;i<15;i++){
if(mem2[i] != 0){
mem2[i] = 0;
mem2[i-int(s3[0]-'0')+int(s3[1]-'0')] += 1;
mem2[i-int(s3[0]-'0')+int(s3[2]-'0')] += 1;
mem2[i-int(s3[0]-'0')+int(s3[3]-'0')] += 1;
mem2[i-int(s3[0]-'0')+int(s3[4]-'0')] += 1;
}
}
for(int j=0;j<15;j++){
mem2[j] %= 2;
}
for(int i=8;i<15;i++){
if(mem2[i] != 0){
mem2[i] = 0;
mem2[i-int(s3[0]-'0')+int(s3[1]-'0')] += 1;
mem2[i-int(s3[0]-'0')+int(s3[2]-'0')] += 1;
mem2[i-int(s3[0]-'0')+int(s3[3]-'0')] += 1;
mem2[i-int(s3[0]-'0')+int(s3[4]-'0')] += 1;
}
}
for(int j=0;j<15;j++){
mem2[j] %= 2;
}
for(int i=8;i<15;i++){
if(mem2[i] != 0){
mem2[i] = 0;
mem2[i-int(s3[0]-'0')+int(s3[1]-'0')] += 1;
mem2[i-int(s3[0]-'0')+int(s3[2]-'0')] += 1;
mem2[i-int(s3[0]-'0')+int(s3[3]-'0')] += 1;
mem2[i-int(s3[0]-'0')+int(s3[4]-'0')] += 1;
}
}
for(int i=0;i<15;i++){
mem2[i] %= 2;
}
int flag1 = mem2[0];
int flag2 = 0;
for(int i=1;i<15;i++){
if(mem2[i]!=0) flag2 = 1;
}
if(flag1 == 1 && flag2 ==0){
cout<<"(";
for(int i=0;i<s2.length()-1;i++){
cout<<"x^"<<s2[i]<<"+";
}
cout<<"x^"<<s2[s2.length()-1]<<")^{-1} = ";
for(int i=0;i<s1.length()-1;i++){
cout<<"x^"<<s1[i]<<"+";
}
cout<<"x^"<<s1[s1.length()-1]<<endl;
//cout<<" ans = "<<s1 <<" "<<s2<<endl;
}
}
void Solve(int f,int X,int Mod){
string s_f = GenString(f);
string s_x = GenString(X);
string s_m = GenString(Mod);
//cout<<"s_f = "<<s_f<<" s_x = "<<s_x<<" s_m = "<<s_m<<endl;
Cheng(s_f, s_x, s_m);
}
int main(){
Init();
cout<<endl;
for(int X=1;X<255;X++){
for(int i=1;i<255;i++){
Solve(i, X, Mod);
}
}
return 0;
}