• 大小: 67KB
    文件类型: .zip
    金币: 2
    下载: 1 次
    发布日期: 2021-09-09
  • 语言: C/C++
  • 标签: SPN  

资源简介

密码学作业2(分组密码与高级加密标准) C语言实现SPN线性密码分析

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include     
#include   
#define T 1000

int K[5][16]x[16]y[16];
int s[16]={1441312151183106125907}; //s盒
int s_1[16]={1434811210157139611205}; //s盒的逆
int p[16]={0481215913261014371115}; //p盒
int p_1[16]={0481215913261014371115};  //p盒的逆

void Key() //密钥    
{   
    int ij;
int t[32]={0011 1010 1001 0100 1101 0110 0011 1111};   
    for(i=0;i<5;i++)
        for(j=0;j<16;j++) 
K[i][j]=t[i*4+j];   
}   
void untwistKey() //解密用到的轮密钥    
{   
    int ijt[5][16];   
    for(i=0;i<5;i++)   
        for(j=0;j<16;j++) 
t[i][j]=K[i][j];   
for(i=0;i<5;i++)
{   
if(i==0||i==4)
{   
for(j=0;j<16;j++) 
K[i][j]=t[4-i][j];   
}   
else
{   
for(j=0;j<16;j++) 
K[i][j]=t[4-i][p_1[j]];   
}   
}   
}   
int decimal(int b[]int len) //二进制转换为十进制 
{   
    int i=0s=0;   
    while(i {
s=s*2+b[i]; 
i++;
}   
    return s;   
}   
void bit(int decint *bitint &len) //十进制转换为二进制  
{   
len=0;
    int it[8];
    while(dec!=0)
{   
        t[len]=dec%2;    
        len++;    
        dec=dec/2;   
    }   
    for(i=0;i bit[i]=t[len-1-i];   
}   
void SPN(int *inputint *output) //SPN代换-置换算法  
{   
    int ijrlendectemp[4];    
    int *w=new int[16]*u=new int[16]*v=new int[16];   
    for(i=0;i<16;i++) w[i]=input[i];   
    for(r=0;r<3;r++)
{   
        for(i=0;i<16;i++) u[i]=(w[i]+K[r][i])%2;   
        for(i=0;i<4;i++)
{   
            for(j=0;j<4;j++) temp[j]=u[4*i+j];   
            dec=decimal(temp4);   
            bit(s[dec]templen);   
            for(j=0;j<4-len;j++) v[4*i+j]=0;   
            for(j=4-len;j<4;j++) v[4*i+j]=temp[j-4+len];   
        }   
        for(i=0;i<16;i++) w[i]=v[p[i]];   
    }   
    for(i=0;i<16;i++) u[i]=(w[i]+K[3][i])%2;   
    for(i=0;i<4;i++)
{   
        for(j=0;j<4;j++) temp[j]=u[4*i+j];   
        dec=decimal(temp4);   
        bit(s[dec]templen);   
        for(j=0;j<4-len;j++) v[4*i+j]=0;   
        for(j=4-len;j<4;j++) v[4*i+j]=temp[j-4+len];   
    }   
    for(i=0;i<16;i++) output[i]=(v[i]+K[4][i])%2;   


void out(int *inputint *outputint flag=0)   //输出明-密文对或密-明文对    
{   
    int i;   
    if(flag==0) printf(“明文:“);   
    else printf(“密文:“);   
    for(i=0;i<16;i++)
{   
        if(i>0&&i%4==0) printf(“ “);    
        printf(“%d“input[i]);   
    }   
    printf(“\n“);   
    if(flag==0) printf(“密文:“);   
    else printf(“明文:“);   
    for(i=0;i<16;i++)
{   
        if(i>0&&i%4==0) printf(“ “);    
        printf(“%d“output[i]);   
    }   
    printf(“\n“);   

void Randtext() //随机生成T个二进制明文 
{   
    int ij;   
    srand((unsigned)time(NULL)); //保证每次运行得到不同明文    
    for(i=0;i {   
        for(j=0;j<16;j++) x[j]=rand()%2;   
        S

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2012-03-28 14:08  SPN线性密码分析\
     目录           0  2012-03-28 14:08  SPN线性密码分析\实现教材SPN方案\
     文件       52176  2012-03-28 14:01  SPN线性密码分析\实现教材SPN方案\out.txt
     文件        4129  2012-03-28 14:04  SPN线性密码分析\实现教材SPN方案\教材SPN方案.cpp
     文件          59  2012-03-28 14:07  SPN线性密码分析\实现教材SPN方案\说明.txt
     目录           0  2012-03-28 14:08  SPN线性密码分析\实现教材SPN线性密码分析\
     文件      288006  2012-03-28 13:27  SPN线性密码分析\实现教材SPN线性密码分析\in.txt
     文件        2028  2012-04-15 17:00  SPN线性密码分析\实现教材SPN线性密码分析\SPN线性密码分析.cpp
     文件         118  2012-03-28 14:10  SPN线性密码分析\实现教材SPN线性密码分析\说明.txt

评论

共有 条评论