《基于Python的代替密码破译方法实现分析研究计算机科学与技术专业.docx》由会员分享,可在线阅读,更多相关《基于Python的代替密码破译方法实现分析研究计算机科学与技术专业.docx(29页珍藏版)》请在三一办公上搜索。
1、摘要OABSTRACT1第1章绪论11.1 研究背景及意义11.2 Python语言21.2.1 PythOrI语言简介21.2.2 PythOn语言的优势2第2章加密解密基本算法及原理32.1 密码体制的分类32.1.1 对称密码体制42.1.2 非对称密码体制52.2 DES算法详细原理介绍52.2.1 DES算法概述52.2.2 DES算法设计思想和准则62.3 RSA算法详细原理介绍61.1 .1RSA算法概述61.2 RSA体制的算法过程72.4 其他加密解密算法7第3章模拟Python代替密码破译过程83.1 代替密码破译界面程序(mainwindow)83.2 计算密码字典程序(
2、InakeWordPatterns)113.3 单词模式程序(WordPatternS)1333.1 常用密码字典类型1433.2 2密码字典修改模式143.4 密码破解程序(passwordDecipher)153.5 简单替代密码加解密测试程序(SimplesubstitutePassword)17结论24参考文献25错误!未定义书签。摘要随着计算机与网络应用的普及,信息安全问题越来越引起人们的重视。仅靠对管理制度进行完善难以从根本上杜绝内部安全问题的发生,必须从技术上对内部数据文件进行保护,文件保护系统也由此而生。本文通过对PythOrI的基本概念、加解密基本算法及原理进行系统说明,采用
3、代替方法实现对信息的加解密,并对加解密过程实现可视化等方面的分析,由浅入深对Python的代替密码破译方法实现研究与设计及防范技术进行了系统的研究。关键词:信息安全Python密码破译ABSTRACTWiththepopularizationofcomputerandnetworkapplication,theproblemofinformationsecurityhasattractedmoreandmoreattention.Itisdifficulttopreventinternalsecurityproblemsfromhappeningsimplybyimprovingthemana
4、gementsystem,andinternaldatafilesmustbeprotectedtechnically,sothedocumentprotectionsystemalsoarises.Inthispaper,thebasicconceptsofPython,thebasicalgorithmsandprinciplesofencryptionanddecryptionareexplainedsystematically,theinformationisdecryptedbyusingalternativemethods,andtheprocessofencryptionandd
5、ecryptionisvisualized.Keywords:InformationsecurityPythonPasswordcracking第1章绪论1.1 研究背景及意义信息安全从来都是人们最重视的问题,同时也是人们最担心的问题之一。密码几乎可以说是随着语言的产生而产生的,因此密码与人类语言的历史一样悠久,随着科学技术的发展而不断的技术更新。随着信息社会的到来,利用信息资源,人们产生了巨大的利益,但是,多起信息泄露事故的发生,不得不让我们正视信息安全的考验。目前,在网络上传输数据文件进行交流成了我们的习惯,便利之余,在传输过程中一些数据图像很有可能遭受黑客等其他一些恶意迫害者的攻击,导致
6、数据误传、错传,甚至内容被修改或者被截走。网络密码学的诞生极大地保障了网络传输的安全性,由对称加密与解密算法DES和非对称加密算法RSA组成的数据加密的诞生极大地丰富了网络密码学的内容,保障了网路数据传输的安全性。现如今,随着智能设备的发展,加密解密也已不仅仅是一行行的代码,为了减少操作步骤及泄密事件的发生,避免重复操作带来的错误,达到高效、快捷、安全的目的,越来越多的加密解密方式变成了通过窗口实现明密文转换的方式。本文使用Python实现代替密码破译,通过PythOn设计一个可视化窗口程序,输入一段密文,利用这个窗口程序得到明文,然后通过反向操作,破译密文并发现问题,改进问题,从而达到保密效
7、果。1.2 PythOn语言1.2.1 PythOn语言简介Python是一种面向对象的解释型计算机程序设计语言,由荷兰人GUidOvanRossum于1989年发明。Python是纯粹的自由软件,源代码和解释器CPython遵循GPL(GNUGeneralPublicLiCenSe)协议。Python语法简洁清晰,特色之一是强制用空白符(WhiteSPaCe)作为语句缩进。同时PythOn具有丰富和强大的库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C+)很轻松地联结在一起。常见的一种应用情形是,使用PythOn快速生成程序的原型(有时甚至是程序的最终界面),然后对其中
8、有特别要求的部分,用更合适的语言改写,比如3D游戏中的图形渲染模块,性能要求特别高,就可以用C/C+重写,而后封装为PythOn可以调用的扩展类库。需要注意的是在您使用扩展类库时可能需要考虑平台问题,某些可能不提供跨平台的实现。1.2.2 Python语言的优势Python语言是一种功能强大的具有解释性、交互性和面向对象的第四代计算机编程语言,用Python语言代替密码破译,其优点主要有以下几点:1.简单:PythOn的语法非常优雅,甚至没有像其他语言的大括号,分号等特殊符号,代表了一种极简主义的设计思想。阅读Python程序像是在读英语。2 .易学:Python入手非常快,学习曲线非常低,可
9、以直接通过命令行交互环境来学习Python编程。3 .免费/开源:Python的所有内容都是免费开源的,这意味着你不需要花一分钱就可以免费使用PythOrb并且你可以自由地发布这个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。4 .自动内存管理:如果你了解C语言、C+语言你就会知道内存管理给你带来很大麻烦,程序非常容易出现内存方面的漏洞。但是在Python中内存管理是自动完成的,你可以专注于程序本身。5 .可以移植:由于Python是开源的,它己经被移植到了大多数平台下面,例如:Windows、MacOSLinux、Andorid、iOS等等。6 .解释性:大多数计算
10、机编程语言都是编译型的,在运行之前需要将源码编译为操作系统可以执行的二进制格式(0110格式的),这样大型项目编译过程非常消耗时间,而Python语言写的程序不需要编译成二进制代码。你可以直接从源代码运行程序。在计算机内部,Python解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行。7 .面向对象:PythOn既支持面向过程,又支持面向对象,这样编程就更加灵活。8 .可扩展:Python除了使用Python本身编写外,还可以混合使用像C语言、JaVa语言等编写。9 .丰富的第三方库:PythOn具有本身有丰富而且强大的库,而且由于Python的开源特性,第
11、三方库也非常多,例如:在Web开发、爬虫、科学计算等等。第2章加密解密基本算法及原理2.1 密码体制的分类密码体制也叫密码系统,是指能完整地解决信息安全中的机密性、数据完整性、认证、身份识别、可控性及不可抵赖性等问题中的一个或几个的一个系统。对一个密码体制的正确描述,需要用数学方法清楚地描述其中的各种对象、参数、解决问题所使用的算法等。通常,数据的加密和解密过程是通过密码体制+密钥来控制的。密码体制必须易于使用,特别是应当可以在微型计算机使用。密码体制的安全性依赖于密钥的安全性,现代密码学不追求加密算法的保密性,而是追求加密算法的完备,即:使攻击者在不知道密钥的情况下,没有办法从算法找到突破口
12、。通常的密码体制采用移位法、代替法和代数方法来进行加密和解密的变换,可以采用一种或几种方法结合的方式作为数据变换的基本模式。密码体制是由加密解密共同组成的信息保密机制,分为对称密码体制和非对称密码体制两类。2.1.1 对称密码体制对称密码体制是一种传统密码体制,也称为私钥密码体制。在对称加密系统中,加密和解密采用相同的密钥。因为加解密密钥相同,需要通信的双方必须选择和保存他们共同的密钥,各方必须信任对方不会将密钥泄密出去,这样就可以实现数据的机密性和完整性。对于具有n个用户的网络,需要n(n-1)/2个密钥,在用户群不是很大的情况下,对称加密系统是有效的。但是对于大型网络,当用户群很大,分布很
13、广时,密钥的分配和保存就成了问题。比较典型的算法有DES(DataEncryptionStandard数据加密标准)算法及其变形TripleDES(三重DES),GDES(广义DES);欧洲的IDEA;日本的FEALN、RC5等。DES标准由美国国家标准局提此主要应用于银行业的电子资金转帐(EFT)领域。DES的密钥长度为56bitoTripleDES使用两个独立的56bit密钥对交换的信息进行3次加密,从而使其有效长度达到112bit.RC2和RC4方法是RSA数据安全公司的对称加密专利算法,它们采用可变密钥长度的算法。通过规定不同的密钥长度,C2和RC4能够提高或降低安全的程度。对称密码算
14、法的优点是计算开销小,加密速度快,是目前用于信息加密的主要算法。它的局限性在于它存在着通信的贸易双方之间确保密钥安全交换的问题。此外,某一贸易方有几个贸易关系,他就要维护几个专用密钥。它也没法鉴别贸易发起方或贸易最终方,因为贸易的双方的密钥相同。另外,由于对称加密系统仅能用于对数据进行加解密处理,提供数据的机密性,不能用于数字签名。对称密码体制是加密的密钥和解密密钥用同一个密钥的体制,用公式表达就是:加密过程:C=E(M、K)解密过程:M=D(C、K)其中字母的依次是:M为明文、K为密钥、E为机制或算法、C为密文。2.1.2 非对称密码体制非对称密码体制也叫公钥加密技术,该技术就是针对私钥密码
15、体制的缺陷被提出来的。在公钥加密系统中,加密和解密是相对独立的,加密和解密会使用两把不同的密钥,加密密钥(公开密钥)向公众公开,谁都可以使用,解密密钥(秘密密钥)只有解密人自己知道,非法使用者根据公开的加密密钥无法推算出解密密钥,顾其可称为公钥密码体制。如果一个人选择并公布了他的公钥,另外任何人都可以用这一公钥来加密传送给那个人的消息。私钥是秘密保存的,只有私钥的所有者才能利用私钥对密文进行解密。公钥密码体制的算法中最著名的代表是RSA系统,此外还有:背包密码、MCEIieCC密码、DiffeHeIIman、Rabin、零知识证明、椭圆曲线、EIGamal算法等。公钥密钥的密钥管理比较简单,并
16、且可以方便的实现数字签名和验证。但算法复杂,加密数据的速率较低。公钥加密系统不存在对称加密系统中密钥的分配和保存问题,对于具有n个用户的网络,仅需要2n个密钥。公钥加密系统除了用于数据加密外,还可用于数字签名。公钥加密系统可提供以下功能:A、机密性(COnfieIentiality):保证非授权人员不能非法获取信息,通过数据加密来实现;B、确认(AUthentiCatiOn):保证对方属于所声称的实体,通过数字签名来实现;C、数据完整性(Dataintegrity):保证信息内容不被篡改,入侵者不可能用假消息代替合法消息,通过数字签名来实现;D、不可抵赖性(NonrCPUdiation):发送
17、者不可能事后否认他发送过消息,消息的接受者可以向中立的第三方证实所指的发送者确实发出了消息,通过数字签名来实现。可见公钥加密系统满足信息安全的所有主要目标。非对称密码体制是加密和解密密钥用的不是同一个密钥的体制。当中需要两个密钥,称为公钥和私钥,两者依次对应,并且无法互相推出。在实践使用当中,根据需要,两个密钥分别用来加密和解密。非对称密码体制中,主要的加密方法是公钥密码体制(PUbliCKeyInstructure)简称PKI,PKI算法成为当前信息加密技术的主流,而PKI的基础就是RSA算法。2.2 DES算法详细原理介绍2.2.1 DES算法概述DES算法为密码体制中的对称密码体制,又被
18、称为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法,之后在产业中尤其是金融业中得到大力推广和使用。明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。DES算法是分组密码的经典代表,也是第一个公开的算法标准。DES算法具有极高安全性,到目前为止,除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法。而56位长的密钥的穷举空间为2.56,这意味着如果一台计算机的速度是每一秒钟检测一百万个密钥,
19、则它搜索完全部密钥就需要将近2285年的时间,可见,这是难以实现的。然而,这并不等于说DES是不可破解的。而实际上,随着硬件技术和Internet的发展,其破解的可能性越来越大,而且,所需要的时间越来越少。使用经过特殊设计的硬件并行处理要几个小时。2.2.2 DES算法设计思想和准则DES算法根源上来说是一种将置换、代换、移位多种密码技术综合运用的乘积密码。采用FeiSteI网络结构,DES算法以64位(8byte)密钥为分组对数据加密,因为加密和解密过程算法相对应,架构也相同,只是顺序不同,因此使用同一个密钥。以加密过程为例,解密过程原理不再赘述。对于64位明文的加密过程如下:(1)经过初始
20、置换,将明文平均分成左右各32位的两部分。(2)密钥与右半部分结合,再与左半部分结合成为新的右半部分。2.2.3 一开始的右半部分作为新的左部分再进行下一轮的轮换。(4)以上过程组成一轮。这种轮换要重复16次。16轮之后,再进行终结置换。简单来说,DES的加密过程由加密处理、加密变换和子密钥生成几个部分组成。2.3 RSA算法详细原理介绍2.3.1 RSA算法概述RSA公钥加密算法是1977年由罗纳德李维斯特(ROnRivest)、阿迪萨莫尔(AdiShamir)和伦纳德阿德曼(LeonardAdIeman)一起提出的。只有短的RSA钥匙才可能被强力方式解破,目前为止,世界上还没有任何可靠的攻
21、击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。它功能强大,既能用于数据加密也能用于数字签名。RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。RSA算法的安全性主要仰仗于对一个大数进行分解问题的难解性,因而后文我们对实现RSA算法的参数的选择进行了重点讨论。2.3.2 RSA体制的算法过程RSA密码体制的实现使用了模数n进行分解的运算,这里的n是两个不同的素数(即除了自己和1以外不能被任何数整除的数)p和q的乘积。RSA体制的算法具体过程如下:首先产生密钥,过程如下:(1
22、)随机产生两个长度为K/2位的素数P和Q。(2)计算公钥publicKey=P*Q;(publicKey是K位的长度)。(3)随机产生一个加密密钥2keyE(n)-l,其中GCDkeyE,(n)=l,即keyE和6(n)互质。注意:这是保证解密密钥keyEXkeyDmod(n)=1有解的充要条件,(n)称为n的欧拉函数,函数值为:(n)=(P-I)(Q-I)0(4)求解密密钥keyD=keyE-Imod(n),keyE-I为解密密钥keyD的逆元,这个公式原方程为keyEkeyDmod(n)=lo由此公钥、加密密钥和解密密钥全部产生。接下来,对明文加密或对密文进行解密,具体的公式如下:(1)加
23、密:C=MkeyEmodpublicKey;其中M表示明文,C表示密文。(2)解密:M=CkeyDmodpublicKey;其中M表示明文,C表示密文。2.4 其他加密解密算法较为常用的其他加密解密算法为base64编码。它是我们程序开发中经常使用到的编码方法,DES算法的实现也离不开它。标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“犷号在存入数据库时还需要再进行转换,因为ANSlSQL中已将“”号用作通配符。为解决此问题,可采用一种用于URL的改进Base64编码,它不在末尾填充号,并将标准Base
24、64中的“+”和分别改成了“*”和,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。另有一种用于正则表达式的改进Base64变种,它将“+”和改成了和“-”,因为“+以及前面在IReU中用到的和在正则表达式中都可能具有特殊含义。此外还有一些变种,它们将“+/”改为或(用作编程语言中的标识符名称)或(用于XML中的Nmtoken)甚至(用于XML中的Name)。Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8=4*6=24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转
25、换后的字符串理论上将要比原来的长l3oBASE64用64个可以打印的字符来表示对应的二进制数据,因此通常用作存储、传输一些二进制数据编码方法。第3章模拟Python代替密码破译过程3.1 代替密码破译界面程序(mainwindow)首先,在进行代替密码进行加密、解密之前,要为加密、解密者提供一个即使是没有编程基础的普通用户也可以轻松进行加解密操作的可视化界面。可视化编程,亦即可视化程序设:以“所见即所得”的编程思想为原则,力图实现编程工作的可视化,即随时可以看到结果,程序与结果的调整同步。可视化程序设计是一种全新的程序设计方法,它主要是让程序设计人员利用软件本身所提供的各种控件,像搭积木式地构
26、造应用程序的各种界面,可以不用编写或只需编写很少的程序代码,就能完成应用程序的设计,能极大地提高设计人员的工作效率。以下即为可视化代替密码破解界面的代码程序:W-*-coding:utf-8-*-# Formiplementationgeneratedfromreadinguifile,mainwindow,ui,# Createdby:PyQt5UIcodegenerator5.9.2# WARNING!Allchangesmadeinthisfilewillbelost!fromPyQt5importQtCore,QtGui,QtWidgetsclassUi_mainWindow(obje
27、ct):defsetupUi(self,mainWindow):mainindow.setbJectName(zzmainindow)mainVindow.resize(844,619)self.CentralWidget=QtVidgets.QWidget(mainWindow)self.CentralWidget.SetObjectName(,centralWidgetzz)self.tabWidget=QtWidgets.QTabWidget(self.CentralVidget)self.tabWidget.SetGeometry(QtCore.QRect(O,O,841,571)se
28、lf.tabWidget.SetObjeCtName(tabWidget)self.tab_VedioShow=QtVidgets.QVidgetO“self.tab_VedioShow.SetObjectName(z,tab-VedioShow,z)self.label_2=QtWidgets.QLabel(self.tab_VedioShow)self.label_2.SetGeometry(QtCore.QRect(420,10,54,12)self.label_2.SetobjeCtName(label_2)self.label=QtVidgets.QLabel(self.tab_Ve
29、dioShow)self,label.SetGeometry(QtCore.QRect(10,10,54,12)self,label,setbjectName(z,label,)self.PushButtonCracked=QtWidgets.QPushButton(self.tab_VedioShow)self.PushButtonCracked.SetGeometry(QtCore.QRect(10,370力75,23)self.pushBu11onCracked.setbjectName(zzpushButtonCrackedz,)self.PushButtonEncryption=Qt
30、Vidgets.QPushButton(self.tab_VedioShow)self.PushButtonEncryption.SetGeometry(QtCore.QRect(420,370,75,23)self.pushBu11onEncryption.SetObjeetName(pushButtOnEnCryPtion)self.textEditCiphertext=QtVidgets.QTextEdit(self.tab_VedioShow)self.textEditCiphertext.SetGeometry(QtCore.QRect(10,30,400,330)self.text
31、EditCiphertext.SetObjectNaine(z,textEditCiphertextz7)self.textEditCleartext=QtWidgets.QTextEdit(self.tab_VedioShow)self.textEditCleartext.SetGeometry(QtCore.QRect(420,30,400,330)self.textEditCleartext.SetObjectName(,textEditCleartext,z)self.groupBox=QtWidgets.QGroupBox(self.tab_VedioShow)self.groupB
32、ox.SetGeometry(QtCore.QRect(10,400,391,111)self.groupBox.SetTitle()self.groupBox.SetobjeCtNalne(groupBox)self.label_3=QtVidgets.QLabel(self.groupBox)self,label_3.SetGeometry(QtCore.QRect(O,30,71,16)self.label_3.SetObjectName(,zlabel_3,z)self.IineEditSetPwd=QtWidgets.QLineEdit(self.groupBox)self.Iine
33、EditSetPwd.SetGeometry(QtCore.QRect(80,30,191,20)self.IineEditSetPwd.SetObjeCtName(IineEditSetPwd)self.label_4=QtWidgets.QLabel(self.groupBox)self.label_4.SetGeometry(QtCore.QRect(O,60,71,16)self.label_4.setbjectName(,zlabel_4,z)self.IineEditGeneratePwd=QtVidgets.QLineEdit(self.groupBox)self.IineEdi
34、tGeneratePwd.SetGeometry(QtCore.QRect(80,60,191,20)self.1ineEditGeneratePwd.SetTeXt(”)self.IineEditGeneratePwd.setbjectName(“1ineEditGeneratePwd)self.pushButtonGeneratePwd=QtVidgets.QPushButton(self.tab_VediShow)self.PushButtonGeneratePwd.SetGeometry(QtCore.QRect(290,430,91,23)self.pushButtonGenerat
35、ePwd.SetObjectName(,pushBu11onGeneratePwd,z)self.PushButtonClearHackMessage=QtWidgets.QPushButton(self.tab_VedioShow)self.PushButtonClearHackMessage.SetGeometry(QtCore.QRect(100,370,75,23)self.PushButtonClearHaCkMessage.SetObjectName(z,pushButtonClearHackMessagez,)self.PushButtonClearMessage=QtVidge
36、ts.QPushButton(self.tab_VedioShow)self.PushButtonClearMessage.SetGeometry(QtCore.QRect(520,370,75,23)self.PushButtonClearMessage.setbjectName(,/pushButtonClearMessage,/)self.tabVidget.addTab(self.tab_VedioShow,)self.tab_2=QtVidgets.QVidget()self.tab_2.SetObjectName(,ztab-2,z)self.tabVidget.addTab(se
37、lf.tab_2,)mainWindow.SetCentralWidget(self.CentralVidget)self.menuBar=QtWidgets.QMenuBar(mainVindow)self.menuBar.SetGeometry(QtCore.QRect(O,O,844,23)self.menuBar.SetobjeCtNalne(menuBar)mainindow.SetMenuBar(seif.menuBar)self.IuainToolBar=QtVidgets.QToolBar(mainVindow)self.mainToolBar.SetObjectName(,m
38、ainToolBar/z)mainindow.addToolBar(QtCore.Qt.TopToolBarArea,self.mainToolBar)self.StatusBar=QtVidgets.QStatusBar(mainWindow)self.StatusBar.SetObjectName(,y三tatusBarzz)mainindow.SetStatusBar(seif.StatusBar)self.TetranslateUi(mainindow)self.tabidget.SetCurrentIndex(0)QtCore.QMetaObject.connectS1otsByNa
39、me(mainWindow)defretranslateUi(self,mainindow):_transiate=QtCore.QCoreApplication,translateInainWindow.SetVindowTitle(_translate(,zmainWind。w”,“代替密码破译VLO)self.Iabel_2.SetTRXtJtranslateCmainWindQw,,文”)self,label.setText(_transiate(,nainindow,z,“窜文”)self.pushButtonCracked.SetTeXtJtranslateCmainWindow,
40、“破解)self.pushButtonEncryption.setText(_transiate(,zmainWindow,z,“力口帝)self.label_3.setText(,.translate(zzmainindowz,“原蛉的密匙:)self.IineEditSetPwd.setText(_trans1ate(,zmainWindowzz,1FWOAYUISVKMNXPBDCRJTQEGHZ)self.label_4.setText(_transiate(/zntainWindow,/,“破解时密匙:“)self.pushButtonGeneratePwd.setText(_tra
41、nslate(z,mainindowz,“产生随机密匙“)-.“八一self.PushButtonClearHaCkMessage.setText(_trans1ate(,zmai11indow,z,“清空密文).“、tfself.PushButtonClearMessage.setTextCtranslate(/,mainWindow,/,“清空明文”)self.tabidget.SetTabText(self.tabidget.indexf(self.tab_VediShow),_transiate(,mainindow,”代替密码破译界面”)self.tabWidget.SetTabTe
42、xt(self.tabWidget.indexf(self.tab_2),_translate(mainWindow,其福)3.2计算密码字典程序(makeWordPatterns)由于网络用户通常采用某些英文单词或者自己姓名的缩写作为密码,所以就先建立一个包含巨量英语词汇和短语、短句的可能的密码词汇字典(也称字典档),然后使用破解软件去一一尝试,如此循环往复,直到找出正确的密码,或者将密码词汇字典里的所有单词试完一遍为止。这种破解密码方法即为密码字典破解法,其效率远高于穷举法,而密码字典是配合密码破译软件所使用的。密码字典的生成方法主要对密码赋予概率值,当需要生成密码时,优先选择概率值大的密
43、码,当前研究主要集中在Markov模型和基于概率上下文的密码模型,这两种方法都在已有密码字典基础上,用统计学的方法分析密码出现的频率,并计算对应的密码概率值,然后建立模型,并在模型基础上生成新的密码。有学者认为人类使用密码是容易被记忆的,而且密码与不同地域不同国家的本土语言有关联,他们利用马尔科夫(MarkOV)模型选择出现概率大的字符组合作为候选密码,并结合有限状态自动机减少搜索空间,并去掉概率小的密码组合。该方法缺少考虑有限自动机限定之外的大概率字符组合。他们在破解中采用基于彩虹表的时间空间权衡技术进行预处理,实现在字典中快速找到密码,但这不是标准的字典攻击,在实验中对142哈希密码进行测
44、试,成功破解出96个(67.6%),但没有对更复杂的密码进行测试,而且142个哈希密码数据量太小,不具有代表性。某些学者在按照字符类别,如大写字母,小写字母、数字等,在原有密码字典基础上,找出出现次数高的字符类别组合,然后根据概率上下文无关文法的生成式规则填充字符,重新生成新的密码。该方法有效利用字符组合类型的结构,但没有对如何有效划分字符类别进行说明,而且该方法不适合生成较小的密码字典。另外有些学者对概率密码模型的两种方法做了评价,对Markov模型和概率上下文文法的模型做比较,认为前者破解效果更明显。他们把密码模型划分为两类:全串模型(Whole-stringmodels)和基于模板的模型
45、(template-basemodels),全串模型就是把考虑整个字符串,整个密码,而基于模板的模型则是将字符串划分为多块,然后分别考虑每块的情形。他们认为当前并没有更好地利用Markov模型,主要表现在以下三个方面:第一:现在只使用非常简单的Markov模型。在统计学中,已经有很多技术改进Markov模型,而这些并没有应用到密码模型中;第二:密码和统计语言模型不相同,大部分密码长度在612之间,而在语音识别过程中,句子的长度都比较相似;第三:不同密码模型方法还没有进行系统的互相比较。还有一些人通过分析常用的密码字典,标识密码出现的频率和相关的概率,提出训练集、密码集和测试集的TDT模型,该模
46、型能够产生概率递减的密码,仿真结果表明测试比破解工具JohntheRiPPer多1.43到2.5倍的破解率。因此我们需要选择合适的方式编写字典生成程序,从而使其按照程序要求快速生成很大数据量的明文,来创建适合自己解密的密码字典,提供给解密软件解密用。以下为此次解密测试的密码字典生成程序:#!usrbinenv python-*- coding: utf-8 -*-Time Author Site File Softwarei5)ort pprint2018/3/4 12:03 CycloneBoy 部算箪词模式 makeWOrdPatterns. py PyCharm#获取单词的模式defge
47、tWordPattern(word):#Returnsastringofthepatternfromofthegivenword,word=word,upper()neXtNum=0IetterNums=0WordPattern=forletterinword:ifletternotinIetterNums:IetterNumsEletter=str(nextNun)neXtNum+=1WordPattern.append(1etterNumsletter)returnjoin(wordPa11ern)#maindefmain():allPatterns=Ofo=open(,dictionary,txt)WordList=fo.read().split(,n)fo.closeOforwordinWordList:#GetthepatternforeachstringinWordListpattern=getWOrdPattern(word)ifpatternnotinallPatterns:allPatternspattern=wordelse:allPatternspattern,append(word)# Thisiscodethatwritescode.TheInakeWordPatterns.pyfilecontains这是编号代码的代码。InakeWOr