您的位置:

维吉尼亚加密c语言代码,维吉利亚密码加密算法

本文目录一览:

维吉尼亚密码c语言求改。

#include stdlib.h

#include stdio.h

#include string.h

#define N 10000

void function(char message[],char key[],int mode); //加解密函数

int main()

{

int choose;

char m[N],key[N];

printf("维吉尼亚加密,请输入1;解密,请输入2:\n");

scanf("%d",choose);

getchar();

if (choose == 1 || choose == 2)

{

if (choose == 1)

printf("输入明文:\n");

if (choose == 2)

printf("输入密文:\n");

gets(m);

printf("输入密钥:\n");

gets(key);

function(m,key,choose);

}

else

printf("输入错误!\n");

return 0;

}

void function(char message[],char key[],int mode) //加解密函数

{

int i, j = 0; //j控制key的轮回

int len_k = strlen(key); //密钥长度

char s[N];

for(i=0; message[i]!='\0'; i++)

{

if(message[i] == 32) //判断空格

s[i]=' ';

else

{

if (mode == 1)

s[i]=(int(message[i]-'a')+int(key[j%len_k]-'a'))%26+97;

if (mode == 2)

s[i]=(int(message[i]-'a')-int(key[j%len_k]-'a')+26)%26+97;

j++;

}

printf("%c",s[i]);

}

printf("\n");

}

gets(l);//不加这句M就输入不了为什么?

是因为没有这句的话,按的回车键就输成m了。

连用两个输入语句时,需要考虑回车键,就像我代码里的getchar()。

维吉尼亚密码 C++

给,网上的C++的基本都有问题,我给你改好一个,已经编译运行确认,

#includeiostream

using namespace std;

#define MINCHAR 32

#define CHARSUM 94

char table[CHARSUM][CHARSUM];

bool Init();

bool Encode(char* key, char* source, char* dest);

bool Dncode(char* key, char* source, char* dest);

int main()

{

if(!Init())

{

cout "初始化错误!" endl;

return 1;

}

char key[256];

char str1[256];

char str2[256];

int operation;

while(1)

{

do

{

cout "请选择一个操作:1. 加密; 2. 解密; -1. 退出\n";

cin operation;

}while(operation != -1 operation != 1 operation != 2);

if(operation == -1)

return 0;

else if(operation == 1)//加密

{

cout "请输入密钥:";

cin key;

cout "请输入待加密字符串:";

cin str1;

Encode(key, str1, str2);

cout "加密后的字符串:" str2 endl;

}

else if(operation == 2)//解密

{

cout "请输入密钥:";

cin key;

cout "请输入待解密字符串:";

cin str1;

Dncode(key, str1, str2);

cout "解密后的字符串:" str2 endl;

}

cout endl;

}

return 0;

}

// 初始化维吉尼亚方阵

bool Init()

{

int i, j;

for(i = 0; i CHARSUM; i++)

{

for(j = 0; j CHARSUM; j++)

{

table[i][j] = MINCHAR + (i + j) % CHARSUM;

}

}

return true;

}

// 加密

// key:密钥

// source:待加密的字符串

// dest:经过加密后的字符串

bool Encode(char* key, char* source, char* dest)

{

char* tempSource = source;

char* tempKey = key;

char* tempDest = dest;

do

{

*tempDest = table[(*tempKey) - MINCHAR][(*tempSource) - MINCHAR];

tempDest++;

if(!(*(++tempKey)))

tempKey = key;

}while(*tempSource++);

dest[strlen(source)] = 0;

return true;

}

// 解密

// key:密钥

// source:待解密的字符串

// dest:经过解密后的字符串

bool Dncode(char* key, char* source, char* dest)

{

char* tempSource = source;

char* tempKey = key;

char* tempDest = dest;

char offset;

do

{

offset = (*tempSource) - (*tempKey);

offset = offset = 0 ? offset : offset + CHARSUM;

*tempDest = MINCHAR + offset;

tempDest++;

if(!(*(++tempKey)))

tempKey = key;

}while(*++tempSource);

dest[strlen(source)] = 0;

return true;

}

写一个维吉尼亚加密和解码的C语言程序,具体要求如下。不要用GOTO, 不要有MAGIC NUMBER。

#include stdio.h

#define MINCHAR 32

#define CHARSUM 94

int encode(char* key, char* source, char* dest);

