古典密码在线解密(古典密码吧)

2023-03-01 20:08:47 密码用途 思思

C++实现古典密码Hill体制的加密解密的程序

这是C的,且基于的是ASCII码,大致改一改吧。

#includestdio.h

#includemath.h

#includestdlib.h

#includestring.h

struct hill

{

int i,j;

int s[10][10];

}a[3],b;

struct hill mul(struct hill,struct hill);

int det(struct hill,int,int);

struct hill inv(struct hill);

void code();

void uncode();

FILE *word,*num;

void main()

{

int i=0,j=0,k=0;

word=fopen("word.txt","r");

num=fopen("num.txt","r");

if(word==NULL||num==NULL)

{

printf("Error!\n");

exit(0);

}

fclose(word);

fclose(num);

while(!i)

{

fflush(stdin);

printf("输入密码\n");

for(i=0;i10;i++)

{

for(j=0;j10;j++)

{

a[k].s[i][j]=getchar();

if(a[k].s[i][j]=='\n') break;

}

if(a[k].s[i][0]=='\n') break;

}

for(a[k].j=0;a[k].s[0][a[k].j]!='\n';a[k].j++);

for(a[k].i=0;a[k].s[a[k].i][0]!='\n';a[k].i++) a[k].s[a[k].i][a[k].j]=0;

for(i=0;ia[k].i;i++) for(j=0;ja[k].j;j++) a[k].s[i][j]=a[k].s[i][j]-'a';

i=0;

if(a[k].i==a[k].j)

{

if(det(a[k],a[k].i,a[k].j)%2!=0det(a[k],a[k].i,a[k].j)%13!=0)

{

printf("是(0)否(1)继续输入?:");

scanf("%d",i);

k++;

}

else printf("密码不合格!\n");

}

else printf("密码不合格!\n");

}

while(i)

{

printf("1:加密 2:解密\n");

scanf("%d",i);

switch(i)

{

case 1: code(); break;

case 2: uncode(); break;

default: i=0;

}

}

}

struct hill mul(struct hill a,struct hill b)

{

int i=0,j=0,k=0;

struct hill ans;

ans.i=a.i;

ans.j=b.j;

for(i=0;ians.i;i++)

{

for(j=0;jans.j;j++)

{

ans.s[i][j]=0;

for(k=0;ka.j;k++)

ans.s[i][j]=ans.s[i][j]+a.s[i][k]*b.s[k][j];

}

}

for(i=0;ians.i;i++)

{

for(j=0;jans.j;j++) ans.s[i][j]=(ans.s[i][j]%26+26)%26+'a';

ans.s[i][j]='\0';

}

return(ans);

}

struct hill inv(struct hill a)

{

char c;

int i=0,j=0,k=0;

struct hill ans;

ans.i=a.i;

ans.j=a.j;

switch(det(a,a.i,a.j)%26)

{

case 1: k=1; break;

case 3: k=9; break;

case 5: k=21; break;

case 7: k=15; break;

case 9: k=3; break;

case 11: k=19; break;

case 15: k=7; break;

case 17: k=23; break;

case 19: k=11; break;

case 21: k=5; break;

case 23: k=17; break;

case 25: k=25; break;

}

for(i=0;ians.i;i++)

{

for(j=0;jans.j;j++)

ans.s[i][j]=(((int)pow(-1,i+j)*det(a,i,j)*k)%26+26)%26;

}

for(i=0;ians.i;i++) ans.s[i][ans.j]='\0';

for(i=0;ians.i;i++)

{

for(j=0;ji;j++)

{

c=ans.s[i][j];

ans.s[i][j]=ans.s[j][i];

ans.s[j][i]=c;

}

}

return(ans);

}

int det(struct hill a,int m,int n)

