维吉尼亚密码算法c语言(维吉尼亚密码公式法)

2023-02-22 2:38:39 摩斯密码知识 思思

写一个维吉尼亚加密和解码的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语言编程问题!很急啊!

// 关于第三点:密钥的长度是可以不大于待加密数据的长度的。这个有点不太明白,

// 密钥长度好象不能小于加密数据的长度,至于是大于还是等于,好象对处理的结果没有

// 影响,不知道这里专门指出不会大于加密数据的长度,有什么特别的含义吗?

#include conio.h

#include stdio.h

// 函数功能 

// 对传入的数据使用指定的密钥进行维吉尼亚加密

// 返回值 

// 0 操作成功 

// 1 密钥中包含有非字母的字符 

int Vigenere_cipher( unsigned char* data, int data_length, char* key )

{

int nRet = 0;

int i = 0;

unsigned char cKey, cData;

// 密钥长度不为0时加密,为0则直接返回0

if( key != NULL )

{

while( i  data_length )

{

cKey = key[i];

cData = data[i];

// 密钥是字母时,求key在字母表中的相对位置

// 这样,key就不需要再根据数据做大小写转换

if( cKey = 'A'  cKey = 'Z' )

{

cKey -= 'A';

}

else if( cKey = 'a'  cKey = 'z' )

{

cKey -= 'a';

}

// 密钥非字母,中断退出返回1

else

{

nRet = 1;

break; 

}

// 判断一下数据是否为字母,不是字母不加密

if( data[i] = 'A'  data[i] = 'Z' )

{

        //大写字母的加密处理

if( cData = 'Z' )

{

data[i] = cData + cKey;

}

else

{

data[i] = cData + cKey - 25;

}

}

else if( data[i] = 'a'  data[i] = 'z' )

{

        //小写字母的加密处理

if( cData = 'z' )

{

data[i] = cData + cKey;

}

else

{

data[i] = cData + cKey - 25;

}

}

                        // 下一个字符

i++;

}

}

return nRet;

}

// 测试用

int main()

{

unsigned char d[]="AbaB1@";

unsigned char k[]="BbBbBbB";

int n = 6;

printf( "明文:%s\n", d );

printf( "密钥:%s\n", k );

Vigenere_cipher( d, n, (char*)k );

printf( "结果:%s\n", d );

getch();

return 0;

}

维吉尼亚密码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语言(维吉尼亚密码公式法) 第1张

维吉尼亚密码 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语言)求密码

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); }