凯撒密码自行转换(凯撒密码解密方法)

2023-02-11 12:14:41 密码用途 思思

谁懂计算机的凯撒码 我想知道怎么代换

这里有方法,自己看吧,比较多,呵呵

[凯撒介绍]

凯撒密码(kaiser)是罗马扩张时期朱利斯"凯撒(Julius Caesar)创造的,用于加密通过信使传递的作战命令。它将字母表中的字母移动一定位置而实现加密。

[加密原理]

凯撒密码的加密算法极其简单。其加密过程如下:

在这里,我们做此约定:明文记为m,密文记为c,加密变换记为E(k1,m)(其中k1为密钥),解密变换记为D(k2,m)(k2为解密密钥)(在这里k1=k2,不妨记为k)。凯撒密码的加密过程可记为如下一个变换:

c≡m+k mod n (其中n为基本字符个数)

同样,解密过程可表示为:

m≡c+k mod n (其中n为基本字符个数)

对于计算机而言,n可取256或128,m、k、c均为一个8bit的二进制数。显然,这种加密算法极不安全,即使采用穷举法,最多也只要255次即可破译。当然,究其本身而言,仍然是一个单表置换,因此,频率分析法对其仍是有效的。

[加密算法]

我们预定义基本字符个数为 #define MAX 128

凯撒加密函数可以表示为

[Copy to clipboard]

CODE:

char cipher(char plain_char, int key)

{

return (plain_char + key) % MAX;

};

凯撒解密函数:

[Copy to clipboard]

CODE:

char decipher(char cipher_char, int key)

{

return (cipher_char - key + MAX) % MAX;

};

加密后,原所有的ASCII码偏移key位,解密则移回key位。

如果要对一个文本文件进行加密,则只要依次逐个字符逐个字符地读取文本文件,进行加密后,逐个字符逐个字符写入密文文本文件中,即可:

[Copy to clipboard]

CODE:

FILE *fp_plaintext;

FILE *fp_ciphertext;

char plain_char;

... ...

while((plain_char=fgetc(fp_plaintext))!=EOF)

{

fputc(cipher(plain_char,key),fp_ciphertext);

}

对文件的解密也同样方法。

[破解原理]

一篇包含字符的英文文章,其各ASCII码字符出现,都有一定的频率,下面是对Google上随意搜索到的英文文章进行分析的结果,见表:

QUOTE:

=================================================

FileName : 01.txt

[1] 32: times:204

[2] 101:e times:134

[3] 116:t times:91

[4] 105:i times:87

[5] 111:o times:77

[6] 108:l times:75

[7] 97:a times:75

[8] 110:n times:69

[9] 10:

times:67

[10] 115:s times:63

=================================================

FileName : php.si.source.txt

[1] 32: times:576

[2] 101:e times:162

[3] 115:s times:153

[4] 110:n times:141

[5] 114:r times:138

[6] 105:i times:135

[7] 10:

times:134

[8] 116:t times:129

[9] 42:* times:116

[10] 111:o times:103

=================================================

FileName : work.txt

[1] 32: times:51322

[2] 101:e times:30657

[3] 116:t times:23685

[4] 97:a times:19038

[5] 111:o times:17886

[6] 105:i times:16156

[7] 110:n times:15633

[8] 114:r times:15317

[9] 115:s times:15226

[10] 104:h times:12191

=================================================

FileName : 02.txt

[1] 32: times:299

[2] 101:e times:217

[3] 110:n times:136

[4] 105:i times:133

[5] 111:o times:124

[6] 116:t times:116

[7] 97:a times:110

[8] 115:s times:98

[9] 114:r times:92

[10] 108:l times:82

=================================================

FileName : 03.txt

[1] 45:- times:404

[2] 32: times:394

[3] 101:e times:237

[4] 116:t times:196

[5] 114:r times:173

[6] 97:a times:163

[7] 105:i times:161

[8] 110:n times:153

[9] 111:o times:142

[10] 115:s times:129

=================================================

FileName : 04.txt

[1] 32: times:326

[2] 101:e times:179

[3] 116:t times:106

[4] 105:i times:101

[5] 111:o times:96

[6] 110:n times:94

[7] 97:a times:92

[8] 115:s times:78

[9] 100:d times:61

[10] 114:r times:60

=================================================

FileName : 05.txt

[1] 32: times:441

[2] 101:e times:191