{

int i=0,j=0,x=0;

if(m!=a.i||n!=a.j)

{

for(i=0;ia.i;i++) for(j=n;ja.j;j++) a.s[i][j]=a.s[i][j+1];

for(i=m;ia.i;i++) for(j=0;ja.j;j++) a.s[i][j]=a.s[i+1][j];

a.i--;

a.j--;

}

if(a.i==2a.j==2) return(a.s[0][0]*a.s[1][1]-a.s[0][1]*a.s[1][0]);

for(i=0;ia.i;i++) x+=a.s[0][i]*det(a,0,i)*(int)pow(-1,i);

return(x);

}

void code()

{

int i=0,j=0,space[10],k=0,n=0;

struct hill ans;

char c=0;

word=fopen("word.txt","r");

c=fgetc(word);

while(c!=EOF)

{

if(c='a'c='z') n++;

c=fgetc(word);

}

fclose(word);

word=fopen("word.txt","r");

num=fopen("num.txt","w");

while(n)

{

printf("剩余%d: ",n);

scanf("%d",j);

n=n-j;

for(k=0;a[k].i!=j;j++);

b.i=a[k].i;

b.j=1;

for(j=0;j10;j++) space[j]=-1;

j=0;

for(i=0;ib.i;i++)

{

b.s[i][0]=fgetc(word);

if(b.s[i][0]'a'||b.s[i][0]'z')

{

space[j]=i;

j++;

b.s[i][0]=fgetc(word);

}

}

for(i=0;ib.i;i++)

{

b.s[i][0]-='a';

b.s[i][1]='\0';

}

ans=mul(a[k],b);

for(i=0;ians.i;i++)

{

for(j=0;j10;j++) if(i==space[j]) break;

if(j!=10) fprintf(num," %c",ans.s[i][0]);

else fprintf(num,"%c",ans.s[i][0]);

}

}

fclose(word);

fclose(num);

}

void uncode()

{

int k=0,n=0;

int i=0,j=0,space[10];

struct hill ans;

char c=0;

word=fopen("num.txt","r");

c=fgetc(word);

while(c!=EOF)

{

if(c='a'c='z') n++;

c=fgetc(word);

}

fclose(word);

word=fopen("word.txt","w");

num=fopen("num.txt","r");

b.i=a[k].i;

b.j=1;

while(n)

{

printf("剩余%d: ",n);

scanf("%d",j);

n=n-j;

for(k=0;a[k].i!=j;j++);

b.i=a[k].i;

b.j=1;

for(j=0;j10;j++) space[j]=-1;

j=0;

for(i=0;ib.i;i++)

{

b.s[i][0]=fgetc(num);

if(b.s[i][0]'a'||b.s[i][0]'z')

{

space[j]=i;

j++;

b.s[i][0]=fgetc(num);

}

}

for(i=0;ib.i;i++)

{

b.s[i][0]-='a';

b.s[i][1]='\0';

}

ans=mul(inv(a[k]),b);

for(i=0;ians.i;i++)

{

for(j=0;j10;j++) if(i==space[j]) break;

if(j!=10) fprintf(word," %c",ans.s[i][0]);

else fprintf(word,"%c",ans.s[i][0]);

}

}

fclose(word);

fclose(num);

}

古典密码在线解密(古典密码吧) 第1张

密码学 - 古典加密

信息理论之父:克劳德 香农

论文《通信的数学理论》

如果没有信息加密,信息直接被中间人拦截查看、修改。

明文Plain text

密文Cipher text

加密Encryption/Encrypherment:将明文转化为密文

解密Decrytion/Decipherment:讲密文还原为明文

加密钥匙EK Encryption Key:加密时配合加密算法的数据

解密钥匙EK Encryption Key:解密时配合解密算法的数据

各个字符按照顺序进行n个字符错位的加密方法。

(凯撒是古罗马军事家政治家)

多次使用恺撒密码来加密并不能获得更大的安全性,因为使用偏移量A加密得到的结果再用偏移量B加密,等同于使用A+B的偏移量进行加密的结果。

凯撒密码最多只有25个密匙 +1到+25 安全强度几乎为0

(密钥为0或26时,明文在加密前后内容不变)

暴力枚举

根据密文,暴力列出25个密匙解密后的结果。

凯撒密码的例子是所有 单字母替代式密码 的典范,它只使用一个密码字母集。