int decode(char* key, char* source, char* dest);

char table[CHARSUM][CHARSUM];

int main()

{

int i, j;

char key[256];

char source[256];

char destination[256];

int operation;

FILE *fp;

/* Initial the Vigenere table */

for(i = 0; i CHARSUM; i++)

for(j = 0; j CHARSUM; j++)

table[i][j] = MINCHAR + (i + j) % CHARSUM;

printf("please choose one operation code:\n");

printf("1. Encode; 2. Decode; Others. Exit.\n");

scanf("%d", operation);

fflush(stdin);

switch (operation)

{

case 1:

printf("please input the key code:\n");

gets(key);

fflush(stdin);

printf("please input the source code you want to encode:\n");

gets(source);

fflush(stdin);

encode(key, source, destination);

printf("after encode is: \n");

printf("%s\n", destination);

fp=fopen("key.txt", "w");

fprintf(fp, "%s", key);

fclose(fp);

fp=fopen("source.txt", "w");

fprintf(fp, "%s", source);

fclose(fp);

fp=fopen("destination.txt", "w");

fprintf( fp, "%s",destination);

fclose(fp);

break;

case 2:

printf("please input the key code:\n");

gets(key);

fflush(stdin);

printf("please input the source code you want to decode:\n");

gets(source);

fflush(stdin);

decode(key, source, destination);

printf("after decode is: \n");

printf("%s\n", destination);

fp=fopen("key.txt", "w");

fprintf(fp, "%s", key);

fclose(fp);

fp=fopen("source.txt", "w");

fprintf(fp, "%s", source);

fclose(fp);

fp=fopen("destination.txt", "w");

fprintf(fp, "%s", destination);

fclose(fp);

break;

default:

return 0;

}

return 0;

}

int encode(char* key, char* source, char* dest)

{

char* tempSource = source;

char* tempKey = key;

char* tempDest = dest;

do

{

*tempDest = table[(*tempKey) - MINCHAR][(*tempSource) - MINCHAR];

tempDest++;

if (!(*(++tempKey)))

tempKey = key;

} while(*tempSource++);

dest[strlen(source)] = '\0';

return 1;

}

int decode(char* key, char* source, char* dest)

{

char* tempSource = source;

char* tempKey = key;

char* tempDest = dest;

char offset;

do

{

offset = (*tempSource) - (*tempKey);

offset = offset = 0 ? offset : offset + CHARSUM;

*tempDest = MINCHAR + offset;

tempDest++;

if (!(*(++tempKey)))

tempKey = key;

} while(*++tempSource);

dest[strlen(source)] = '\0';

return 1;

}

(c语言)求密码

360问答

求古典密码学的c语言代码

guiyids0033 LV122014-01-16

各位高手小弟急需一个维吉尼亚密码的程序。帮帮忙

满意答案

aa7777777777qq

LV12

2014-01-16

给: 维吉尼亚密码的C语言源代码 设m表示明文序列,k表示密钥序列 #include ctype.h #include stdio.h #include stdlib.h #include string.h #include conio.h void crypt(char m[],char k[],char r[]) { int i,j,s=0; j=strlen(k); for(i=0;m[i];i++) m[i]=tolower(m[i]); for(i=0;m[i];i++) if(isalpha(m[i])) { r[i]=(m[i]-'a'+k[s%j]-'a')%26+'a'; s++;/* s用来跳过明文中的空格字符 */ } else r[i]=m[i]; r[i]=0;/* 密文字符串结束符 */ for(i=0;r[i];i++) r[i]=toupper(r[i]); } void decrypt(char c[],char k[],char m[]) { int i,j,s=0; j=strlen(k); for(i=0;c[i];i++) c[i]=tolower(c[i]); for(i=0;c[i];i++) if(isalpha(c[i])) { m[i]=(c[i]-k[s%j]+26)%26+'a'; s++; } else m[i]=c[i]; m[i]=0; } void main() { char m[]="welcome to my blog.i am bugeyes.";//我这里是赋值了一个固定的字符串为明文序列,你也可以做成用户输入的 char k[]="bugeyeswuyan";//我这里是赋值了一个固定的字符串为密钥序列,你也可以做成用户输入的 char c[80]; char d[80]; system("cls");; crypt(m,k,c); decrypt(c,k,d); puts(m); puts(k); puts(c); puts(d); }