#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define NUL 0
#define SIZE 27
int
prepare_key( char *key){
char *head = key;
char *mark =key;
char *index;
int ch;
while ( *key != NUL ){//全部转为大写
if ( !(*key>= 'A' && *key<='Z' ) && !(*key>='a' && *key<='z') )
return 0;
if(*key>='a')
*key-=32;
key++;
}//1 k == NUL
while( *mark!=NUL){//剔除重复利用 strcpy(n,n+1) n-->删了
if( ( index=strchr(mark+1,*mark) ) ==NULL ){
mark++;
continue;
}
else
strcpy( index,index+1);
}//1
index= head ;
while(*index++ != NUL)//定位删除后结尾
;
for(index -= 2,ch='A';ch<='Z';ch++){ //strchr查找 没有添加到末尾
if( strchr(head,ch) == NULL )
*index++ = ch;
}
*index=NUL;
return 1;
}
void
encrypt( char*data, char const *key){
while( *data !=NUL ){
if( isalpha(*data) ){ //若为字母
if( isupper(*data) )
*data = *(key + *data - 'A'); //与首字母的相对位置 再与key对应
else
*data = *(key + *data - 'a');
}
data++;
}
}
void
decrypt(char *data,char const *key){
char *head=data;
int index=0;
while( *data !=NUL ){
if( isalpha(*data) ) { //若为字母
for(index = 0; *(key + index) != *data; index++);
if( isupper(*data) )
*data = 'A' + index;
else
*data = 'a' + index;
}
data++;
}
}
int main(){
char key[SIZE]="sdfadsfasdf";
if(prepare_key(key) )
printf("编码成功!\n");
else
printf("失败!\n");
char b[]="aaaaaaaaaaa";
printf("源码为\n%s\n",b);
encrypt(b,key);
printf("加密后:\n");
puts(b);
printf("解密后为:\n");
decrypt(b,key);
puts(b);
return 0;
}
有一种技巧可以对数据进行加密, 并使用一个单词作为它的密钥. 下面是它的工作原理:
首先, 选择一个单词作为密钥. 如:TRAILBLAZERS. 如果单词中包含重复的字母, 只保留第一个, 其余几个丢弃.
现在, 修改过的那个单词列于字母表的下面, 如下所示:
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
T R A I L B Z E S
最后, 底下的那行字母用剩余的字母填充完整:
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
T R A I L B Z E S C D F G H J K M N O P Q U V W X Y
在对信息进行加密时, 信息中的每个字母被固定于顶上那行, 并用下面那行的对应字母一一取代原文的字母.
因此, 使用这个密钥, ATTACK AT DAWN(黎明时进攻)就会被翻译成TPPTAD TP ITVH.
这个题材共有三个程序(包含下面两个题目). 在第一个程序中, 你需要编写函数:
int prepare_key( char *key );
它接受一个字符串参数, 它的内容就是需要使用的密钥单词. 函数根据上面描述的方法把它转化成一个包含编好码的字符串数组. 假定key参数是个字符数组, 其长度至少可以容纳27个字符.
函数必须把密钥中所有的字符要么转化成大写字母, 要么转化成小写字母(随你选择), 并且从单词中去除重复出现的字母, 然后再用字母表中剩余的字母按照你原先所选择的大小写形式填充到key数组中.
如果处理成功, 函数返回一个真值. 如果key参数为空或者包含任何非字母字符, 函数返回一个假值.