GF(2^8)内的乘法
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
char MultiplyX(char num);
char gfMUL(char a,char b);
void showChar(char num);
char binaryTOchar(string data);
int main(){
char a,b;
string sa,sb;
cin>>sa>>sb;
a=binaryTOchar(sa);
b=binaryTOchar(sb);
showChar(gfMUL(a,b));
system("pause");
return 0;
}
char MultiplyX(char num){
//输入一个代表GF(2^8)中的元素的八位二进制数,返回代表该项乘以x后的结果的八位二进制数
if(num&0x80){
num=num<<1;
num=num^0x1B;
return num;
}
else{
num=num<<1;
return num;
}
}
char gfMUL(char a,char b){
//输入两个代表GF(2^8)中的元素的八位二进制数,返回代表两个元素相乘之后的结果的那个八位二进制数
char temp[8],res=0x00;
char x=0x01;
temp[0]=a;
for(int i=1;i<8;i++){
temp[i]=MultiplyX(temp[i-1]);
}
//将数a与x的1-8次方相乘的结果存在数组中
for(int i=0;i<8;i++){
if(b&x){
if(!res){
res=temp[i];
}
else{
res=res^temp[i];
}
}
x=x<<1;
}
return res;
}
void showChar(char num){
string data;
char x=0x01;
for(int i=0;i<8;i++){
if(num&x){
data+='1';
}
else{
data+='0';
}
x=x<<1;
}
reverse(data.begin(),data.end());
cout<<data<<endl;
return;
}
char binaryTOchar(string data){
char res='\0';
for(int i=0;i<8;i++){
if(data[i]=='1'){
res=(res<<1)|0x01;
}
else{
res<<=1;
}
}
return res;
}
测试截图:
乘法测试截图.PNG
求乘法逆元
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int highest_bit(int n);
int * DIV(int a, int b);
int inverse(int a,int m);
int mul(int a, int b);
int main(){
return 0;
}
int mul(int a, int b)
{
int r=0;
while(b>0)
{
if(b%2==1){r=r^a;}
b=b>>1;
if((a&128)==0){a=a<<1;}
else
{
a=a<<1;
a=a%283;
}
}
return r;
}
int highest_bit(int n)
{
int count=0;
while (n>0)
{
++count;
n=n>>1;
}
return count-1;
}
int * DIV(int a, int b)
{
int *result;
result=(int*)malloc(sizeof(int)*2);
if(a==b)
{
result[0]=1;result[1]=0;return result;
}
if(a<b)
{
result[0]=0;result[1]=a;return result;
}
int a_bit=highest_bit(a);
int b_bit=highest_bit(b);
int move,temp;
result[0]=0;
while(!(a_bit<b_bit))
{
move=a_bit-b_bit;
temp=b<<move;
result[0]=result[0]+(1<<move);
a=a^temp;
a_bit=highest_bit(a);
}
result[1]=a;
return result;
}
int inverse(int a,int m)
{
int r0=1,s0=0,r1=0,s1=1;
int t,*q,r0_temp,s0_temp;
q=(int*)malloc(sizeof(int)*2);
q[1]=m;
while(q[1]>0)
{
t=q[1];
q=DIV(a,q[1]);
a=t;
r0_temp=r0;s0_temp=s0;
r0=r1;s0=s1;
r1=r0_temp^mul(q[0],r1);
s1=s0_temp^mul(q[0],s1);
}
free(q);
return r0;
}
网友评论