美文网首页
ComSec作业三--编程题(AES)

ComSec作业三--编程题(AES)

作者: guoant | 来源:发表于2019-10-13 23:37 被阅读0次

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;
}

相关文章

网友评论

      本文标题:ComSec作业三--编程题(AES)

      本文链接:https://www.haomeiwen.com/subject/idykmctx.html