📄 spn加密.cpp
字号:
#include <fstream.h>
#include <stdlib.h>
#include<stdio.h>
static char w[17];
static char u[17];
static char v[17];
void xor(char *c1,char *c2) //异或运算,相同为零,不同为一
{
for(int i=0;i<16;i++)
{
if(c1[i]==c2[i])
u[i]='0';
else u[i]='1';
}
return ;
}
void alt_s(char * c)
{
int a[4];
for(int i=0;i<4;i++)
{
a[i]=(c[i*4]-48)*8+(c[i*4+1]-48)*4+(c[i*4+2]-48)*2+c[i*4+3]-48;
switch (a[i])
{
case 0: a[i]=14; break;
case 1: a[i]=4; break;
case 2: a[i]=13; break;
case 3: a[i]=1; break;
case 4: a[i]=2; break;
case 5: a[i]=15; break;
case 6: a[i]=11; break;
case 7: a[i]=8; break;
case 8: a[i]=3; break;
case 9: a[i]=10; break;
case 10: a[i]=6; break;
case 11: a[i]=12; break;
case 12: a[i]=5; break;
case 13: a[i]=9; break;
case 14: a[i]=0; break;
case 15: a[i]=7; break;
}
}
for(i=0;i<4;i++)
{
if(a[i]>=8)
{
v[i*4]='1';
a[i]=a[i]-8;
}
else
v[i*4]='0';
if(a[i]>=4)
{
v[i*4+1]='1';
a[i]=a[i]-4;
}
else
v[i*4+1]='0';
if(a[i]>=2)
{
v[i*4+2]='1';
a[i]=a[i]-2;
}
else
v[i*4+2]='0';
if(a[i]==1)
v[i*4+3]='1';
else
v[i*4+3]='0';
}
}
void alt_w(char * c)
{
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
{
w[i*4+j]=c[j*4+i];
}
}
void main()
{
char *k[6];
int i,j,k1=1;
k[1]="0011101010010100"; k[2]="1010100101001101"; k[3]="1001010011010110"; k[4]="0100110101100011"; k[5]="1101011000111111"; //定义了子密钥
ifstream fin("明文流.txt");
ofstream fout("密文流.txt");
while(k1++<256*256)
{
for(i=0;i<16;i++)
{
fin>>w[i];
}
for(j=1;j<=3;j++)
{
xor(w,k[j]); //明文与子密钥异或,结果放到u中
alt_s(u); //用s盒子代换,结果放到v中
alt_w(v); //置换,结果放到w中
}
xor(w,k[4]);
alt_s(u);
xor(v,k[5]);
fout<<u;
}
fin.close();
fout.close();
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -