| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1201 人关注过本帖
标题:有关于C++编写的数据加密解密中替换法的几个算法的问题,向大家虚心求教
只看楼主 加入收藏
hcdno1
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2007-6-10
收藏
 问题点数:0 回复次数:6 
有关于C++编写的数据加密解密中替换法的几个算法的问题,向大家虚心求教

近日在研究替换法中移位密码,仿射密码,维吉利亚密码,置换密码的算法,网上也找了些资料,但发现是用C语言编辑的,具体代码如下
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <malloc.h>
void Shift() /*移位密码*/
{
char c[100];
int length, i=0, key=0;
clrscr();

printf("********Shift Cipher********\nPlease input primal sentence: ");
gets(c);
length = strlen(c);
printf("Input the key(0~26): ");
scanf("%d", &key);
getchar();

if(key<0)
{
printf("The value of key is error!\nPress any key to return...");
getch();
return;
}
for(i=0; i<length; i++)
{
if(c[i]>96&&c[i]<123)
c[i] = (c[i]+key-97)%26+65;
else if(c[i]>64&&c[i]<91)
c[i] = (c[i]+key-65)%26+65;
}
printf("Result is: %s\n", c);
for(i=0; i<length; i++)
{
if(c[i]>64&&c[i]<91)
c[i] = (c[i]-key-65+26)%26+97;
}
printf("\nAfter translated the sentence,we can see the primal sentence as follow:\n%s\n", c);
printf("Press any key to return...");
getch();
}

int gcd(int a, int b) /*辗转相除法求a,b的最大公因数*/
{
int k = 0;

do
{
k = a%b;
a = b;
b = k;
}while(k!=0);
return a;
}

int Ni(int a, int b) /*求a相对于b的逆*/
{
int i = 0;
while(a*(++i)%b!=1);
return i;
}

void Affine() /*仿射密码*/
{
char c[100];
int length, i=0, ka=0, kb=0, tmp;
clrscr();

printf("********Affine Cipher********\nPlease input primal sentence: ");
gets(c);
length = strlen(c);
printf("Input the key(2 numbers): ");
scanf("%d%d", &ka, &kb);
getchar();
if(gcd(ka,26)!=1)
{
printf("The value of the key is error!\nPress any key to return...");
return;
}

for(i=0; i<length; i++)
{
if(c[i]>96&&c[i]<123)
c[i] = (ka*(c[i]-97)+kb)%26+65;
else if(c[i]>64&&c[i]<91)
c[i] = (ka*(c[i]-65)+kb)%26+65;
}
printf("Result is: %s\n", c);
for(i=0; i<length; i++)
{
if(c[i]>64&&c[i]<91)
{
tmp = Ni(ka,26)*((c[i]-65)-kb);
if(tmp<0)
c[i] = tmp%26+26+97;
else
c[i] = tmp%26+97;
}
}
printf("\nAfter translated the sentence,we can see the primal sentence as follow:\n%s\n", c);
printf("Press any key to return...");
getch();
}

void Vigenere() /*维吉利亚密码*/
{
char c[100], key[100];
int lenc, lenk, i=0, j=0, tmp;
clrscr();

printf("********Vigenere Cipher********\nPlease input primal sentence: ");
gets(c);
lenc = strlen(c);
strcpy(c, strupr(c));
printf("Input the key: ");
gets(key);
lenk = strlen(key);
strcpy(key, strupr(key));
for(; i<lenc; i++)
{
j = j%lenk;
if(c[i]>64&&c[i]<91)
{
c[i] = (c[i]-65+key[j]-65)%26+65;
j++;
}
}
printf("Result is: %s\n", c);
for(i=0, j=0; i<lenc; i++)
{
j = j%lenk;
if(c[i]>64&&c[i]<91)
{
tmp = c[i]-65-(key[j]-65);
if(tmp>=0)
c[i] = tmp%26+97;
else
c[i] = (tmp+26)%26+97;
j++;
}
}
printf("\nAfter translated the sentence,we can see the primal sentence as follow:\n%s\n", c);
printf("Press any key to return...");
getch();
}

