① 關於棋盤密碼(一種古典密碼) 怎麼解密,加密
棋盤密碼的加密方法,其實方法十分簡單,在密碼學並不發達的古代,也夠用了。棋盤密碼的解題思路是這樣
這種密碼的原理是:通信雙方各掌握一個m*n列的矩陣,比如A列第一行寫上「我」,A列第2行寫上「的」……以此類推,構成:
所以,「我的名字叫XXX」的密文即:A1A2A3A4B1B2。這樣,一份密文就出來了。
使用這種密碼表的加密也叫作 ADFGX 密碼(密文中只有 A D F G X)
明文:HELLO 密文:DD XF AG AG DF
對於解密,對密文每兩個字元一組,分別進行解密
由於密文僅包含5個字元,所以其密鑰(也就是密碼表)只有5!種可能
寫腳本暴力攻擊(brute-force)即可
棋盤密碼的由來:
公元前2世紀前後希臘人提出了棋盤密碼,在當時得到了廣泛的運用。同時,它也是密碼史上第一個密碼。棋盤密碼通過將26個字母設法變成十位數來達到加密的目的。棋盤密碼的密鑰是一個5×5的棋盤,將26個英文字母放置在裡面。其中 i 和 j 共用一個密碼。
② 古典密碼安全演算法有哪些
世界上最早的一種密碼產生於公元前兩世紀。是由一位希臘人提出的,人們稱之為
棋盤密碼,原因為該密碼將26個字母放在5×5的方格里,i,j放在一個格子里,具體情
況如下表所示
1 2 3 4 5
1 a b c d e
2 f g h i,j k
3 l m n o p
4 q r s t u
5 v w x y z
這樣,每個字母就對應了由兩個數構成的字元αβ,α是該字母所在行的標號,β是列
標號。如c對應13,s對應43等。如果接收到密文為
43 15 13 45 42 15 32 15 43 43 11 22 15
則對應的明文即為secure message。
另一種具有代表性的密碼是凱撒密碼。它是將英文字母向前推移k位。如k=5,則密
文字母與明文與如下對應關系
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
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
於是對應於明文secure message,可得密文為XJHZWJRJXXFLJ。此時,k就是密鑰。為了
傳送方便,可以將26個字母一一對應於從0到25的26個整數。如a對1,b對2,……,y對
25,z對0。這樣凱撒加密變換實際就是一個同餘式
c≡m+k mod 26
其中m是明文字母對應的數,c是與明文對應的密文的數。
隨後,為了提高凱撒密碼的安全性,人們對凱撒密碼進行了改進。選取k,b作為兩
個參數,其中要求k與26互素,明文與密文的對應規則為
c≡km+b mod 26
可以看出,k=1就是前面提到的凱撒密碼。於是這種加密變換是凱撒野加密變換的
推廣,並且其保密程度也比凱撒密碼高。
以上介紹的密碼體制都屬於單表置換。意思是一個明文字母對應的密文字母是確定
的。根據這個特點,利用頻率分析可以對這樣的密碼體制進行有效的攻擊。方法是在大
量的書籍、報刊和文章中,統計各個字母出現的頻率。例如,e出現的次數最多,其次
是t,a,o,I等等。破譯者通過對密文中各字母出現頻率的分析,結合自然語言的字母頻
率特徵,就可以將該密碼體制破譯。
鑒於單表置換密碼體制具有這樣的攻擊弱點,人們自然就會想辦法對其進行改進,
來彌補這個弱點,增加抗攻擊能力。法國密碼學家維吉尼亞於1586年提出一個種多表式
密碼,即一個明文字母可以表示成多個密文字母。其原理是這樣的:給出密鑰
K=k[1]k[2]…k[n],若明文為M=m[1]m[2]…m[n],則對應的密文為C=c[1]c[2]…c[n]。
其中C[i]=(m[i]+k[i]) mod 26。例如,若明文M為data security,密鑰k=best,將明
文分解為長為4的序列data security,對每4個字母,用k=best加密後得密文為
C=EELT TIUN SMLR
從中可以看出,當K為一個字母時,就是凱撒密碼。而且容易看出,K越長,保密程
度就越高。顯然這樣的密碼體制比單表置換密碼體制具有更強的抗攻擊能力,而且其加
密、解密均可用所謂的維吉尼亞方陣來進行,從而在操作上簡單易行。該密碼可用所謂
的維吉尼亞方陣來進行,從而在操作上簡單易行。該密碼曾被認為是三百年內破譯不了
的密碼,因而這種密碼在今天仍被使用著。
古典密碼的發展已有悠久的歷史了。盡管這些密碼大都比較簡單,但它在今天仍有
其參考價值。
③ 怎麼用python編輯棋盤密碼
需要進行軟體在軟體裡面調整一下具體的輸入,然後完成棋盤表格代碼的填寫,就可以修改密碼。
④ 一道棋盤演算法問題!用(c++)
真巧,pku 1753就是這題。。
前幾天ICPC訓練的時候還寫過,現在懶得再寫了,要用到bfs,我幫你找到了這題的解題報告,你看看吧:
解題思路:
BFS 即寬搜
因為這題說要找出最小值,也就是求最優值問題,那麼,很快就可以想到DP 或者
搜索,而這題很難想出階段以及狀態,所以,構造DP的解法是比較困難的,至於
到底可不可以用DP,我也沒有繼續深思過,所以,我就想到直接搜索,把所有走法
都模擬出來,然後,哪種走法最快能夠實現全盤為白或黑,則答案就出來了!
搜索有BFS和DFS兩種,而BFS有能夠求出最優值的特點,故考慮用BFS!
方法:
如果把走第i步之前,盤子上所有棋子構成的狀態記為S(i-1),並且,初始狀態
記為S(0)。而且,可以發現每走一步時,在棋盤上都有4*4=16中選擇!但,當
如果盤子上出現的狀態在之前也出現過,那麼,就可以不用再繼續走了!(即剪枝)
我們從第一步開始。。。
把走完第一步後盤子的所有狀態都保存起來,如果用
很多個二維數組來保存這些狀態就浪費空間了,並且,在之後的要尋找當前狀態是否
已經出現過,也會出現麻煩!想一想,因為棋子是黑白兩面,可以等價為「0」和「1」
兩種性質,那麼如果用一個一維數組保存起來的話,例如:
bwwb
bbwb
bwwb
bwww 1001110110011000
那麼很快又可以發現另一個特點,圖只有2^16個狀態。
然後,開一個數組sign[65535]標記已經訪問過的狀態,則問題就迎刃而解了!
我的程序:
Problem: 1753 User: jlthero
Memory: 504K Time: 32MS
Language: C++ Result: Accepted
Source Code
#include<stdio.h>
#include<string.h>
#include<vector>
#include<iostream>
using namespace std;
char piece[5][5];
int bina[16];
int sign[65536];
int ans;
int toint()
{
int value=0;
int i;
for(i=15;i>=0;i--)
{
value=value*2;
value+=bina[i];
}
return value;
}
void tochar(int n)
{
int i;
for(i=0;i<16;i++)
{
bina[i]=n%2;
n=n/2;
}
}
void slip(int i)
{
bina[i]=1-bina[i];
if(i%4!=0)
bina[i-1]=1-bina[i-1];
if(i%4!=3)
bina[i+1]=1-bina[i+1];
if(i-4>=0)
bina[i-4]=1-bina[i-4];
if(i+4<16)
bina[i+4]=1-bina[i+4];
}
int DFS()
{
vector<int>quene;
int i=0,j;
int value0,value1;
value0=toint();
if(value0==0||value0==65535)
return 0;
else if(sign[value0]==0)
{
quene.push_back(value0);
sign[value0]=1;
}
while(i<quene.size())
{
value0=quene[i];
tochar(value0);
for(j=0;j<16;j++)
{
slip(j);
value1=toint();
if(value1==0||value1==65535)
return sign[value0];
else if(sign[value1]==0)
{
quene.push_back(value1);
sign[value1]=sign[value0]+1;
}
slip(j);
}
i++;
}
return -1;
}
int main()
{
int i,j;
int t,ans;
while(scanf("%s %s %s %s",piece[0],piece[1],piece[2],piece[3])!=EOF)
{
for(i=0;i<4;i++)
{
t=i*4;
for(j=0;j<4;j++)
bina[t+j]=(piece[i][j]=='b'?1:0);
}
memset(sign,0,sizeof(sign));
ans=DFS();
if(ans==-1)
printf("Impossible\n");
else
printf("%d\n",ans);
}
return 0;
}
下面是王熾輝師兄的代碼,代碼長度要比我短很多^_^:
Problem: 1753 User: wangchi
Memory: 148K Time: 30MS
Language: C Result: Accepted
Source Code
#include<stdio.h>
#include<string.h>
#define MAX 1000000
int a[16], b[16], min;
char ch[4][5];
int legal()
{
int i, t, sum;
static int k = -1;
t = (a[0] + b[0] + b[1] + b[4]) % 2;
for(i = 1; i < 16; i++){
sum = a[i] + b[i];
if(i%4 != 0) sum += b[i-1];
if(i%4 != 3) sum += b[i+1];
if(i-4 >= 0) sum += b[i-4];
if(i+4 < 16) sum += b[i+4];
if(sum % 2 != t) return 0 ;
}
return 1;
}
void dfs(int i, int num)
{
if(i==16) {
if(min > num && legal()) min = num;
return;
}
b[i] = 0;
dfs(i+1, num);
b[i] = 1;
dfs(i+1, num+1);
}
int main()
{
int i, j, t;
while(scanf("%s%s%s%s", ch[0], ch[1], ch[2], ch[3]) != EOF){
for(i = 0; i < 4; i++){
t = i * 4;
for(j = 0; j < 4; j++)
a[t+j] = (ch[i][j]=='w')?0:1;
}
min = MAX;
dfs(0, 0);
if(min == MAX) printf("Impossible\n");
else printf("%d\n", min);
}
return 0;
}
⑤ 最火數字表白密碼
在很多內斂的人當中,總是不好意思去表達自己的情意。其實,表達情意的方式有很多種,例如簡訊告白、情書告白,還有最近很火的表白密碼。很多人都選擇用表白密碼去表達,這樣可以增加神秘感和情趣。那麼,有哪些表白密碼呢?讓我們一起來看看吧。
高級表白密碼
1.字母表白數字密碼:9121522521= I LOVE U
表白解密:從1開始到26,分別表示從A到Z,即:A(1)B(2) C(3) D(4) E(5) F(6) G(7) H(8) I(9) J(10) K(11) L(12) M(13) N(14) O(15) P(16) Q(17) R(18) S(19) T(20) U(21) V(22) W(23) X(24) Y(25) Z(26)。
9=I / 12=L / 15=O / 22=V / 5=E / 21=U
9121522521數字表白密碼結果是 I LOVE U。所以,當你發送這樣一串數字給你喜歡的人的時候,跟他(她)說這是一串特別特別有意義的數字,讓他(她)解開。如果他(她)能解開,一定會感受到你的心意。解不開,也會增加他(她)對你的神秘感。挑起他(她)對你的興趣。
2.大小寫變化:ilOvEU
表白解密:這個很簡單,換成我們常見的大小寫即可。
3.空格重組:il ov eu
表白解密:這個表白密碼也容易識別,兩個空格移位即可。
4.單詞倒序:i evol u
5.整句倒序:u evol i
6.凱撒移位:j mpwf v
7.反字母表(埃特巴什碼/Atbash):r olev f
表白解密:把26個字母對折(詞窮,暫且這樣描述。)就會得到:
AB C D E F G H I J K L M
ZY X W V U T S R Q P O N所以,R對應的就是I,E對應的就是L,O對應的就是L,L對應的就是O,E對應的就是V,V對應的就是E,F對應的就是U
答案:I LOVE U 。或者我們可以用這個:R OLEV BLF,對應的也就是I LOVE YOU 了。
8.柵欄密碼:ioelvu
表白解密:所謂柵欄密碼,就是把要加密的明文分成N個一組,然後把每組的第1個字連起來,形成一段無規律的話。 不過柵欄密碼本身有一個潛規則,就是組成柵欄的字母一般不會太多。(一般不超過30個,也就是一。兩句話),我們的ioelvu 就是把love拆開,然後先逆向排列兩個,再逆向插空排列。
9.維吉尼亞密碼(密鑰i love u):q wcqi o
10.維吉尼亞密碼(密鑰12345…):j nrzj a
11.仿射密碼(Affine *3+5):d mvqr n
12.希爾密碼(Hill 密鑰矩陣{3,2;5,7}):ungjae
13.納粹Enigma(密鑰ABC):YAPOJ R
14.摩斯電碼:·· ·-·· --- ···- · ··-
15.棋盤密碼(波利比奧斯密碼/Polybius):gd ag df ff xf gg
16.棋盤密碼(數字):14 14 23 33 53 44
17.ADFGX密碼(密鑰love):gfg gdx dff afg
18.鍵盤密碼1:71 31 43 91 92 81
19.鍵盤密碼2:*1 (2 (1 $3 #1 &1
20.鍵盤移位:o ;pbr i
小結:表白密碼很有意思,既可以表達自己的情意,又很有特殊意義,是近年來最火的表白方式。
⑥ 棋盤密碼怎麼區分ij
根據明文和密鑰區分。
由於ij同時出現的概率較低,所以同格。ij可以根據明文和密鑰來區分。
棋盤密碼是利用波利比奧斯方陣進行加密的密碼方式,產生於公元前兩世紀的希臘,相傳是世界上最早的一種密碼。
⑦ C語言課程設計
以下程序已在win-tc和tc2.0下運行通過,已加詳細注釋(本人所寫)。
/* 數據安全實用程序,加密解密簡單程序 */
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
int flag;
char encrypt(char ch,int key)/*加密函數,把字元循環移位*/
{
if(ch>='a' && ch<='z') /* 如果是小寫字母 */
{
ch=(ch-'a'+key%26)%26+'a'; /* 字母向後移key%26個位置,超過字母z則再從a開始向後移動 */
}
else if(ch>='A' && ch<='Z') /* 如果是大寫字母 */
{
ch=(ch-'A'+key%26)%26+'A'; /* 字母向後移key%26個位置,超過字母Z則再從A開始向後移動 */
}
return ch;
}
char decrypt(char ch,int key)/*解密函數,把字元循環移位*/
{
if(ch>='a' && ch<='z') /* 如果是小寫字母 */
{
ch=(ch-'a'+26-key%26)%26+'a'; /* 字母向後移26-key%26個位置,超過字母z則再從a開始向後移動 */
}
else if(ch>='A' && ch<='Z') /* 如果是大寫字母 */
{
ch=(ch-'A'+26-key%26)%26+'A'; /* 字母向後移26-key%26個位置,超過字母Z則再從A開始向後移動 */
}
return ch;
}
void menu()/*菜單,1.加密,2.解密,3.顯示文本文件內容*/
{
clrscr();
printf("\n=======================================================");
printf("\n1.Encrypt the text file"); /* 加密文件 */
printf("\n2.Decrypt the text file"); /* 解密文件 */
printf("\n3.Display text file contents");/* 顯示加密或解密或未加密或解密的文件 */
printf("\n4.Quit\n");
printf("=========================================================\n");
printf("Please select a item:"); /* 選擇一個菜單 */
}
void logo()/*顯示程序信息*/
{
printf("\nwelcome to encrypt program \n ");
return;
}
void encrypt_decrypt_File(char* infile,int key, char* outfile) /* 加密或解密函數 */
{
FILE *in,*out;
char ch;
clrscr(); /* 清屏 */
if((in=fopen(infile,"r"))==NULL) /* 打開欲加密或解密的文件*/
{
printf("Can not open the infile!\n"); /* 如果打開文件失敗或文件不存在列印打開失敗信息 */
printf("Press any key to exit!\n");
getch(); /* 並等待任一按鍵然後退出程序 */
exit(0);
}
if((out=fopen(outfile,"w"))==NULL) /* 打開文件保存加密或解密後的內容*/
{
printf("Can not open the outfile!\n"); /* 如果打開文件失敗或文件不存在列印打開失敗信息 */
printf("Press any key to exit!\n"); /* 並等待任一按鍵然後退出程序 */
fclose(in); /* 關閉輸入文件 */
getch(); /* 等待按鍵,按任一鍵退出程序 */
exit(0);
}
ch=fgetc(in); /*從文本文件中讀入字元*/
while(ch!=EOF)/*加密或解密*/
{
/*如果是英文字元,則進行加密或解密,否則,不進行加密或解密處理*/
if((ch>='a' && ch<='z' ) || (ch>='A' && ch<='Z'))
{ if(flag==1)
fputc(encrypt(ch,key),out);
if(flag==2)
fputc(decrypt(ch,key),out);
}
else
fputc(ch,out);
ch=fgetc(in);
}
/*關閉輸入及輸出文件*/
fclose(in);
fclose(out);
}
void displayFile(char *infile) /*將文本文件的內容顯示在屏幕上*/
{
FILE *fp;
char string[81];
if((fp=fopen(infile,"r"))==NULL) /* 以只讀方式打開文本文件 */
{
printf("cann't open file");exit(0); /* 如果文件不存在或打開失敗列印無法打開信息並退出程序 */
}
while(fgets(string,81,fp)!=NULL)
fputs(string,stdout); /*把所取字元串送到屏幕顯示*/
fclose(fp); /* 關閉文件 */
}
int main()
{
int i,n;
char ch0,ch1;
char infile[40],outfile[40];
textbackground(LIGHTGRAY); /*設置背景顏色為淺灰色*/
textcolor(BLACK); /*設置文字顏色為黑色*/
clrscr();/*清除屏幕顯示*/
logo(); /*顯示程序信息*/
sleep(2); /* 延時2秒 */
menu(); /*顯示屏幕菜單*/
ch0=getche();/*等待用戶從鍵盤輸入,並把輸入顯示在屏幕上*/
while(ch0!='4')
{
clrscr();
if(ch0=='1') /*選擇加密功能*/
{
flag=1;
printf("\nPlease input the infile to be encrypted:"); /* 輸入要加密的文件名 */
scanf("%s",infile); /* 該文件要和本程序放在同一個目錄下 */
printf("Please input the encrypt key:");
scanf("%d",&n);/*輸入加密密碼*/
printf("Please input the outfile:"); /*輸入存放加密內容的文件名*/
scanf("%s",outfile); /* 該文件可以自動創建 */
encrypt_decrypt_File(infile,n,outfile);
printf("\nEncrypt is over!\n");/* 加密成功 */
sleep(1); /* 延時1秒 */
}
else if(ch0=='2') /*選擇解密功能*/
{
flag=2;
printf("\nPlease input the infile to be decrypted:"); /* 輸入要解密的文件名 */
scanf("%s",infile); /* 該文件要和本程序放在同一個目錄下 */
printf("Please input the decrypt key:");
scanf("%d",&n);/*輸入解密密碼,加密和解密密碼應相同*/
printf("Please input the outfile:"); /*輸入存放解密內容的文件名*/
scanf("%s",outfile); /* 該文件可以自動創建 */
encrypt_decrypt_File(infile,n,outfile);
printf("\nDecrypt is over!\n");
sleep(1); /* 延時1秒 */
}
else if(ch0=='3') /*選擇顯示文本文件功能*/
{
printf("\nPlease input the infile to be displayed:"); /* 輸入要顯示的文件名 */
scanf("%s",infile);
displayFile(infile);/* 顯示文件 */
getch();
}
else
{ /*不合法輸入*/
printf("\nplease input a valid number(1-4)\n");
sleep(1); /* 延時1秒 */
}
menu();/*顯示程序菜單*/
ch0=getche(); /*等待用戶下一次的功能選擇*/
}
system("cls");/*清除屏幕*/
logo(); /*顯示程序信息*/
printf("\nGood Bye!\n");
sleep(2);/* 延時2秒 */
system("pause"); /* 暫停,按任一鍵退出程序 */
return 0;
}
⑧ 加密解密工具 之 波利比奧斯方陣密碼
波利比奧斯方陣密碼(Polybius Square Cipher或稱波利比奧斯棋盤)是棋盤密碼的一種,是利用波利比奧斯方陣進行加密的密碼方式,簡單的來說就是把字母排列好,用坐標(行列)的形式表現出來。字母是密文,明文便是字母的坐標。
工具鏈接: http://www.atoolbox.net/Tool.php?Id=913
⑨ 棋盤密碼
波利比奧斯方陣
公元前2世紀,一個叫Polybius的希臘人設計了一種將字母編碼成符號對的方法。他使用了一個稱為Polybius的校驗表。Polybius校驗表由一個5行5列的網格組成,網格中包含26個英文字母,其中I和J在同一格中。相應字母用數對表示。在古代,這種棋盤密碼被廣泛使用。Polybius校驗表如下:
假設我們需要發送明文信息「Hello」,找到H對應2行3列,則加密為23,e加密為15,以此類推,得到密文:2315 31 31 34。
ADFGX密碼
1918年,第一次世界大戰將要結束時,法軍截獲了一份德軍電報,電文中的所有單詞都由A、D、F、G、X五個字母拼成,因此被稱為ADFGX密碼。ADFGX密碼是1918年3月由德軍上校FritzNebel發明的,是結合了波利比奧斯方陣和置換密碼的雙重加密方案。ADFGX密碼之所以選擇ADFGX一個字母,是因為它們譯成摩斯密碼時不容易混淆,可以降低傳輸錯誤的機率。ADFGX密碼表如下:
這樣加密的話Hello的密文就是:DD XF AG AGDF。
ADFGVX密碼
ADFGX密碼發送含有大量數字的信息會有問題。 在1918年6月,又加入一個字母V擴充,變成以6×6格共36個字元加密,這使得所有英文字母(不再將I和J視為同一個字)以及數字0到9都可混合使用。ADFGVX是被法國陸軍中尉Georges Painvin所破解的。
⑩ 高級表白密碼
表白也是考智商的活啊!下面這些高級表白密碼趕緊學起來,要不真的都看不懂暗戀你的人到底是不是對你表白了。
一、高級表白密碼