[3] 111:o times:151

[4] 116:t times:120

[5] 97:a times:112

[6] 110:n times:108

[7] 105:i times:91

[8] 114:r times:84

[9] 117:u times:79

[10] 115:s times:79

有此分析可知,一篇英文文章中,出现较高频率的两个字符是 ' ' (空格) 和 'e',而且它们的ASCII码分别是32和101,差值是69。

既然凯撒密码利用的是单表替换的一种简单加密算法,所以,我们的主角, ' ' 和 'e' ,在解密后,依然会保持相同的ASCII码差值,69。

|c1 - c2| = |'e' - ' '| = |101 - 32| = 69

|m1 - m2| = | ((c1 + k) mod 256)-((c2 + k) mod 256)| = |c1 - c2| = |'e' - ' '| = 69

现在可以得到破解凯撒密码的原理了,我们统计一片经过凯撒加密的密文字符信息,在出现频率较高的字符里面寻找差值是69的2个字符,这两个必定是 ' ' 和 'e' 字符的加密字符,计算偏移量(既密钥key),通过解密运算,还原出明文。

[破解算法]

任何一片英文加密后的密文,我们统计出所有字符的个数:

[Copy to clipboard]

CODE:

#define MAX 128

... ...

FILE *fp_ciphertext;

char cipher_char;

int i; //密文文件长度,包含多少字符

unsigned int size_file=0; //申明num数组,存储各个ASCII字符在密文中出现的个数

num[MAX];

... ...

for(i = 0;i MAX; i++) //初始化num数组中的值

num[i] = 0;

... ...

while((cipher_char=fgetc(fp_ciphertext))!=EOF)

{

num[cipher_char]++;

size_file++;

}

统计出现最多次数的字符,定义#define GETTOP 10,统计最多的前10位字符:

[Copy to clipboard]

CODE:

//统计前10位

#define GETTOP 10

... ...

int temp,i,j;

int maxascii[GETNUM]; //申明maxascii数组,存储统计出的概率前10位的字符ascii码

int maxtimes[GETNUM]; //申明maxtimes数组,存储统计出的概率前10位的字符的出现次数

... ...

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

{

temp=0; //临时变量temp里面来存储出现最多次数的字符的ascii码

for(j=1;jMAX;j++) //依次比较所有的字符次数,获得最多字符的ascii码

{

if(num[j]=num[temp])

temp=j;

}

maxascii[i]=temp; //把出现最多次数字符的ascii存储到相应的maxascii数组中

maxtimes[i]=num[temp]; //把最多次数字符的出现次数存储到相应的maxtimes数组中

num[temp]=0; //把最多次数字符的次数赋值成0,

//进行循环运算,同样的算法,第二次循环得到的值,肯定是出现第二多的字符

//避免了对256或128个字符进行排序的复杂运算

//当年我用汇编编写成绩排序的程序时,也用这套排序算法:-)

}

找出出现最多字符中,ASCII码差别是69的两个字符,计算出密钥key的长度:

[Copy to clipboard]

CODE:

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

{

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

{

if((max[i]-max[j])==69)

{

key=(max[j] - 32 + MAX ) % MAX;

printf("Key : %d\n",key);

break;

}

}

}

既然得到了密钥长度,算完成了对凯撒密码的破解了,那就进行解密吧,大功告成!

凯撒密码

恩~ 你都给了明文和密钥…不知道你还要什么方法啊?

如果你不知道凯撒,可以去百度一下,我给你简单说一下吧~

英文26个字母(不分大小写)可以由数字01~26来代替(有人也用00~25来代替,不过不常见~)

凯撒全称叫凯撒位移加密法,顾名思义啊~

比如A是01,你用n=4加密之后就是01+4=05,05在字母表里是E,所以A加密之后就是E~

CHINA用n=4加密之后就是GLMRI~ 明白没?

对了,需要说明一下,上面举的例子是字母表向右移动4位,n=4也可以理解为向左移动4位,那么CHINA加密之后就变成YDEJW~ 不过不用担心,一般情况下都是向右移的,当然也不排除某些变态向左移(强烈鄙视这种人!!!)…

恩~ 废话说了好多,给你密文吧~说明一下,我是用01~26和右移的方法加密的~

Glmri Girwvep Vehms erh XZ Yrmzivwmxc~ 完毕~(我加的有点快,不保证全对,你自己检查一下哈~)

