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)] = '