口袋社区-Poke The BBS's Archiver

youd 发表于 2007-10-26 20:35

【初级破解】对称密钥密文破译简析

当今社会,有很多信息需要加密传输,以次来保证信息传输的安全性。下面我们针对使用对称密钥加密一段英文的密文破译进行理论分析。
    对称密钥,简单地说可以理解为以某种特定关系将信息转化为密文的一种算法,比如函数就属于对称算法,不过函数,比如偶函数,三角函数会造成一个值对应了多个密文,造成自己解密的困难,所以一般不使用这些函数。举个例子:比如k=x+1,k是密钥,我们加密一个单词“Hallo”,我们把英文中A~Z26个字母按照顺序写为1~26,这样1对应A,2对应B……,密钥是k=x+1,那么文字代表的是x,H对应数字8,8+1=9,翻译为密文就是I,依次类推,“Hallo”翻译成密文之后就成了,“Ibmmp”,没有任何意义,别人如果不知道密钥,不能解析密文,那么我们的目的就达到了,我们成功的阻止了盗取信息的出现,为了安全,我们可以采用复合对称密钥,即将密文再按照其他规则运算,达到增加破译难度的目的。
    知道了对称密钥是什么,我们来谈谈解密,如果我们截获了一段密文,我们如何能知道它所说的意思呢?我们首先想到的是要得到密钥,然而私有密钥是很难被获取的,这样,人们研究出了密文的规律。英文中,字母在书面语言中的出现概率以基本固定的数字存在,下面给出概率表
[quote]A|0.0816
B|0.0155
C|0.0223
D|0.0463
E|0.1231
F|0.0237
G|0.0198
H|0.0671
I|0.0669
J|0.0008
K|0.0068
L|0.0354
M|0.0273
N|0.0673
O|0.0795
P|0.0156
Q|0.0006
R|0.0555
S|0.0578
T|0.0977
U|0.0281
V|0.0112
W|0.0278
X|0.0014
Y|0.0206
Z|0.0004[/quote]
    知道了出现概率对我们有什么帮助呢?不论对方使用什么方法将明文进行加密运算,得出的结果始终是满足对应规律的,不可能P对应1和2两个数字,在“apple”中,当密文翻译一个"p"为1时,另外一个"p"也一定是1,这样我们从中寻找突破口,既然一篇文章中出现相应字母的概率是基本固顶的,那我们只要统计密文中的各种字母的概率,和上表进行对应查找,我们不用知道密钥也能破解出来明文了。理论就这么简单,你可以找一篇文章,自己写一个对称密钥法则的加密器,将得到的密文按照上面的理论进行破译,看看文章的意思能否出来?
    在这里我要提醒各位读者,这样的破译方法是有局限性的,对于破译密文很长的文章,用这个方法是没有什么问题的,但是对于破译一句话,甚至一个单词,它是无能为力的,因为概率是建立在众多实验和统计之上的,频率是会在概率上下浮动的,所以越短小的密文,破译后的精确度就越低,甚至无法去破译。
    另外,现在的密码学发展十分发达,各种算法层出不穷,对称密钥可以说是密码学中最为简单,最方便理解的一个,所以说漏洞也会有不少。一些善于用对称密钥来加密传递消息的朋友稍微改进下算法,就可以避免被上面说的方法破译,比如一段文字用一个密钥,甚至一个字母用一个密钥,虽然这样十分的繁琐,但是保密程度会大大增加。
    本文为对密码学感兴趣的同学提供个初步的认识和理论,如果有纰漏,我会及时更正!

最美我中文 发表于 2007-10-26 20:44

I我这里有一个利用VB伪随机数写的对称算法函数。曾大量用于KeygenMe。
[code]Public Function EDcode$(CharString As String, Key As Integer)
    Dim x As Single, i As Long
    Dim CharNum As Integer, RandomInteger As Integer
    Dim CharSingle As String * 1
    On Local Error GoTo EDcodeError
    EDcode$ = ""
    If Len(CharString) = 0 Then
        EDcode$ = "1"
        Exit Function
    End If
    x = Rnd(-Key)
    For i = 1 To Len(CharString)
        CharSingle = Mid$(CharString, i, 1)
        CharNum = Asc(CharSingle)
        RandomInteger = Int(256 * Rnd) And &H7F
        CharNum = CharNum Xor RandomInteger
        CharSingle = Chr$(CharNum)
        EDcode$ = EDcode$ + CharSingle
    Next i
    Exit Function
EDcodeError:
    EDcode$ = "0"
End Function[/code]

youd 发表于 2007-10-26 20:46

伪随机数就和我文章中所说"一个字母一个密钥"差不多

最美我中文 发表于 2007-10-26 20:47

NONONONONO
VB中Rnd函数用法是Rnd(integer)就是说要给他一个种子然后算“随机数"所以说它伪。

youd 发表于 2007-10-26 20:50

我说的是取1~26之间的整数值随机数序列,序列中的每个元素对应一个明文字母,这种序列称为伪随机序列,元素称为伪随机数

最美我中文 发表于 2007-10-26 20:52

而我说的是Rnd函数。
我给定的函数就是利用了Rnd的伪随机性。

youd 发表于 2007-10-26 20:53

没看W给的代码= =|||可能我理解错了W的意思

roywillow 发表于 2007-10-27 17:30

二大仙人……好像直接用Rnd()还是什么函数可以直接产生[0,1)的随机数吧?(区间的开闭有点记不清了……)

youd 发表于 2007-10-27 19:53

就是Rnd()
[0,1]是开区间,用这个函数可以造各种随机数

最美我中文 发表于 2007-10-27 19:56

函数可以定义。爱多大多大。

youd 发表于 2007-10-27 19:59

比如说
Int(26 * Rnd +1)
就是1~26的随机数

最美我中文 发表于 2007-10-28 12:33

真可爱……
youd你今年再搞个猜数游戏吧

youd 发表于 2007-10-28 12:49

没可能了…电脑被搬走了

页: [1]

Powered by Discuz! Archiver 6.1.0F  © 2001-2007 Comsenz Inc.