我们也可以使用多字母替代式密码,使用的是多个密码字母集。

加密由两组或多组 密码字母集 组成,加密者可自由的选择然后用交替的密码字母集加密讯息。

(增加了解码的困难度,因为密码破解者必须找出这两组密码字母集)

另一个多字母替代式密码的例子“维吉尼亚密码”,将更难解密

(法语:Vigenère cypher),

它有26组不同用来加密的密码字母集。

每个密码字母集就是多移了一位的凯撒密码。

维吉尼亚方格(替换对照表):

维吉尼亚密码引入了密匙概念。

同一明文在密文中的每个对应,可能都不一样。

移位式密码,明文中出现的字母依然出现在密文中,只有字母顺序是依照一个定义明确的计划改变。

许多移位式密码是基于几何而设计的。一个简单的加密(也易被破解),可以将字母向右移1位。

例如,明文"Hello my name is Alice."

将变成"olleH ym eman si ecilA."

密码棒(英语:scytale)也是一种运用移位方法工具。

明文分组,按字符长度来分,每5个字母分一组。

并将各组内的字符的顺序进行替换。

具体例子

纵栏式移项密码

先选择一个关键字,把原来的讯息由左而右、由上而下依照关键字长度转写成长方形。接着把关键字的字母依照字母集顺序编号,例如A就是1、B就是2、C就是3等。例如,关键字是CAT,明文是THE SKY IS BLUE,则讯息应该转换成这样:

C A T

3 1 20

T H E

S K Y

I S B

L U E

最后把讯息以行为单位,依照编号大小调换位置。呈现的应该是A行为第一行、C行为第二行、T行为第三行。然后就可以把讯息"The sky is blue"转写成HKSUTSILEYBE。

另一种移位式密码是中国式密码(英语:Chinese cipher),移位的方法是将讯息的字母加密成由右而左、上下交替便成不规则的字母。范例,如果明文是:THE DOG RAN FAR,则中国式密码看起来像这样:

R R G T

A A O H

F N D E

密码文将写成:RRGT AAOH FNDE

绝大多数的移位式密码与这两个范例相类似,通常会重新排列字母的行或列,然后有系统的移动字母。其它一些例子包括Vertical Parallel和双移位式(英语:Double Transposition)密码。

更复杂的算法可以混合替代和移位成为积密码(product cipher);现代资料区段密码像是DES反复位移和替代的几个步骤。

行数=栏数

明文,分为N栏(N行) 按照明文本来的顺序,竖着从上往下填。

【实例1】

明文123456

栏数2(行数2)

密文135246

135

246

拆成2行(2栏),竖着看密文——得到明文

【实例2】明文123456789abcdefghi 栏数9 (行数)---密文1a2b3c4d5e6f7g8h9i

拆成9行竖着看密文.

1a

2b

3c

4d

5e

6f

7g

8h

9i

古典密码【栅栏密码安全度极低】组成栅栏的字母一般一两句话,30个字母。不会太多! 加解密都麻烦

是指研究字母或者字母组合在文本中出现的频率。应用频率分析可以破解古典密码。

工具

在线词频分析

关于棋盘密码(一种古典密码) 怎么解密,加密?

棋盘密码的加密方法,其实方法十分简单,在密码学并不发达的古代,也够用了。棋盘密码的解题思路是这样

这种密码的原理是:通信双方各掌握一个m*n列的矩阵,比如A列第一行写上“我”,A列第2行写上“的”……以此类推,构成:

所以,“我的名字叫XXX”的密文即:A1 A2 A3 A4 B1 B2。这样,一份密文就出来了。

使用这种密码表的加密也叫作 ADFGX 密码(密文中只有 A D F G X)

明文:HELLO  密文:DD XF AG AG DF

对于解密,对密文每两个字符一组,分别进行解密

由于密文仅包含5个字符,所以其密钥(也就是密码表)只有5!种可能

写脚本暴力攻击(brute-force)即可

棋盘密码的由来:

