工作原理:
首先,选择一个单词作为密钥,如 ziqi ,如果单词中包含重复的字母,只保留第一个,其余几个丢弃,ziqi 则剩余 ziq 。现在修改过的单词位于字母表的下面,如下所示:
a b c d e f g h i j k l m n o p q r s t u v w x y z
z i q
然后第二行用字母表中剩余的字母填充完整:
a b c d e f g h i j k l m n o p q r s t u v w x y z
z i q a b c d e f g h j k l m n o p r s t u v w x y
在对信息加密的时候,根据第一行,用第二行的对应字母一一取代原文的字母。比如使用这个密钥,Sherlock Holmes(福尔摩斯)会被加密为 Rebpjmqh Emjkbr。
代码如下:
首先声明:
#include "stdio.h"
#include "string.h"
#define TRUE 1;
#define FALSE 0;
static char alphabet[] = "abcdefghijklmnopqrstuvwxyz";//解密用
生成密钥:
/*根据单词生成密钥*/
int
constructkey(char *key)
{
int character;
char *keyp;
char *duplicate;
if (*key == '\0')
{
return FALSE;
}
/*确保数组中的所有字符为小写*/
for (keyp = key;(character = *keyp) != '\0';++keyp)
{
if (!islower(character))
{
if (isupper(character))
{
*keyp = tolower(character);
}
else
{
return FALSE;
}
}
}
/*消除重复的字符*/
for (keyp = key;(character = *keyp) != '\0';)
{
duplicate = ++keyp;
while ((duplicate = strchr(duplicate,character)) != NULL)
{
strcpy(duplicate,duplicate+1);
}
}
/*将剩余的字符添加到key后面*/
/*keyp这会正好指向数组的终结点上*/
for (character = 'a';character <= 'z';character += 1)
{
if (strchr(key,character) == NULL)
{
*keyp++ = character;
*keyp = '\0';/*空字节结尾*/
}
}
return TRUE;
}
加密:
/*加密,保留信息大小写*/
void
encrypt(char *data,char const *key)
{
int character;
for(;(character = *data) != '\0';++data)
{
if (islower(character))
{
*data = key[character - 'a'];
}
else if (isupper(character))
{
*data = toupper(key[character - 'A']);
}
}
}
解密:
/*解密,保留信息大小写*/
void
decrypt(char *data,char const *key)
{
int character;
for (;(character = *data) != '\0';++data)
{
if (islower(character))
{
*data = alphabet[strchr(key,character) - key];
}
else if (isupper(character))
{
*data = toupper(alphabet[strchr(key,tolower(character)) - key]);
}
}
}
main函数:
int
main()
{
char key[27] = "ziqi";
char data[] = "Sherlock Holmes";
if (constructkey(key))
{
printf("密钥形成:%s\n",key);
encrypt(data,key);
printf("加密:%s\n",data);
decrypt(data,key);
printf("解密:%s\n",data);
}
return 0;
}
看看运行结果:
希望此文对你有帮助。