Demo entry 6684547

112

   

Submitted by 112 on Dec 16, 2017 at 03:44
Language: C++. Code size: 2.3 kB.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void Main_key(void){
    srand((unsigned)time(NULL));
    int mainkey[128];
    int i=0;
    for(i=0;i<128;i++)mainkey[i]=rand()%2;
    printf("主密钥为:\n");
    for(i=0;i<128;i++)printf("%d ",mainkey[i]);
    printf("\n");
}
void LFSR(int mainkey[128],int subkey[16][8]){
    int q=0,p=0,i=0,j=0,a[4]={0};
    for(q=0;q<16;q++){
        for(p=0;p<4;p++)a[p]=mainkey[p+8*q];
        for(i=0;i<5;i++){
            int f=0;
            f=a[0]^a[1];
            for(j=0;j<3;j++)a[j]=a[j+1];
            a[3]=f;
        }
        for(i=0;i<8;i++){
            subkey[q][i]=a[0];
            int f=0;
            f=a[0]^a[1];
            for(j=0;j<3;j++)a[j]=a[j+1];
            a[3]=f;
        }
    }
}
void Encrypt(void){
    char plain[16];
    int mainkey[128];
    int subkey[16][8];
    int i=0,j=0;
    printf("请输入主密钥:\n");
    for(i=0;i<128;i++)scanf("%d",&mainkey[i]);
    printf("请输入明文:\n");
    scanf("%s",plain);
    LFSR(mainkey,subkey);
    int L[17][8]={0},R[17][8]={0};
    for(i=0;i<8;i++)L[0][i]=plain[i];
    for(i=8,j=0;i<16&&j<8;i++,j++)R[0][j]=plain[i];
    for(i=1;i<17;i++){
        for(j=0;j<8;j++)L[i][j]=R[i-1][j];
        for(j=0;j<8;j++)R[i][j]=(R[i-1][j]-2*subkey[i-1][j])^L[i-1][j];
    }
    int cipher[16]={0};
    for(i=0;i<8;i++)cipher[i]=L[16][i];
    for(i=8,j=0;i<16&&j<8;i++,j++)cipher[i]=R[16][j];
    printf("密文为:\n");
    for(i=0;i<16;i++)printf("%d ",cipher[i]);
    printf("\n");
}
void Decrypt(void){
    int cipher[16],mainkey[129],subkey[16][8];
    int i=0,j=0;
    printf("请输入主密钥:\n");
    for(i=0;i<128;i++)scanf("%d",&mainkey[i]);
    printf("请输入密文:\n");
    for(i=0;i<16;i++)scanf("%d",&cipher[i]);
    LFSR(mainkey,subkey);
    int L[17][8]={0},R[17][8]={0};
    for(i=0;i<8;i++)L[0][i]=cipher[i];
    for(i=8,j=0;i<16&&j<8;i++,j++)R[0][j]=cipher[i];
    for(i=1;i<17;i++){
        for(j=0;j<8;j++)R[i][j]=L[i-1][j];
        for(j=0;j<8;j++)L[i][j]=(L[i-1][j]-2*subkey[16-i][j])^R[i-1][j];
    }
    char plain[16]={0};
    for(i=0;i<8;i++)plain[i]=L[16][i];
    for(i=8,j=0;i<16&&j<8;i++,j++)plain[i]=R[16][j];
    printf("明文为:\n");
    printf("%s ",&plain[0]);
    printf("\n");
}
int main(void)
{
    Main_key();
    Encrypt();
    Decrypt();
    
}

This snippet took 0.02 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).