void Permutation() /*置换密码*/
{
char c[100], *q;
int *key, len, m, i, j=0;
clrscr();

printf("********Permutation Cipher********\nPlease input primal sentence: ");
gets(c);
strcpy(c, strupr(c));
len = strlen(c);
for(i=0; i<len; i++)
{
if(c[i]<65||c[i]>90)
{
for(j=i; j<len-1; j++)
c[j] = c[j+1];
len--;
}
}
c[len] = '\0';
printf("Input the length of the key: ");
scanf("%d", &m);
key = (int)malloc(m*sizeof(int));
q = (int)malloc(len*sizeof(int));
printf("Input the key: ");
for(i=0; i<m; i++)
{
scanf("%d", key+i);
key[i]--;
}
getchar();

for(i=0; i<len; i++)
{
j = (i/m)*m;
q[i] = c[*(key+i%m)+j];
}
q[i] = '\0';

printf("Result is: %s\n", q);

for(i=0, j=0; i<len; i++)
{
j = (i/m)*m;
c[*(key+i%m)+j] = q[i]+32;
}
c[len] = '\0';

printf("After translated the sentence,we can see the primal sentence as follow:\n%s\n", c);
printf("Press any key to return...");
free(key);
free(q);
getch();
}

void main()
{
char i = '0';
clrscr();

while(i!='5')
{
clrscr();
printf("********Press 1~5 to choose:********\n");
printf("1. Shift Cipher\n2. Affine Cipher\n3. Vigenere Cipher\n4. Permutation Cipher\n5. Exit\n");
i = getch();
if(i=='1')
Shift();
else if(i=='2')
Affine();
else if(i=='3')
Vigenere();
else if(i=='4')
Permutation();
else if(i=='5')
break;
}
}

这里面我已经发现一些问题,例如'clrscr'清屏函数要用system("cls");还有输入输出printf用cout ,cin函数代替等等,还想请教大家帮助发现这里面的问题,我的邮箱hcdno1@hotmail.com,还是热切地恳请各位的帮助!

搜索更多相关主题的帖子: 算法 虚心 数据 解密 
2007-06-10 16:20
革命接班人
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2007-6-10
收藏
得分:0 
太长了```看起累啊``
2007-06-10 16:22
hcdno1
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2007-6-10
收藏
得分:0 
里面有4种算法,是比较长呢......具体编译上的不同点我想应该是大同小异
2007-06-10 16:26
革命接班人
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2007-6-10
收藏
得分:0 

楼主的意思是想变成C++语言风格的?

2007-06-10 16:37
hcdno1
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2007-6-10
收藏
得分:0 
对,我自己有在看书搞清楚,也还请网上达人们指点,人多力量大~~呵呵
2007-06-10 16:44
革命接班人
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2007-6-10
收藏
得分:0 

第一个算法,在 virtual stido 2003 VC 用控制台进入main函数写的
using namespace std;

void Shift() /*移位密码*/
{
TCHAR szCode[MAX_VALUE];
int length = 0;
int key=0;

std::cout<<"********Shift Cipher********\nPlease input primal sentence: "<<endl;
std::cin>>szCode;
szCode = _T(szCode);
length = strlen(cszCode);
std::cout<<"Input the key(0~26): "<<endl;
std::cin>>key;

if(key<0)
{
std::cout<<"The value of key is error!\nPress any key to return..."<<endl;
system("pause");
exit(0);
}
for(int i = 0; i < length; i++)
{
if(szCode[i]>96&&szCode[i]<123)
szCode[i] = (szCode[i]+key-97)%26+65;
else if(szCode[i]>64&&szCode[i]<91)
szCode[i] = (szCode[i]+key-65)%26+65;
}
std::cout<<Result is:"<<szCode<<endl;
for(int i = 0; i < length; i++)
{
if(szCode[i]>64&&szCode[i]<91)
szCode[i] = (szCode[i]-key-65+26)%26+97;
}
std::cout<<"After translated the sentence,we can see the primal sentence as follow:"<<szCode<<endl;
std::cout<<"Press any key to return..."<<endl;
system("pause");
}


[此贴子已经被作者于2007-6-10 17:21:07编辑过]

2007-06-10 17:12
hcdno1
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2007-6-10
收藏
得分:0 

非常感谢,我知道怎么做了!

2007-06-10 20:16
快速回复:有关于C++编写的数据加密解密中替换法的几个算法的问题,向大家虚心求教 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019816 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved