導航:首頁 > 源碼編譯 > 維吉尼亞演算法c

維吉尼亞演算法c

發布時間:2022-10-09 14:57:31

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)] = ''
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)] = ''
return 1;
}

I. 維吉尼亞密碼該 怎麼用

人們在單一愷撒密碼的基礎上擴展出多表密碼,稱為「維吉尼亞」密碼。它是由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

J. 古典加密技術中最基本的兩種演算法是什麼

替代演算法和置換移位法。

1.替代演算法
替代演算法指的是明文的字母由其他字母或數字或符號所代替。最著名的替代演算法是愷撒密碼。凱撒密碼的原理很簡單,其實就是單字母替換。我們看一個簡單的例子:

明文:abcdefghijklmnopq

密文:defghijklmnopqrst

若明文為student,對應的密文則為vwxghqw 。在這個一一對應的演算法中,愷撒密碼將字母表用了一種順序替代的方法來進行加密,此時密鑰為3,即每個字母順序推後3個。由於英文字母為26個,因此愷撒密碼僅有26個可能的密鑰,非常不安全。

為了加強安全性,人們想出了更進一步的方法:替代時不是有規律的,而是隨機生成一個對照表。

明文:abcdefghijklmnopqrstuvwxyz

密文:xnyahpogzqwbtsflrcvmuekjdI

此時,若明文為student,對應的密文則為 vmuahsm 。這種情況下,解密函數是上面這個替代對照表的一個逆置換。

不過,有更好的加密手段,就會有更好的解密手段。而且無論怎樣的改變字母表中的字母順序,密碼都有可能被人破解。由於英文單詞中各字母出現的頻度是不一樣的,通過對字母頻度的統計就可以很容易的對替換密碼進行破譯。為了抗擊字母頻度分析,隨後產生了以置換移位法為主要加密手段的加密方法。

2.置換移位法
使用置換移位法的最著名的一種密碼稱為維吉尼亞密碼。它以置換移位為基礎的周期替換密碼。

前面介紹的替代演算法中,針對所有的明文字母,密鑰要麼是一個唯一的數,要麼則是完全無規律可尋的。在維吉尼亞密碼中,加密密鑰是一個可被任意指定的字元串。加密密鑰字元依次逐個作用於明文信息字元。明文信息長度往往會大於密鑰字元串長度,而明文的每一個字元都需要有一個對應的密鑰字元,因此密鑰就需要不斷循環,直至明文每一個字元都對應一個密鑰字元。對密鑰字元,我們規定密鑰字母a,b,c,d……y,z對應的數字n為:0,1,2,3……24,25。每個明文字元首先找到對應的密鑰字元,然後根據英文字母表按照密鑰字元對應的數字n向後順序推後n個字母,即可得到明文字元對應的密文字元。

如果密鑰字為deceptive , 明文為 wearediscoveredsaveyourself,則加密的過程為:

明文: wearediscoveredsaveyourself

密鑰: deceptivedeceptivedeceptive

密文: zicvtwqngrzgvtwavzhcqyglmgj

對明文中的第一個字元w,對應的密鑰字元為d,它對應需要向後推3個字母,w,x,y,z,因此其對應的密文字元為z。上面的加密過程中,可以清晰的看到,密鑰deceptive被重復使用。

古典密碼體制將數學的方法引入到密碼分析和研究中。這為現代加密技術的形成和發展奠定了堅實的基礎。

閱讀全文

與維吉尼亞演算法c相關的資料

熱點內容
如何登錄伺服器看源碼 瀏覽:522
如何做伺服器端 瀏覽:154
注冊伺服器地址指什麼 瀏覽:433
文本命令行 瀏覽:97
撲克牌睡眠解壓 瀏覽:192
rc4演算法流程圖 瀏覽:159
胡蘿卜解壓方法 瀏覽:35
掃描pdf格式軟體 瀏覽:876
程序員在銀行開賬戶 瀏覽:516
android資料庫下載 瀏覽:749
中午伺服器崩潰怎麼辦 瀏覽:425
產品經理和程序員待遇 瀏覽:442
解憂程序員免費閱讀 瀏覽:109
錄像免壓縮 瀏覽:508
總結所學過的簡便演算法 瀏覽:362
南昌哪些地方需要程序員 瀏覽:761
三台伺服器配置IP地址 瀏覽:175
如何用命令方塊連續對話 瀏覽:280
win7linux共享文件夾 瀏覽:304
命令符打開本地服務 瀏覽:601