再补一句,字母表可以循环用的,比如Z用完了就回到ABC…,这时候A就相当于27~ 明白否?

嘿嘿… 我腹黑一下下~ 如果你想用密码去虐一个人的脑细胞的话,推荐你用00~25和左移的方法,保证他能死至少一半的脑细胞~

嘿嘿嘿嘿……

开源项目:凯撒密码转换器

几天前一次和朋友聊天谈到了加密聊天,于是想到了凯撒密码,随之就是想用自己的一点烂技术写点好玩的:

下面是成品说明

本程序可以将用户输入的内容通过 非固定的凯撒密码字典 进行加/解密,是一种好用加密的加密聊天方式。

Caesar cipher,发明者Caesar(凯撒),罗马人。

根据苏维托尼乌斯的记载,恺撒曾用此方法对重要的军事信息进行加密:

如果需要保密,信中便用暗号,也即是改变字母顺序,使局外人无法组成一个单词。如果想要读懂和理解它们的意思,得用第4个字母置换第一个字母,即以D代A,余此类推。

同样,奥古斯都也使用过类似方式,只不过他是把字母向右移动一位,而且末尾不折回。每当他用密语写作时,他都用B代表A,C代表B,其余的字母也依同样的规则;他用A代表Z。

另外,有证据表明,恺撒曾经使用过更为复杂的密码系统:文法学家普罗布斯曾经写过一份独具创新的手稿,研究恺撒书信中包含有秘密信息的字母。

已经无法弄清恺撒密码在当时有多大的效果,但是有理由相信它是安全的。因为恺撒大部分敌人都是目不识丁的,而其余的则可能将这些消息当作是某个未知的外语。即使有某个敌人获取了恺撒的加密信息,根据现有的记载,当时也没有任何技术能够解决这一最基本、最简单的替换密码。现存最早的破解方法记载在公元9世纪阿拉伯的阿尔·肯迪的有关发现频率分析的著作中。

这是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。这个加密方法是以罗马共和时期凯撒的名字命名的,当年凯撒曾用此方法与其将军们进行联系。

进入程序后,会有像下面这样的提示:

随便输入一段英文(此程序仅支持英文和数字,原因看原理):例如 Fuck you

然后回车:

我们在这输入的是可看的原文,所以我们要加密,输入1,回车:

我们以位移+3(这是当年的默认值,输入其他值可以为负,但是必须加负号,正数的正号加不加无所谓)为例,输入并回车:

程序里面用了循环,所以输出完后会自动进行下一次,这适合正在加密聊天的折腾者。

同样,我们把加密好的文本复制完后重新输入,选择2进行反加密(解密),位移了多少仍然填3:

这样解密就成功了,是不是真的很适合爱折腾的你?赶紧发给你的朋友,约定一个固定的位移数(加密密钥)进行愉快的无限制聊天吧!

存放主程序及图标文件

英文版主程序(在en-ww文件夹内)

程序图标,透明底的

中文版主程序

日志文件,主要通过自编模块 keeplog 生成,内容为“日期(Y/M/D)+时间(h/m/s)+加密密钥+输入/输出内容+分割线”

请高手解释一下,什么叫凯撒密码,还有什么叫进制转换密码?

它是一种代换密码。据说凯撒是率先使用加密函的古代将领之一,因此这种加密方法被称为凯撒密码。

凯撒密码自行转换(凯撒密码解密方法) 第1张

4 16 15 8 19 2 21 22 13 2 21 10 16 15-1 凯撒密码是什么?

在密码学中,恺撒密码(英语:Caesar cipher),或称恺撒加密、恺撒变换、变换加密,是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。这个加密方法是以罗马共和时期恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。

(以上摘自百度百科,更多详情请自行学习了解)

然后这些数字,分别指代英文26个字母,比如4指代d,16指代p等等。以此类推,则除了“-1”以外的其他数字转换成字母依次是:dpohsbuvmbujpo

-1指的是偏移量为1,即明文中的所有字母分别向右偏移一位继而得到上述密文。因此若想得到明文,须将dpoh...的所有字母分别向左偏移一位,即d变成c,p变成o等等。以此类推,明文即是:

congratulation

祝贺

至于那个“-1”,个人猜想还有一种理解,就是指4 16……那些数字分别减去1。这样理解也能得出同一个答案,只是我不确定那个“-”究竟是减号还是普通的短破折号。