用C语言编程恺撒密码加密解密程序

用C语言编程恺撒密码加密解密程序,第1张

#include <stdioh>
#define isletter( c )    ( ((c)>='a'&&(c)<='z') || ((c)>='A'&&(c)<='Z') )
void Enc( const char str, char out, int key )
{
    int i = 0; 
    while( str[i] )
    {
        if ( isletter( str[i] ) )
        {
            out[i] = str[i] + key;
            if ( ! isletter( out[i])  )
                out[i] -= 26;
        }
        else
            out[i] = str[i];
        i++;
    }
    out[i] = 0;
}
void Denc( const char str, char out, int key )
{
    int i=0;
    while( str[i] )
    {
        if ( isletter( str[i] ) )
        {
            out[i] = str[i] - key;
            if ( ! isletter( out[i] ) )
                out[i] += 26;
        }
        else
            out[i] = str[i];
        i++;
    }
    out[i] = 0;
}
int main()
{
    char  out[100], out2[100];
    Enc( "THE QUICK BROWn fox jumps over THE LAZY DOG", out, 3 );
    printf( "%s\n", out );
    Denc( out, out2, 3 );
    printf( "%s\n", out2 );
}

这里使用的是按位加密,按ASCII码进行加密的算法自己写个,很容易的。
#include<stdioh>
#include<stdlibh>
#include<conioh>
#include<stringh>
void dofile(char in_fname,char pwd,char out_fname);/对文件进行加密的具体函数/
void usage(char name);
void main(int argc,char argv[])/定义main()函数的命令行参数/
{
char in_fname[30];/用户输入的要加密的文件名/
char out_fname[30];
char pwd[10];/用来保存密码/
if(argc!=4)
{/容错处理/
usage(argv[0]);
printf("\nIn-fname:\n");
gets(in_fname);/得到要加密的文件名/
while(in_fname==NULL)
{
printf("\nIn-fname:\n");
gets(in_fname);
}
printf("Password 6-8:\n");
gets(pwd);/得到密码/
while(pwd==NULL || strlen(pwd)>8 || strlen(pwd)<6)
{
printf("Password 6-8:\n");
gets(pwd);
}
printf("Out-file:\n");
gets(out_fname);/得到加密后你要的文件名/
while(in_fname==NULL)
{
printf("Out-file:\n");
gets(out_fname);
}
while(!strcmp(in_fname,out_fname))
{
printf("文件名不能和源文件相同\n");
printf("Out-file:\n");
gets(out_fname);
}
dofile(in_fname,pwd,out_fname);
printf("加密成功,解密请再次运行程序\n");
}
else
{/如果命令行参数正确,便直接运行程序/
strcpy(in_fname,argv[1]);
strcpy(pwd,argv[2]);
strcpy(out_fname,argv[3]);
while(pwd==NULL || strlen(pwd)>8 || strlen(pwd)<6)
{
printf("Password faied!\n");
printf("Password 6-8:\n");
gets(pwd);
}
while(!strcmp(in_fname,out_fname))
{
printf("文件名不能和源文件相同\n");
printf("Out-file:\n");
gets(out_fname);
while(in_fname==NULL)
{
printf("Out-file:\n");
gets(out_fname);
}
}
dofile(in_fname,pwd,out_fname);
printf("加密成功,解密请再次运行程序\n");
}
}
/加密子函数开始/
void dofile(char in_fname,char pwd,char out_file)
{
FILE fp1,fp2;
register char ch;
int j=0;
int j0=strlen(pwd);
fp1=fopen(in_fname,"rb");
if(fp1==NULL)
{
printf("cannot open in-file\n");
exit(1);/如果不能打开要加密的文件,便退出程序/
}
fp2=fopen(out_file,"wb");
if(fp2==NULL)
{
printf("cannot open or create out-file\n");
exit(1);/如果不能建立加密后的文件,便退出/
}
/加密算法开始/
while(j0>=0)
{
ch=fgetc(fp1);
while(!feof(fp1))
{
fputc(ch^pwd[j>=j0j=0:j++],fp2);/异或后写入fp2文件/
ch=fgetc(fp1);
}
j0--;
}
fclose(fp1);/关闭源文件/
fclose(fp2);/关闭目标文件/
}
void usage(char name)
{
printf("\t=======================File encryption======================\n");
printf("\tusage: %s In-fname password out_fname\n",name);
printf("\tExample: %s file1txt 12345678 file2txt\n",name);
}

