用C语言设计一个加密 解密 密码 的程序。

初学者练习写程序。使用摩斯密码练习。

遇到瓶颈了,我用一个数组保存 加密后的 密码。
但是怎么设置每个 密码 对应的 明码 我没有思路。
下面是我写的那么一点,没什么用,不过也贴上来吧。

怎么让计算机把密码翻译成明码呢?
密码对应表怎么建立?
怎么让计算机根据对应表一一翻译?
请指教啊?

谢谢!

#include <stdio.h>

Ddi(int * di)
{
di = (char *)malloc(sizeof(int));
di = 45; //定义滴.
return di;
}

Dda(int * da)
{
da = (char *)malloc(sizeof(int));
da = 42; //定义答.
return da;
}

a()
{
char * a;
a = (char*)malloc(2 * sizeof(char));
a[0] = '*';
a[1] = '-';
}

b()
{
char * b;
b = (char*)malloc(4 * sizeof(char));
b[0] = '-';
b[1] = '*';
b[2] = '*';
b[3] = '*';
}

c()
{
char * c;
c = (char*)malloc(4 * sizeof(char));
c[0] = '-';
c[1] = '*';
c[2] = '-';
c[3] = '*';
}

d()
{
char * d;
d = (char*)malloc(3 * sizeof(char));
d[0] = '-';
d[1] = '*';
d[2] = '*';
}

Ptable() //函数作用:保存密码表,并存放在 password table 动态数组中.未完成
{
char * password;
password = (char*)malloc(3000); //定义一个动态数组储存密码表.
return;
}

shuru() //函数作用:输入需要翻译的密码,并保存在 password 动态数组中.
{
int control,ceshi,number;
char * password;
password = (char*)malloc(30000); //定义一个数组接受密码。
control = 0;

scanf("%s",&password[control]);

number = strlen(password); //计算一共向数组输入了几个字符.

for(ceshi=0;ceshi<number;ceshi++) //输入多少个字符,就输出多少次.
{
printf("%c",password[control]); //由control控制数组连续输出
control++;
}
return password;
}

main ()
{
char * di;char * da;
char * password;
di = Ddi(&di);
da = Dda(&da);
Ptable(); //此函数未完成
password = shuru();
printf("%c%c",di,da);

}

// playFair 加密 你参考下 ...
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#define x 50
char MiYao[x],PassWord[x],AddPass[x],Table[5][5],Map[25];
bool Visit[27]={false};
char English[27]="abcdefghijklmnopqrstuvwxyz";
void Input()
{
printf("请输入密钥:\t"); scanf("%s",MiYao);
printf("请输入待加密密码:\t"); scanf("%s",PassWord);
}
void Fun_5x5()
{
int count = 0,V =0;
/*标记密钥内字符为: true*/
for(int i=0;MiYao[i]!='\0';i++)
if(strchr(English,MiYao[i])!=NULL)
Visit[strchr(English,MiYao[i])-English] = true;
/*执行密钥矩阵操作 并标记已使用字符:true*/
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
{
if(count<strlen(MiYao))
Table[i][j] = MiYao[count++];
else
{
while(Visit[V] != false) V++;
Table[i][j] = English[V];
Visit[V++] = true;
}
}
puts("∞∞∞密钥矩阵为∞∞∞");
for(int i=0;i<5;i++)
{ for(int j=0;j<5;j++)
printf("%3c",Table[i][j]);
puts("");
}
puts("∞∞∞∞∞∞∞∞∞∞∞");

}
int IsVisited(char ch)
{
return Visit[strchr(English,ch)-English]; //false 未出现过
}
void TabletoMap()
{ int count=0;
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
Map[count++]=Table[i][j];
Map[count]='\0';
}
void Judge()
{
int len = strlen(PassWord),i,j,k;
memset(AddPass,0,sizeof(char));
/*一对对去字母,剩下单个字母,则不变化,直接放入加密串中.*/
if(len%2){
AddPass[len-1] = PassWord[len-1];
len -=1;
}
/*一对中 密钥矩阵中 存在矩阵 eg.ab 先输出a同行顶点在输出b同行顶点*/
int row1,low1,row2,low2,a1,a2;
for(i=0;i<len;i+=2)
{
char c1,c2;
c1 = PassWord[i];
c2 = PassWord[i+1];
/*一对中 两字母相同 无变化*/
/*一对中 有字母不在密钥矩阵中 无变化*/
if(c1 == c2 || ( !IsVisited(c1)||!IsVisited(c2)))
{ AddPass[i] = c1;
AddPass[i+1]=c2;
}else{
a1 = strchr(Map,c1)-Map;
row1 = a1/5; low1 = a1%5;
a2 = strchr(Map,c2)-Map;
row2 = a2/5; low2 = a2%5;
/*一对中 字符出现在同行或同列 简单swap字符*/
if(row1 == row2 || low1 == low2)
{
AddPass[i] = c2;
AddPass[i+1] = c1;
}else{
AddPass[i] = Table[row1][low2];
AddPass[i+1] = Table[row2][low1];
}
}
}AddPass[len+1]='\0';
puts("加密后字符串:");
puts(AddPass);
puts("原串是:");
puts(PassWord);
}
int main()
{
Input();
Fun_5x5();
TabletoMap();
Judge();
return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-04-07

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网