四种加密解密算法的源代码:移位密码、仿射密码、维吉尼亚密码以及置换密码
来源:互联网 发布:弹道软件汉化版 编辑:程序博客网 时间:2024/04/30 08:59
四种加密解密算法的源代码:移位密码、仿射密码、维吉尼亚密码以及置换密码
#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;
}
}
#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;
}
}
- 四种加密解密算法的源代码:移位密码、仿射密码、维吉尼亚密码以及置换密码
- C#实现维吉尼亚密码的加密和解密
- 维吉尼亚密码算法
- 维吉尼亚(Vigenère)密码的加密和解密以及方阵(js版)
- 维吉尼亚密码
- 仿射密码解密
- 仿射密码加密
- 经典加密算法凯撒密码、维吉尼亚密码,RSA算法加密的简单学习
- Z26上维吉尼亚和行置换的乘积密码体制
- NYOJ-770仿射密码,乘数密码与移位密码的结合;
- 凯撒密码 与 维吉尼亚密码
- 置换密码算法说明
- 密码加密的算法
- C# 密码的加密, 解密
- C# 密码的加密, 解密
- 密码的加密与解密
- 信息安全加密技术---维吉尼亚密码
- 维吉尼亚密码破解或加密公式
- 系统钩子入门
- AJAX在PHP中的简单使用 (post)
- Linux Signal (1): 基本概念
- 类包装的方式
- GridView的自定义分页,单选、多选、排序、自增列的简单应用
- 四种加密解密算法的源代码:移位密码、仿射密码、维吉尼亚密码以及置换密码
- SVG显示中文问题解决步骤
- 遇到心仪的女子
- 动态编译JAVA程序(com.sun.tool.javac)
- WinXP DDK下载
- 正则表达式
- 不指定src, 用js生成 iFrame/新窗口 里面的内容(可用于scriptX打印部分页面等)
- IIS不能安装的终极解决方案.
- 事务处理的三种方法