美文网首页
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