/*===============================================================
Filename: simple_encrypt.c
Author : zhanghua
Date : 2005-11-22
Fuction: 对原文进行加密并形成密码文,
加密算法如下:
假定原文为C1C2C3...Cn,加密后产生的密文为S1S2S3...Sn,
首先读入正整数key(key>1)作为加密密钥,并将密文字符位置
按顺时针方向连成一个环,
加密时从S1位置起顺时针计数,当数到第KEY个字符位置时,将
原文中的字符C1放入该密文字符位置中,同时从环中出去该字符位置。接着,
从环中下一个字符位置起继续计数,当再次数到第key个字符位置时,将原文中的
字符C2放入其中,并从环中下一个字符位置起继续计数,当再次数到第KEY个位置
时,将原文中的字符C2放入其中,并从环中除去该字符位置,依次类推,
直到n个原文字符全部放入密文环中。由此产生S1S2S3...Sn,即为原文的密文。
相关知识: 结构体实现双向循环链表
解题分析:
将电码原文放在字符数组ocode中,加密钥匙放在key中,函数decode()
用于将原文ocode加密并返回密文字符串的首指针,其中采用一个双向
循环链表loop来表示密文环。
-------------------------------------------------------------------*/
#include <stdio.h>
#include <string.h>
#include <malloc.h>
typedef struct node
{
char ch;
struct node *forward; /*链接下一节点*/
struct node *backward; /*链接前一节点*/
} CODE;
char *decode(char *ocode, int key)
{
char *ncode;
int length, count,i;
CODE *loop , *p;
length = strlen(ocode);
loop= (CODE*)malloc(length*sizeof(CODE)); /*动态分配密文环*/
for(i=0;i<length-1;i++)
{
loop[i].forward = &loop[i+1];
loop[i].backward =&loop[i-1];
}
loop[0].backward =&loop[length-1];
loop[0].forward = &loop[1];
loop[length-1].forward = loop;
loop[length-1].backward = &loop[length-2];
for(p=loop, i=0; i<length;i++)
{
/*产生密文链表*/
for(count=1;count<key; count++)
p= p->forward;
p->ch =*ocode++;
p->backward->forward =p->forward;
p->forward->backward = p->backward;
p = p->forward;
}
ncode = (char*)malloc((length+1)*sizeof(char));
for(i=0;i<length;i++)
ncode[i] =loop[i].ch;
ncode[length] = '/0';
return ncode;
}
main()
{
char ocode[256];
int key, num=0;
printf("输入加密电文: ");
while(num<255&&(ocode[num++]=getchar())!='/n');
ocode[(num==255)?num:num-1] ='/0';
do
{
printf("输入加密密钥:");
scanf("%d",&key);
} while(key<=1);
printf("电文的密码是: '%s'/n",decode(ocode,key));
}
Filename: simple_encrypt.c
Author : zhanghua
Date : 2005-11-22
Fuction: 对原文进行加密并形成密码文,
加密算法如下:
假定原文为C1C2C3...Cn,加密后产生的密文为S1S2S3...Sn,
首先读入正整数key(key>1)作为加密密钥,并将密文字符位置
按顺时针方向连成一个环,
加密时从S1位置起顺时针计数,当数到第KEY个字符位置时,将
原文中的字符C1放入该密文字符位置中,同时从环中出去该字符位置。接着,
从环中下一个字符位置起继续计数,当再次数到第key个字符位置时,将原文中的
字符C2放入其中,并从环中下一个字符位置起继续计数,当再次数到第KEY个位置
时,将原文中的字符C2放入其中,并从环中除去该字符位置,依次类推,
直到n个原文字符全部放入密文环中。由此产生S1S2S3...Sn,即为原文的密文。
相关知识: 结构体实现双向循环链表
解题分析:
将电码原文放在字符数组ocode中,加密钥匙放在key中,函数decode()
用于将原文ocode加密并返回密文字符串的首指针,其中采用一个双向
循环链表loop来表示密文环。
-------------------------------------------------------------------*/
#include <stdio.h>
#include <string.h>
#include <malloc.h>
typedef struct node
{
char ch;
struct node *forward; /*链接下一节点*/
struct node *backward; /*链接前一节点*/
} CODE;
char *decode(char *ocode, int key)
{
char *ncode;
int length, count,i;
CODE *loop , *p;
length = strlen(ocode);
loop= (CODE*)malloc(length*sizeof(CODE)); /*动态分配密文环*/
for(i=0;i<length-1;i++)
{
loop[i].forward = &loop[i+1];
loop[i].backward =&loop[i-1];
}
loop[0].backward =&loop[length-1];
loop[0].forward = &loop[1];
loop[length-1].forward = loop;
loop[length-1].backward = &loop[length-2];
for(p=loop, i=0; i<length;i++)
{
/*产生密文链表*/
for(count=1;count<key; count++)
p= p->forward;
p->ch =*ocode++;
p->backward->forward =p->forward;
p->forward->backward = p->backward;
p = p->forward;
}
ncode = (char*)malloc((length+1)*sizeof(char));
for(i=0;i<length;i++)
ncode[i] =loop[i].ch;
ncode[length] = '/0';
return ncode;
}
main()
{
char ocode[256];
int key, num=0;
printf("输入加密电文: ");
while(num<255&&(ocode[num++]=getchar())!='/n');
ocode[(num==255)?num:num-1] ='/0';
do
{
printf("输入加密密钥:");
scanf("%d",&key);
} while(key<=1);
printf("电文的密码是: '%s'/n",decode(ocode,key));
}