俠客行
#include<stdio.h>
#include<string.h>
int m1[200]; // 明文 二進制
int s[8]={0,1,2,3,4,5,6,7};
int k3[200]; // 密鑰二進制
char c[200]; // 密文
int count;
int main(void)
{
int i,j,n;
char m0[100];
int T[8];
printf("輸入密鑰長度:n");
scanf("%d",&n);
printf("初始密鑰:n");
for(i=0;i<n;i++)
scanf("%d",&T);
getchar();
if(n<8)
{
for(i=0;i<8;i++)
T=T[i%n];
printf("初始T盒:n");
for(i=0;i<8;i++)
printf("%d",T);
printf("n");
}
else
{
printf("輸入錯誤,退出程序n");
exit(1);
}
void mingwenchuli(char m0[100]);// 明文處理
mingwenchuli(m0);
void miyao(int T[8]);// 密鑰生成
miyao(T);
void jiami(int m1[200],int k3[200]); // 加密
jiami(m1,k3);
}
void mingwenchuli(char m0[100]) // 明文處理
{
int i,j,r,n,temp;
int m[200];
printf("請輸入明文字符:n");
i=0;
while((m0=getchar())!=n)
i++;
m0=;
j=0;
count=0;
int z=strlen(m0);
int y[200];
for(i=0;i<z;i++)
{
r=0;
int k=0;
y=int(m0);
do{
m[r]=y%2; // 轉換 為 二進制
y=y/2;
m1[count]=m[r];
r++;
count++;
}while(r!=7);
for(j=count-1;j>=count-3;j--)
{
temp=m1[j];
m1[j]=m1[j-6+k];
m1[j-6+k]=temp;
k=k+2;
}
}
m1[count]=;
printf("輸出明文二進制形式:n");
for(r=0;r <count; r++)
printf("%d",m1[r]);
printf("n");
}
void miyao(int T[8])
{
int j,p;
int i,temp,t,l;
int k[100];
int k2[200];
j=0;
for(i=0;i<8;i++) // 密鑰調度
{
j=(j+s+T)%8;
temp=s;
s=s[j];
s[j]=temp;
}
printf("輸出s盒數組:n");
for(i=0;i<8;i++)
printf("%d",s); // 輸出 S 數組
printf("n");
i=0;
j=0;
for(t=0;t<(count/3+1);t++)// 偽隨機調度算法
{
i=(i+1)%8;
j=(j+s)%8;
temp=s;
s=s[j];
s[j]=temp;
l=(s+s[j])%8;
k[t]=s[l];
}
printf("輸出密鑰十進制形式:n");
for(t=0;t<(count/3+1);t++)
printf("%d",k[t]); // 輸出 密鑰 -----十進制
printf("n");
p=0;
for(i=0;i<(count/3+1);i++)
{
j=0;
do{
k2[j]=k%2; // 二進制轉換
k=k/2;
k3[p]=k2[j];
p++;
j++;
}while(j!=3);
temp=k3[p-1];
k3[p-1]=k3[p-3];
k3[p-3]=temp;
}
k3[p]=;
printf("輸出密鑰二進制形式:n");
for(j=0;j<p;j++)
printf("%d",k3[j]);
printf("n");
}
void jiami(int m1[200],int k3[200])
{
int i,j;
for(i=0;i<count;i++) //異或加密
c=m1^k3;
printf("輸出加密密文:n");
for(i=0;i<count;i++)
printf("%d",c);
printf("n");
}