简单加密--C语言学习笔记
工作原理:
首先,选择一个单词作为密钥,如 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; }
看看运行结果:
希望此文对你有帮助。