公元前2世纪前后希腊人提出了棋盘密码,在当时得到了广泛的运用。同时,它也是密码史上第一个密码。棋盘密码通过将26个字母设法变成十位数来达到加密的目的。棋盘密码的密钥是一个5×5的棋盘,将26个英文字母放置在里面。其中 i 和 j 共用一个密码。

密码学和密码(古典密码) Cryptography and Classical Cipher

我对“恩尼格玛”密码机很感兴趣,趁着考完AP历史和物理休息的时间,整理一下我自己学到的东西,包括密码的历史和恩尼格玛的历史。

I am interested in the "Enigma" cipher machine. While taking a break after AP history and physics exam. I organized what I have learned, including the history of cipher and enigma.

密码学是研究密码技术的科学,目的是研究保障信息安全的技术和手段。

密码在中外历史上古代就有广泛的应用,比如中国的狼烟,消息树,古罗马的凯撒密码等,这些密码都是利用简单的直接想象编制完成的。现代的密码学原理直到20世纪初都才逐渐形成,现代的密码学是数学+通信+计算机科学等学科于的交叉科学。

Cryptography is the study of the science of cryptography, the purpose of which is to study the technology and means to ensure information security.

Passwords have been widely used in Chinese and foreign history, such as the Chinese "Wolf smoke", "message tree", and the ancient Roman "Caesar" ciphers.   

The principles of modern cryptography were not gradually formed until the early 20th century. Modern cryptography is an interdisciplinary science of mathematics, communication and computer science

一、几个非常有意思的例子

唐朝武则天朝执政期间,宰相裴炎与徐敬业(就是骆宾王著名的檄文《为徐敬业讨武曌檄》中的徐敬业)勾搭造反,裴给徐送去一封密信,书信被武则天查获。信中只有“青鹅”两个字,武则天识破密信内容,“青”字可以拆分成“十二月”,繁体的“鹅”,可以拆分成“我自与”,断定裴炎十二月要造反,将裴炎处死于洛阳。

古罗马皇帝恺撒向前线司令官发出了一封密信:VWRS WUDIIF,密信的内容被敌方截获,但是敌方根本不了解这是什么意思,但罗马的前线司令官却很快明白了。因为古罗马皇帝同时发出的还有另外一封密信:前进三步,两封信结合到一起,VWRS WUDIIF就是STOP TRAFFIC。

二、古典密码

原始的加密方法,也被称为古典密码,大致有以下几种,

1、棋盘密码

公元前两世纪,一个希腊人提出了棋盘密码,原理是把26个字母放合5x5的方格里,其中i、j放在同一个格中,具体如下表:

如果α是该字母所在行的标号,β是列标号,那么每个字母就对应了由两个数字αβ构成的字符。如果接收到密文为:11、35、12、24、34、31、34、22、54,对应的明文就是:A P  B I O L O G Y。

2、替代密码法

典型的替代密码法是凯撒密码,以上文的前进三步为例:“VWRS WUDIILF”+“前进三步”,按照字母表,前进三步,就出现了如下的转换:v—s、w—t、r—o、s—p、w—t、U—r、d—a……,最后解密为 STOP TRAFFIC。

法国人维吉尼亚1585年在凯撒密码基础上,使用一系列凯撒密码组成密码字母表的加密方法,被称作维吉尼亚密码。

假设明文为:

ATTACKLONDON

选择一个关键词作为密钥,关键词重复使用,如果关键词为LEMON,对应上述明文的密钥为:LEMONLEMONLE

明文的第一个字母A,对应密钥的第一个字母L,使用表格中L行字母表进行加密,得到密文第一个字母L。类似,明文第二个字母为T,在表格中使用对应的E行进行行加密,得到密文第二个字母X。如此类推,可以得到:

明文:ATTACKLONDON

密钥:LEMONLEMONLE

密文:LXFOPVPABOZE

3、一次性密码本

一次性密码本(One Time Pad,缩写为OTP)是古典密码学中的一种加密算法。以随机的密钥组成明文,且只使用一次。

理论上,此种密码具有完善保密性,是牢不可破的。