凯撒加密与矩阵换位加密

来源:互联网 发布:淘宝轮播图代码 编辑:程序博客网 时间:2024/06/06 08:09

今天做加密算法实验,设计两个古典加密的算法,小case啦,
矩阵换位加密对字符串操作高一点,花的时间也久一点,然后贴代码
/////////////////////////凯撒加密
#include "stdio.h"
#include "string.h"
void E(char * c)
{
int k=20;
int temp=*c, jishu;


if(temp>='a' && temp<='z')
{
jishu='a';
temp-='a';
}
else if(temp>='A' && temp<='Z')
{
jishu='A';
temp-='A';
}

temp=(temp+k)%26;
*c=(char)(temp+jishu);
}


int main()
{
int i;
char str[50];
printf("请输入要加密的明文  ");
gets(str);
printf("加密后的密文为  ");
for(i=0; i<strlen(str); i++)
{
if(str[i]>='0' && str[i]<='9')
continue;
else
{
E(&str[i]);
}


}
puts(str);
//printf("\n");
return 0;
}
////////////////////矩阵换位加密
#include "stdio.h"
#include "string.h"


void en(char * strmingwen,  char (* strmiwen)[20], char * strmiyao, int miyaolen);


int main()
{
char strmingwen[200],strmiyao[20],strmiwen[20][20];
int len;


printf("请输入明文 ");
gets(strmingwen);
printf("请输入密钥 ");
gets(strmiyao);

//strcpy(strmingwen,"attackbeginsatfive");
//strcpy(strmiyao,"cipher");
len=strlen(strmiyao);
en(strmingwen, &strmiwen[0], strmiyao, len);



return 0;
}






void en(char * strmingwen,  char (* strmiwen)[20], char * strmiyao, int miyaolen)
{
int i, j, a[20], xiabiao=0, hang=0;//数组a存密钥中字母出现的先后顺序,取值从0开始
char strtemp[20], strmingwenjuzhen[20][20], ctemp;


for(i=0; i<20; i++)//循环strmiyao数组下标
{
for(j=0; j<20; j++)//循环strtemp数组下标
{
strmiwen[i][j]='0';
}
}
//////////////////////////////////////////////处理明文为矩阵
for(i=0;  xiabiao<strlen(strmingwen); i++)
{
for(j=0; j<miyaolen && xiabiao<strlen(strmingwen); j++)
{
strmingwenjuzhen[i][j]=strmingwen[xiabiao];
xiabiao++;
}
hang++;
}


////////////////////////////////////////处理密钥
strcpy(strtemp, strmiyao);
for(i=0; i<miyaolen; i++)//strtemp升序排序
{
for(j=i+1; j<miyaolen; j++)
{
if(strtemp[i]>strtemp[j])
{
ctemp=strtemp[i];
strtemp[i]=strtemp[j];
strtemp[j]=ctemp;
}

}
}



for(i=0; i<miyaolen; i++)//循环strmiyao数组下标
{
for(j=0; j<miyaolen; j++)//循环strtemp数组下标
{
if(strmiyao[i] == strtemp[j])
{
a[i]=j;//把下标存入a数组,即strmiyao[i]在strmiyao数组中的升序排序序号
break;
}
}
}





//////////////////////////////////加密
for(i=0; i<hang; i++)//i为行循环 把mingwen按a数组的顺序加密存入miwen中
{
for(j=0; j<miyaolen; j++)
{
strmiwen[ i ][ a[j] ]= strmingwenjuzhen[ i ][ j ];//循环strmiwenjuzhen,按a[j]顺序存入strmiwen
}

}
///////////////////////////////////////////////////////
for(j=0; j<miyaolen; j++)//输出
{
for(i=0; i<hang; i++)
{
if(strmiwen[ i ][ j ] >= 'a' &&  strmiwen[ i ][ j ] <= 'z')
{
printf("%c",strmiwen[ i ][ j ]);
}
}

}
printf("\n");

}

原创粉丝点击