/
输入1个四位数,将其加密后输出。
方法是将该数每一位上的数字加9,然后除以10取余,做为该位上的新数字,最后将第1位和第3位上的数字互换,第2位和第4位上的数字互换,组成加密后的新数。
例:括号内是说明
输入
1257
输出
The encrypted number is 4621(每一位上的数字加9除以10取余后,得0146,交换后得到4601)
/
#include <stdioh>
int main( )
{
int number, digit1, digit2, digit3, digit4, newnum;
scanf("%d", &number);
digit1 = number/1000;
digit2 = (number - 1000 digit1)/100;
digit3 = (number - 1000 digit1 - 100 digit2)/10;
digit4 = number - 1000 digit1 - 100 digit2 - 10 digit3;

digit1 += 9;
digit1 %= 10;
digit2 += 9;
digit2 %= 10;
digit3 += 9;
digit3 %= 10;
digit4 += 9;
digit4 %= 10;
//第三位数是1的情况不做考虑

newnum = digit3 1000 + digit4 100 + digit1 10 +digit2;
printf("The encrypted number is %d\n", newnum);
return 0;
}

#include<stdioh>
#include<stdlibh>
#include<conioh>
main()
{
char key[8]={0};//接受8位数密码
char ch=0;
int i=0,j=0;//循环变量
int number=0;//选择功能键的变量
char temp=0;
printf("〓〓〓〓〓〓〓〓〓〓〓〓〓密码加密系统〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓\n");
printf("\n〖⒈显示密码〗\n");
printf("〖⒉加密密码〗 \n");
printf("〖⒊解密密码〗 \n");
printf("〖⒋退出程序〗 \n");
printf("\n〓〓〓〓〓〓〓〓〓〓〓〓〓密码加密系统〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓\n");
printf("请输入8位密码:");
for(i=0;i<8;i++)
{
ch=getch();
key[i]=ch;
printf("");
}
while(1)
{
printf("\n请选择功能 :");
scanf("%d",&number);
if(number<=4)
{
switch(number)
{
case 1:
{
for(i=0;i<9;i++)
if(key[i]=='\r') printf("回车");
else if(key[i]=='\b') printf("退格");
else printf("%c",key[i]);
break;
}
case 2:
{
for(i=0;i<9;i++) key[i]+=5;
temp=key[0];
key[0]=key[8];
key[8]=temp;
for(i=0;i<9;i++) printf("%d",key[i]);
break;
}
case 3:
{
for(i=0;i<9;i++) key[i]-=5;
temp=key[0];
key[0]=key[8];
key[8]=temp;
for(i=0;i<9;i++)
if(key[i]=='\r') printf("回车");
else if(key[i]=='\b') printf("退格");
else printf("%c",key[i]);
break;
}
case 4: exit(0);
}
}
else
{
printf("\n您输入的功能键有误请重新输入");
scanf("%d",&number);
}
}
}
/VC++ 60编译通过。注:从键盘输入的回车是'\r',而不是'\n'/

