A. 如何用C语言写仿射密码和维吉尼亚密码只用C语言函数完成代码,谢谢。
void *(* func) (void *){}
一般写函数的时候不会在函数名前面加*再括号括起来的。如果是函数指针
那么就是返回void*类型。如果真的是函数定义的话,
感觉不会这么写的,还不如写void ** func (void *) 这种名字呢。
B. 维吉尼亚密码的密码特点
将26个恺撒密表合成一个,见下表:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
A -A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
B -B C D E F G H I J K L M N O P Q R S T U V W X Y Z A
C -C D E F G H I J K L M N O P Q R S T U V W X Y Z A B
D -D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
E -E F G H I J K L M N O P Q R S T U V W X Y Z A B C D
F -F G H I J K L M N O P Q R S T U V W X Y Z A B C D E
G -G H I J K L M N O P Q R S T U V W X Y Z A B C D E F
H -H I J K L M N O P Q R S T U V W X Y Z A B C D E F G
I -I J K L M N O P Q R S T U V W X Y Z A B C D E F G H
J -J K L M N O P Q R S T U V W X Y Z A B C D E F G H I
K -K L M N O P Q R S T U V W X Y Z A B C D E F G H I J
L -L M N O P Q R S T U V W X Y Z A B C D E F G H I J K
M -M N O P Q R S T U V W X Y Z A B C D E F G H I J K L
N -N O P Q R S T U V W X Y Z A B C D E F G H I J K L M
O -O P Q R S T U V W X Y Z A B C D E F G H I J K L M N
P -P Q R S T U V W X Y Z A B C D E F G H I J K L M N O
Q -Q R S T U V W X Y Z A B C D E F G H I J K L M N O P
R -R S T U V W X Y Z A B C D E F G H I J K L M N O P Q
S -S T U V W X Y Z A B C D E F G H I J K L M N O P Q R
T -T U V W X Y Z A B C D E F G H I J K L M N O P Q R S
U -U V W X Y Z A B C D E F G H I J K L M N O P Q R S T
V -V W X Y Z A B C D E F G H I J K L M N O P Q R S T U
W -W X Y Z A B C D E F G H I J K L M N O P Q R S T U V
X -X Y Z A B C D E F G H I J K L M N O P Q R S T U V W
Y -Y Z A B C D E F G H I J K L M N O P Q R S T U V W X
Z -Z A B C D E F G H I J K L M N O P Q R S T U V W X Y
C. 维吉尼亚密码的算法
维吉尼亚密码引入了“密钥”的概念,即根据密钥来决定用哪一行的密表来进行替换,以此来对抗字频统计。假如以上面第一行代表明文字母,左面第一列代表密钥字母,对如下明文加密:
TO BE OR NOT TO BE THAT IS THE QUESTION
当选定RELATIONS作为密钥时,加密过程是:明文一个字母为T,第一个密钥字母为R,因此可以找到在R行中代替T的为K,依此类推,得出对应关系如下:
密钥:RELAT IONSR ELATI ONSRE LATIO NSREL
明文:TOBEO RNOTT OBETH ATIST HEQUE STION
密文:KSMEH ZBBLK SMEMP OGAJX SEJCS FLZSY
历史上以维吉尼亚密表为基础又演变出很多种加密方法,其基本元素无非是密表与密钥,并一直沿用到二战以后的初级电子密码机上。
这我看过了,就是不懂,为什么说第一个密钥字母为R,因此可以找到在R行中代替T的为K,最好再举个别的例子,老是这个to be or not to be
D. 维吉尼亚加密算法如何加密任意格式的文件
维吉尼亚算法如果仅仅作用于字符集在A到Z a到z,0到9这样的范围,就叫对“英文文本”实施加密
这个英文文本的范围,A到Z等于字节值65到90, a到z等于字节值97到122,0到9等于字节值48到57。中间是断续的几个区间
算法如果改动一下,把字符集扩大到0到255,相当于对256个字母重新编排密码本,而不局限于英文文本的26个字母。这样就能对一个字节的所有情况进行加密。能对字节加密,所有的文件都以字节为基本存储单位,也就实现了对任何文件、任何数据的加密。
如果之前英文文本的处理是自己写的,稍加改动就能变成处理256个字母。
E. 维吉尼亚密码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()。
F. 求维吉尼亚密码的加密解密程序(可以跳过明文中的空格)C/C++实现的
给,网上的C++的基本都有问题,我给你改好一个,已经编译运行确认,
#include<iostream>
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;
}
G. 恺撒密码的维吉尼亚密码
很明显,凯撒密码的密度是很低的,只需简单地统计字频就可以破译。于是人们在单一恺撒密码的基础上扩展出多表密码,称为“维吉尼亚”密码。它是由16世纪法国亨利三世王朝的布莱瑟·维吉尼亚发明的,其特点是将26个恺撒密表合成一个,见下表:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
A -A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
B -B C D E F G H I J K L M N O P Q R S T U V W X Y Z A
C-C D E F G H I J K L M N O P Q R S T U V W X Y Z A B
D- D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
E- E F G H I J K L M N O P Q R S T U V W X Y Z A B C D
F- F G H I J K L M N O P Q R S T U V W X Y Z A B C D E
G- G H I J K L M N O P Q R S T U V W X Y Z A B C D E F
H- H I J K L M N O P Q R S T U V W X Y Z A B C D E F G
I- I J K L M N O P Q R S T U V W X Y Z A B C D E F G H
J- J K L M N O P Q R S T U V W X Y Z A B C D E F G H I
K- K L M N O P Q R S T U V W X Y Z A B C D E F G H I J
L -L M N O P Q R S T U V W X Y Z A B C D E F G H I J K
M- M N O P Q R S T U V W X Y Z A B C D E F G H I J K L
N- N O P Q R S T U V W X Y Z A B C D E F G H I J K L M
O- O P Q R S T U V W X Y Z A B C D E F G H I J K L M N
P- P Q R S T U V W X Y Z A B C D E F G H I J K L M N O
Q- Q R S T U V W X Y Z A B C D E F G H I J K L M N O P
R- R S T U V W X Y Z A B C D E F G H I J K L M N O P Q
S- S T U V W X Y Z A B C D E F G H I J K L M N O P Q R
T- T U V W X Y Z A B C D E F G H I J K L M N O P Q R S
U- U V W X Y Z A B C D E F G H I J K L M N O P Q R S T
V- V W X Y Z A B C D E F G H I J K L M N O P Q R S T U
W- W X Y Z A B C D E F G H I J K L M N O P Q R S T U V
X- X Y Z A B C D E F G H I J K L M N O P Q R S T U V W
Y- Y Z A B C D E F G H I J K L M N O P Q R S T U V W X
Z- Z A B C D E F G H I J K L M N O P Q R S T U V W X Y
维吉尼亚密码(类似于今天我们所说的置换密码)引入了“密钥”的概念,即根据密钥来决定用哪一行的密表来进行替换,以此来对抗字频统计。假如以上面第一行代表明文字母,左面第一列代表密钥字母,对如下明文加密:
TO BE OR NOT TO BE THAT IS THE QUESTION
当选定RELATIONS作为密钥时,加密过程是:明文一个字母为T,第一个密钥字母为R,因此可以找到在R行中代替T的为K,依此类推,得出对应关系如下:
密钥:RELAT IONSR ELATI ONSRE LATIO NSREL
明文:TOBEO RNOTT OBETH ATIST HEQUE STION
密文:KSMEH ZBBLK SMEMP OGAJX SEJCS FLZSY
历史上以维吉尼亚密表为基础又演变出很多种加密方法,其基本元素无非是密表与密钥,并一直沿用到二战以后的初级电子密码机上。
H. 写一个维吉尼亚加密和解码的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: ");
printf("1. Encode; 2. Decode; Others. Exit. ");
scanf("%d", &operation);
fflush(stdin);
switch (operation)
{
case 1:
printf("please input the key code: ");
gets(key);
fflush(stdin);
printf("please input the source code you want to encode: ");
gets(source);
fflush(stdin);
encode(key, source, destination);
printf("after encode is: ");
printf("%s ", 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: ");
gets(key);
fflush(stdin);
printf("please input the source code you want to decode: ");
gets(source);
fflush(stdin);
decode(key, source, destination);
printf("after decode is: ");
printf("%s ", 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)] = '