简单加密--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;
}

看看运行结果:

image

希望此文对你有帮助。

posted @ 2012-01-19 12:04  青霜  阅读(635)  评论(0编辑  收藏  举报