// 希尔算法的加密与解密
#include <stdioh>
#include <stringh>
#include <conioh>
#include <ctypeh>
#include <memoryh>// nDime为全部变量,可逆矩阵的维数
int nDime;
int index = 0;// MAXN为明文的最大长度
const int MAXN = 256;// 矩阵相乘,a是一个列为1的矩阵
void MultiplyMatrix(int a[], int b[][10], int text)
{
int i, j, t; for (i = 0; i < nDime; i++)
{
t = 0;
for (j = 0;j < nDime; j++)
t += b[i][j] a[j];
text[index++] = t;
}
}// 求行列式的值
int determinant(int m[][10], int size)
{
int row, column;
int temp1[10], temp2[10], t; for (column = 0; column < size; column++)
{
temp1[column] = m[0][column];
temp2[column] = m[0][column];
}
for (row = 1; row < size; row++)
{
for (column = 0; column < size; column++)
{
int diff = column - row;
int sum = column + row;
if (diff < 0)
diff += size;
if (sum >= size)
sum %= size;
temp1[diff] = m[row][column];
temp2[sum] = m[row][column];
}
}
t = 0;
for (row = 0; row < size; row++)
t += temp1[row] - temp2[row]; return t;
}// 求矩阵中某一元素的代数余子式
int func(int matrix[][10], const int i, const int j)
{
int row, column, m, n;
int NewMatrix[10][10]; m = n = 0;
for (row = 0; row < nDime; row++)
{
if (i == row)
continue;
for (column = 0; column < nDime; column++)
{
if (j == column)
continue;
NewMatrix[m++][n++] = matrix[row][column];
}
}

printf ("New Array:\n");
for (row = 0; row < nDime - 1; row++)
{
for (column = 0; column < nDime - 1; column++)
printf("%d ", NewMatrix[row][column]);
printf("\n");
} int sign = (!((i + j) % 2)) 1 : -1;
return sign determinant(NewMatrix, nDime - 1);
}// 对矩阵求逆,cm矩阵与m矩阵互逆
void ConverseMatrix(int m[][10], int cm[][10])
{
// 矩阵求逆,利用数学公式A(逆)= (1 / |A|)乘以A
// 其中,|A|表示行列式A的值,而A表示矩阵A的伴随矩阵
int row, column;
int StarMat[10][10]; // StarMat表示m的伴随矩阵
int t; // 初始化伴随矩阵
for (row = 0; row < 10; row++)
for (column = 0; column < 10; column++)
StarMat[row][column] = 0; // 求伴随矩阵
for (row = 0; row < nDime; row++)
for (column = 0; column < nDime; column++)
{
StarMat[row][column] = func(m, row, column);
printf("伴随矩阵:%d", StarMat[row][column]);
} // 求行列式的值
t = determinant(m, nDime); // 求出逆向矩阵
for (row = 0; row < nDime; row++)
for (column = 0; column < nDime; column++)
cm[row][column] = StarMat[row][column] / t;
// 输出逆向矩阵
for (row = 0; row < nDime; row++)
for (column = 0; column < nDime; column++)
printf("%d ", cm[row][column]);
printf("\n");
}// 希尔加密及解密算法
void ShellPassword(int OText, int TextLen, int matrix[][10], int text)
{
int i, j, n, a[10];

// 判断要将OText分成几部分
n = TextLen / nDime;
if (TextLen % nDime)
n++; // 矩阵相乘
// 将OText分成的几部分分别与matrix矩阵相乘
for (i = 0; i < n; i++)
{
for (j = 0; j < 10; j++)
a[j] = 0;
for (j = 0; j < nDime; j++)
a[j] = OText[i nDime + j];
MultiplyMatrix(a, matrix, text);
}
}
int main(void)
{
int i, temp, row, column;
// matrix存放加密或解密矩阵,Password为加密后的结果
// OText存放原文转换为普通数字,如A~1,Z~26
int matrix[10][10], ConMatrix[10][10], OText[MAXN], Password[MAXN], OriText[MAXN];
char text[MAXN];
char sel; printf("=================================================\n");
putchar('\n');
printf(" SHELL加密解密器\n");
putchar('\n');
printf("=================================================\n"); while (1)
{
// 初始化矩阵
for (row = 0; row < 10; row++)
for (column = 0; column < 10; column++)
matrix[row][column] = 0; putchar('\n');
printf("1加密\n");
printf("2解密\n");
printf("0退出\n");
printf("请输入你的选择:\n");
sel = getche(); switch (sel)
{
case '1':
printf("\n请输入原文:\n");
memset(text, '\0', sizeof(text) / sizeof(char));
memset(Password, 0, sizeof(Password) / sizeof(int));
gets(text); printf("输入加密矩阵的维数,维数不能超过10维:\n");
scanf("%d", &nDime);
printf("输入矩阵,该矩阵必须为可逆矩阵,否则将不能进行解密:\n");
// 可逆矩阵即,设A为n阶矩阵,如果存n在阶矩阵B使得AB=BA=1
// 则矩阵A是可逆的,称B是A的逆矩阵
for (row = 0; row < nDime; row++)
for (column = 0; column < nDime; column++)
scanf("%d", &matrix[row][column]);
// 将小写字母转换为大写字母
for (i = 0; text[i] != '\0'; i++)
if (islower(text[i]))
text[i] |= 0x20;
// OText存放将字母转换为相应数,如A~1,Z~26
for (i = 0; i < MAXN; i++)
OText[i] = 0;
for (i = 0; text[i] != '\0'; i++)
OText[i] = text[i] - 'A' + 1;
// 加密
ShellPassword(OText, strlen(text), matrix, Password);
// 将加密后的内容打印出来
printf("加密后的内容为:\n");
for (i = 0; i < strlen(text); i++)
printf("%d ", Password[i]);
putchar('\n');
break;
case '2':
break;
case '0':
return 0;
default:
break;
}
getchar();
} return 0;
} 译码算法我会在明天上传上来,你的加密密钥是一个三阶的数组,密文C是:1729 2514 811 1659 2472 858 1739 2514 849 1902 2736 905 1659 2472 858


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12846943.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-28
下一篇 2023-05-28

发表评论

登录后才能评论

评论列表(0条)

保存