密码学 论文 密码学论文优秀7篇

密码学论文优秀7篇

本科类院校密码学实践课程教学研究论文 篇一

针对密码学课程的现状,以及出现此状况的原因进行了深入的研究与分析后,在此基础上,本文针对本校计算机科学与技术专业开设的密码学课程进行了一系列的改革,取得了一定的成效。其改革的内容主要为:

1)密码学的核心教学内容由密码算法组成,对这些密码学算法的理解和分析是课堂教学的重点。因此,为了实现使学生对各类算法本质的深入理解,要求学生用自己熟悉的高级程序设计语言编程实现经典密码学算法,关键部分的程序代码,可布置作业,让学生编程实现。网络上有很多经典密码学算法的代码资源,在讲解算法的过程中,可以提醒学生注意对这些资源的理解和借鉴。

2)组织课题组或兴趣小组,吸引更多的学生参加,最大化激发学生的兴趣,并大力支持学生创新活动。选择优秀本科生进入课题组,是研究型大学培养学生的一种重要方式。同时要求教师在授课过程中,将前沿技术问题适时加入到授课内容之中,鼓励学生进行创新思维,并为其提供必要的经费、实验环境,如建立创新实验室、实训大本营等。

3)结合课程内容,由学生参加制作密码算法教学演示系统,并可延伸到毕业设计。在编写完成密码算法后,利用演示系统分步实现密码算法的过程,使学生更深入、更细致地理解和掌握密码算法的实质。

4总结

信息安全作为一门新兴专业,信息安全类课程的基础理论体系仍不完善,目前还没有与密码学相适应的课时适中,内容合理的标准化实验教材。因此下一步工作意在开展标准化实验教材的编写工作,以配合理论教学。另外课程网络资源的建设与更新,积极鼓励学校与企业开展项目合作,加强与国内外的高校、研究机构的交流,也是值得努力的方向。

与英语 关的两个密码学小知识 篇二

首先说说字母概率。我们随便找一个英语单词,比如cat,将每个字母向后移动一位,cat变成dbu,将每个字母向后移动两位,cat变成ecv,等等,这就是一种最原始、最简单的加密方法,19世纪以前曾在欧洲广泛使用。对于这种加密电文,我们只要知道英语字母的概率(probability),就可以很容易地破译出来。什么是字母概率呢?您可以找一篇英文文章,仔细观察一下,就会发现,字母e出现的次数最多,大多数单词中都包含它,因而我们说字母e的概率最高,与此相反,字母q出现的次数最少,只有少数单词中包含它,因而我们说字母q的概率最低。下面是英语字母的概率表,概率值由高到低排列。

e(57) a(43) r(39) i(38) o(37) t(35) n(34) s(29) l(28) c(23) u(19) d(17) p(16) m(15) h(15) g(13) b(11) f(9) y(9) w(7) k(6) v(5) x(1) z(1) j(1) q(1)

有了这个字母概率表,我们可以看看加密电文中,哪个字母出现的次数最多,假如h出现的次数最多,那我们可以断定h就是e,原文的每个字母都向后移动了三位(e-f-g-h),我们只要将每个字母向前移动三位,即可看到明文。

下面再说说单词概率。如果我们不采用上面这种字母移位的加密方法,而是用胡编乱造的单词,代替真正的英语单词,比如用tnqkv代替the,用hxdsj代替and,等等,这也是一种19世纪以前欧洲常用的加密方法。对于这种加密电文,我们必须知道英语单词的概率,也就是在一般性的英语文章中,哪些单词出现的次数最多。下面是英语常用单词的概率表,概率值由高到低排列。

the – of – and – a – to – in – is – that – it – was – he – for – as – on – with – his – be – at – you – i – are – this – by – from – had – have – they – not – or – one

有了这个单词概率表,我们可以看看加密电文中,哪个(胡编乱造的)单词出现的次数最多,假如tnqkv出现的次数最多,那我们可以断定tnqkv就是the。利用这种方法,可以将加密电文中最常用的冠词、介词、连词、代词、动词等破译出来,但破译整篇加密电文还不可能,需要配合其它方法。

当然,这里介绍的只是最基础的密码学知识,现在已经很少有这样简单的加密电文了,但这些基础知识,是我们掌握高级知识的基础,所以我希望这个帖子能够引起您的兴趣。

离散数学的代数系统理论在密码学中的应用论文 篇三

离散数学的代数系统理论在密码学中的应用论文

【摘要】本文分析了离散数学中的代数系统理论与密码学课程之间的关系,阐述了离散数学在密码学领域的实际应用。

【关键词】离散数学;密码学;教学

一、引言

离散数学是计算机专业的基础课,为计算机专业的后续课程提供专业的数学理论基础。该课程可以全方位培养学生的抽象思维能力和解决实际问题的能力,为学生学习其它专业课程建立数学的思想。

该课程包括数理逻辑、集合论、代数系统、图论四个大部分。每个部分与数据结构,数据库,人工智能,数字逻辑,编译原理等课程都密切相关。

本文我们将阐述离散数学中的代数系统理论部分与密码学的相关性,并且分析该理论在密码学领域的若干应用。

二、代数系统理论与密码学的相关性及在密码学的应用

离散数学中的代数系统理论包括代数系统的一些基本概念、半群与独异点、群、环与域、格与布尔代数。代数系统与密码学联系非常紧密,为密码学提供非常重要的数学基础。现将代数系统理论在密码学中的若干应用列举如下:

密码学中,凯撒密码是一种最简单且最广为人知的加密技术,是一种简单的基于替换原理的加密技术。凯撒密码将明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文,其中固定数目的偏移量为加解密密钥。例如当偏移量为3,字母A将被替换成D,B变成E,其它的字母按此规则类推。在代数系统理论中群是一种典型的代数系统,具有封闭性、可结合性、含单位元以及每个元素都有逆元等性质。从本质上来说凯撒密码就是一个特殊的群,是建立在26个字母之上,字母与密钥进行运算的剩余模群。通过对于群理论的学习可以帮助学生更好的理解凯撒密码的本质。

在密码学中有一个重要的公钥加密算法的RSA,该算法是目前最安全的公钥加密算法,可以抵抗目前已知的绝大多数密码攻击。数论中的费马小定理为RSA提供数学上的安全性保证。通过对于费马小定理的原理和正确性的理解可以更好的理解RSA算法的安全性,在实际中更好地使用RSA算法。

在密码学中的椭圆曲线密码是基于椭圆曲线的一种公钥密码算法,该密码安全性基于椭圆曲线离散对数的困难性上,是一个有限域上椭圆曲线的`阿贝尔群。对于在代数系统理论中群和域的概念以及性质进行认真学习和理解可以用于椭圆曲线密码的学习。

三、离散数学在计算机其他学科中的应用

离散数学在计算机研究中的作用越来越大,计算机科学中普遍采用离散数学中的一些基本概念、基本思想、基本方法,使得计算机科学越趋完善与成熟。离散数学在计算机科学和技术中有着广泛应用,除了在上述提到的领域中发挥了重要作用外,在其他领域也有着重要的应用,如离散数学中的数理逻辑部分在计算机硬件设计中的应用尤为突出,数字逻辑作为计算机科学的一个重要理论,在很大程度上起源于离散数学的数理逻辑中的命题与逻辑演算。利用命题中各关联词的运算规律把由高低电平表示的各信号之间的运算与二进制数之间的运算联系起来,使得我们可以用数学的方法来解决电路设计问题,使得整个设计过程变得更加直观,更加系统化。集合论在计算机科学中也有广泛的应用,它为数据结构和算法分析奠定了数学基础,也为许多问题从算法角度如何加以解决提供了进行抽象和描述的一些重要方法,在软件工程和数据库中也会用到。代数结构是关于运算或计算规则的学问,在计算机科学中,代数方法被广泛应用于许多分支学科,如可计算性与计算复杂性、形式语言与自动机、密码学、网络与通信理论、程序理论和形式语义学等,格与布尔代数理论成为电子计算机硬件设计和通讯系统设计中的重要工具,图论对开关理论与逻辑设计、计算机制图、操作系统、程序设计语言的编译系统以及信息的组织与检索起重要作用,其平面图、树的研究对集成电路的布线、网络线路的铺设、网絡信息流量的分析等的实用价值显而易见。

四、结束语

通过上面的分析,我们可以发现离散数学中的代数系统理论在密码学领域的作用非常重要,离散数学不仅是计算机技术迅猛发展的支撑学科,更是提高学生逻辑思维能力、创造性思维能力以及形式化表述能力的动力源,离散数学课程所传授的思想和方法,广泛地体现在计算机科学技术及相关专业的诸领域,从科学计算到信息处理,从理论计算机科学到计算机应用技术,从计算机软件到计算机硬件,从人工智能到分布式系统,无不与离散数学密切相关。在现代计算机科学中,如果不了解离散数学的基本内容,则在计算机科学中就寸步难行了。

参考文献

[1]任勋益。离散数学与计算机安全结合改进教学[J].软件导刊,(12)

[2]刘宏月,张行进等。面向信息安全学科的离散数学教学探究[J].计算机教育,(15):23-26

[3]屈婉玲,耿素云等。离散数学[M].北京:高等教育出版社,

[4]丁宝康主编。数据库原理[M].经济科学出版社,

[5]冯登国,裴定一编著。密码学导引[M].科学出版社,

[6]魏献祝主编。高等代数[M].华东师范大学出版社,

[7]华东师范大学数学系编。概率论与数理统计教程[M].高等教育出版社,1983

本科类院校密码学实践课程教学研究论文 篇四

摘要:密码学是信息科学类信息安全及其相关专业的一门十分重要的专业基础课。该文以本科类院校的密码学课程教学为背景,就密码学课程在实践教学中存在的若干问题,进行深入研究与分析,并提出了对应的解决方案,在提升学生的专业学习兴趣和改善实践类课程的教学效果方面,提供了一定的参考。

关键词:密码学;实践课程;教学改革;演示系统

1引言

信息安全是近年来发展起来的一门新兴学科,它与计算机科学与技术、通信工程、信息计算等学科相融,是一门综合性要求较高的学科。密码学不管是作为信息安全专业的专业基础课程,还是计算机科学与技术专业的重要选修课程,都有着十分重要的学科地位。随着计算机网络的普及,密码学的应用也日益广泛,从研究领域扩展到了电子政务、电子商务等应用领域。因此,除需在本科院校的计算机、通信等相关专业开设密码学的理论教学以外,开展其相应的实践课程教学更是十分必要。

信息安全专业中密码学课程的教学研究论文 篇五

信息安全专业中密码学课程的教学研究论文

摘要:密码学作为一门数学、计算机科学与通信的交叉学科,是信息安全专业的核心课程,也是数学在信息科学中的重要应用。该文从密码学的特点出发,对密码学课程目前所存在的问题进行分析,并从教材选择、理论教学和实验教学的角度给出自己的几点建议。

关键词:密码学;信息安全;理论教学;实验教学;教学方法

中图分类号:G642.3文献标识码:A文章编号:1009-304426-0138-02

随着计算机网络的广泛应用和深入发展,电子商务和电子政务以及网络银行和各种移动支付已经成为人们生活的一部分。在方便人们生活的同时,也带来越来越多的信息安全问题。因此,信息安全受到社会各界的高度重视,已成为信息社会急需解决的问题。密码技术作为信息安全的核心技术,获得越来越多的关注。密码学已成为各类高校信息安全专业的核心课程。目前,我国有80多所高校开设信息安全专业,100多所高校开设密码学课程[1]。由于密码学是一门集数学,计算机科学与通信科学等于一身的交叉学科,不同专业、不同学科,在教材的选择、教学内容以及教学方法等诸多方面的认识很难统一,给密码学课程的教学造成诸多困难,同时也是密码学课程教学中值得关注和探讨的问题。

1密码学课程的特点

1)密码学所涉及的知识面广,数学基础要求高。密码学课程前期需要学习信息论、计算复杂度和一些数学知识[2]。其中数学除高等数学和线性代数以外,还包括数论、抽象代数、代数编码、概率论、有限域等相关内容,这些数学知识的难度也相对较大。

2)理论教学和实验教学的侧重点难以把握。由于密码学是一门交叉学科,对于不同专业的学生,学习的侧重点也是不一样的。例如数学科学学院应用数学专业的学生,大多数侧重理论教学,主要讲授密码算法的理论计算,对数学基础要求比较高。而对于计算机学院信息安全专业的学生,又是以实验教学为主,对编程语言和计算复杂度要求较高。

3)密码学课程本身所涉及的内容较多,学习难度大。密码学的主要内容包括古典密码、对称密码、公钥密码、哈希函数、数字签名、密钥管理、密码协议等。古典密码与对称密码要求学生对置换、代换、有限域方面要深入理解与掌握;公钥密码、数字签名对数论、概率论方面要求又比较高。对于其他的内容,主要是一些密码应用等,则要求灵活使用公钥密码、数字签名、哈希函数等。

4)密码学知识更新速度快。自从1978年麻省理工学院的Rivest、Shamir和Adleman三人提出RSA公钥密码算法以来,密码学家又提出Rabin、Elgamal、ECC、NTRU等经典的公钥密码体制。近年来,由于其他学科的进步与发展,又出现一些新的密码技术,如量子密码、混沌密码、DNA密码等。

2密码学课程所存在的问题以及解决方法

2.1教材选择

密码学教材种类繁多,而作者编写教材的侧重点也不相同,有的侧重于密码算法的介绍,有的侧重于密码技术的应用。不同学科专业学生的基础不同,在选择教材方面也有所差异,并且前置基础课程与培养目标也存在差异,所以选择教材的时候要充分考虑前置课程的安排和培养目标的设置。对于理科专业,如数学专业,应该选用理论性较强的教材,而对于工科专业,如通信专业,信息安全专业,应该选择实践性较强的教材。

2.2理论教学

目前大多数高校的密码学教学是以理论讲授为主,配合多媒体演示。理论教学是密码教学的主要手段。而密码学是一门交叉性很强的学科,课程所涉及的内容很多,各个知识点之间既相互独立又联系紧密。面对信息安全专业密码学课程这些特点,如何转变教学理念、创新教学思路、找准教学放方法,是密码学课程理论教学关键。

2.2.1教学理念

密码学课程内容多,算法的逻辑推理性强,学生难以掌握所有的算法。密码学课程的教学理念不应该是让学生记住密码算法,而是培养学生正确的密码学思维方式,使学生理解密码学的设计思想。如:分组密码算法的设计思路是使用置换密码与代换密码的组合,利用迭代的方式产生,在设计的过程中要满足混淆与扩散原则;公钥密码体制的设计则是按照形式化的定义、精确的安全假设与严格的安全性证明三个原则来设计。为实现这个教学目标,需要在各章节详细介绍少量经典的密码算法,使学生了解每一步算法的来龙去脉与密码学家设计密码算法的思路,这就要求老师对密码学所涉及的内容融会贯通,并且深刻理解密码学的设计思路与精髓。

2.2.2教学思路

对于主流的密码学教材,主要内容一般包括古典密码、对称密码、公钥密码、哈希函数、数字签名、密钥管理、密码协议等[3]。这些内容表面上看起来是松散的,实际上是紧密相连的要使学生能够清晰地理解并掌握这些内容,首先要有明确的教学思路。密码技术是信息安全的核心技术,能够实现消息的保密性、完整性、认证性、不可否认性等安全属性,这些安全属性是整个密码学知识体系发展的出发点和归宿。可以按照这个思路建立密码学知识结构的基本框架模型,然后进行讲授。

2.2.3教学方法

传统的教学方式是老师在讲台上讲,学生在下面听、记笔记。这种方式只能让学生记住所讲授的密码算法,而无法使学生理解密码学的思想。对于不同的教学内容应该采用不同的教学方法,如互动启发式、小组讨论式等方法,这些方法可以让学生主动参与到教学活动中[4]。还要留给学生充分的思考空间和时间,让学生在思考的过程中形成主动探索、分析问题和寻求解决问题方法的习惯。

1)互动启发式教学。互动教学方法是大多数课程所讨论并采用的教学方法,可以让学生参与到问题的解决过程中。孔子曰:不愤不启,不悱不发,强调的就是学习的启发式教学。启发式教学的’关键是调动学生的学习积极性,激发学生的学习兴趣。很好地运用互动启发式教学方法,可以培养学生分析问题、解决问题的能力,通过经历问题的解决过程,激发学生的自主学习热情,提高学习兴趣。例如,在讲授序列密码时,讲到序列密码的安全性是由種子密钥所产生密钥序列的性质决定的,可以通过互动启发式方法,让学生思考:密钥序列具有何种性质才能保证安全性?是否满足随机性和不可预测性就安全了?密钥序列和种子密钥之间有什么关系?通过解决问题,使学生理解序列密码的设计思想。

2)小组讨论式教学。小组讨论式教学方法可以开拓学生的思维,提高学生的创新能力,使学生尝试从不同的角度与观点来解决问题,而且还可以培养团队合作能力。密码学对学生而言是陌生的,而密码思想更是学生所欠缺的。通过小组讨论,能够使学生从自身角度思考密码算法满足安全性的条件,以及明文、密文与密钥之间的关系,密文统计特性应满足的概率分布等问题。通过小组讨论并不一定能达到完全解决问题的目的,但是这种方法极大的开拓学生的思维,提高学生的创新能力,并且可以使學生深刻理解密码学的设计思想。

2.3实验教学

密码技术是解决信息安全问题的核心技术,密码学的特点决定它是一门实践性很强的课程。实验教学环节能够使学生在理解算法原理的基础上进行程序设计,并根据需要进一步进行综合设计,提高学生的综合应用能力。目前,在密码学课程的实验教学方面,还存在密码实验工具选择不合理与密码实验项目类型不明确的问题。

1)密码实验工具的选择。密码实验工具一般包括密码分析软件、密码实验教学软件、密码设计软件、密码算法的代码库等。在密码实验教学之前要确定密码实验的工具。当前,密码学的实验教学中大都要求学生运用计算机语言实现一些经典的密码算法,而密码学实验教学的目的是加强学生对密码算法的理解,以及掌握密码算法在信息安全中的应用,不是简单地锻炼学生的编程能力,这种做法很难提高学生的综合素质。密码学课程的实验教学应根据实验要求选择密码实验工具,才能体现密码学实验教学的目标。比如对于古典密码算法,这些密码算法已经被破译,对于学生来说只起到一个借鉴的作用,因此可以选择具有验证和分析作用的密码工具。CAP4软件就是一款合适的密码分析软件。对于DES,AES等对称密码算法,其加密流程比较复杂,学生难以理解。这时可以选择具有可视化功能的密码工具,CrypTool的可视化演示功能能够使学生更好的理解加解密运算的每一个流程。对于算法设计,不能只把实验项目给学生之后,让学生去编写代码。应该引导学生使用密码算法库,例如OpenSSL、Miracl、Boten,NTL等[5]。

2)密码实验项目与类型的确定。实验项目类型一般分为演示或验证型、设计或综合型、研究或创新型三个层次。合理安排实验项目类型可以加深对密码算法的理解以及提高创新能力。目前,多数高校的密码学实验项目类型都是简单的验证,老师在教师机演示,学生在学生机重新验证一遍。或者项目类型都是设计型,老师把实验项目发给学生,让学生自己编程。这两种简单的方式都不能很好地提高学生的综合能力。因此,密码学的实验类型要由实验项目来确定。安排密码实验项目时,应该由浅入深,首先安排简单的验证项目,比如古典密码算法,其次安排综合型项目,如RSA的实现等,最后安排研究型项目。研究型项目由老师确定一个具有新颖性和创新性的实验项目范围,由学生根据兴趣自主选题。研究型项目选题可以依托学科竞赛来确定,比如全国大学生信息安全竞赛等。

3结束语

密码技术是信息安全的核心技术,密码学也是信息安全专业的核心课程,研究密码学课程的理论与实验教学有着重要的意义。在信息安全专业密码学理论与实验课程,以及密码学前置课程的多年教学实践的基础上,结合信息安全竞赛的一些经验,针对信息安全专业密码学教学在教材选择、教学理论和实验教学方面存在的问题,从教学理念、教学思路和教学方法三个方面给出教学改进方案,教学实践表明这些改进方案能够取得更好教学效果。

参考文献:

[1] 王后珍,张焕国。 密码学课程建设及教学方法探讨[J]. 高教学刊,(7):79-79.

[2] 丁勇。 信息与计算科学专业密码学教学研究[J].桂林电子科技大学学报,,28(2):131-133.

[3] 李梦东。 《密码学》课程设置与教学方法探究[J].北京电子科技学院学报,,15(3):61-66.

[4] 贾伟峰,杨礼波。 密码学的课程特点及教学方法探讨[J]. 华北水利水电学报:社科版,,26(3):169-170.

[5] 申丽君,王金双,陈融,等。CrypTool在密码学教学中的应用[J]. 计算机工程与科学,,36(A1):208-211.

本科类院校密码学实践课程教学研究论文 篇六

由于密码学课程的教学内容重点是对各种流行的密码算法进行介绍,因此,在教学中,理论上的知识安排较多。由于课程本身内容的综合性,仅仅靠结合课堂的理论教学内容,学生难将理论知识与实际应用进行连接。主要面临的困难有:

1)不知如何用所学理论知识来解决实际问题,并且遇到实际问题时,没有好的解决方案,缺乏指导。

2)受到硬件、软件、环境等因素的制约。

3)对纯理论知识的学习缺乏兴趣。

通过针对密码学教学情况的调查研究,发现学生在学习密码学课程时的积极性普遍不高,对纯理论教学,或者少量的实践教学模式多数持有异议。

分析其现象的主要原因有以下几个方面:

1)教学方式多样性不够。主要是课堂教学讲授,以多媒体演示或者板书为主。而密码学是一门实践性非常强的课程,要对其内容真正理解需要结合实际的应用才行,以往的教学模式无法实现这一点,因此无法得到学生的认同。

2)实践课程安排不合理。在密码学课程的`安排上,有实践课程的安排,也注意了理论课程和实践课程的分配,但是对实践课程的实验安排存在不合理现象。比如对密码算法的选择不合理,除了某些经典算法外,不能适时的安排一些新型的密码算法,内容上无法与时俱进。

3)实验设置的难易程度不合理。在实验课程的安排中,在实验内容的设置上,实现难度较大,在有限的实验时间里,学生无法轻松地,甚至无法完成相应的实验,从而使学生对实验失去信心,继而不愿参与到实验中。

密码学CrackMe之RSA512算法CM分析 篇七

【文章标题】: ‘RSACrackMe512分析过程及汇编注册机源码

【文章作者】: coolstar14

【使用工具】: IDA, BigInterCalc, RDLP

【软件名称】: RSACrackMe512

【软件大小】: 40KB

【下载地址】: attachmentid=7447&d=1187671766

【软件介绍】: 用RSA512作为校验算法的CrackMe,

【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!

——————————————————————————–

详细过程:

IDA反汇编, 字符串参考, 直接定位到关键代码:

.text:00402F18

.text:00402F18 loc_402F18:                            ; CODE XREF: DialogFunc+140j

.text:00402F18                lea    eax, [ebp+dst_buffer]

.text:00402F1E                lea    ecx, [ebp+rsa_n]

.text:00402F24                push   eax            ; dst_buffer

.text:00402F25                push   ecx            ; rsa_n

.text:00402F26                lea    edx, [ebp+input_sn]

.text:00402F2C                push   offset s_10001 ; “10001”

.text:00402F31                push   edx            ; input_sn

.text:00402F32                mov    [ebp+var_4], 0

.text:00402F39                call   sub_402BC0     ;关键函数, 跟进

.text:00402F39

.text:00402F3E                test   eax, eax

.text:00402F40                jnz    short loc_402F68   ; eax不等于0, 跳转到后续判断, 否则就提示失败

.text:00402F40

.text:00402F42                push   40h            ; uType

.text:00402F44                push   offset Caption ; “注册提示”

.text:00402F44

.text:00402F49

.text:00402F49 loc_402F49:                            ; CODE XREF: DialogFunc+1D8j ;注册提示

.text:00402F49                push   offset s_VSIAGm ; “注册码错误,继续加油!”

….

.text:00402F64                mov    esp, ebp

.text:00402F66                pop    ebp

.text:00402F67                retn

.text:00402F67

.text:00402F68 ; —————————————————————————

.text:00402F68

.text:00402F68 loc_402F68:                            ; CODE XREF: DialogFunc+190j

.text:00402F68                lea    eax, [ebp+dst_buffer]

.text:00402F6E                lea    ecx, [ebp+String2]

.text:00402F74                push   eax            ; lpString1

.text:00402F75                push   ecx            ; lpString2

.text:00402F76                call   sub_402CE0     ;比较函数, 可以通过内存查看, eax, ecx分别为解密sn后获得的缓冲区和我们输入的用户名

.text:00402F76

.text:00402F7B                add    esp, 8

.text:00402F7E                cmp    eax, 1

.text:00402F81                push   40h            ; uType

.text:00402F83                push   offset Caption ; “注册提示”

.text:00402F88                jnz    short loc_402F49   ;前面比较函数返回值 eax不等于1跳转到失败, 否则注册成功。

.text:00402F88

.text:00402F8A                push   offset s_ZUgmVSI ; “恭喜你,注册码正确!”

.text:00402F8F                push   esi            ; hWnd

.text:00402F90                call   ds:MessageBoxA

.text:00402F96                xor    eax, eax

函数 402F39, 参数4个, 通过查看内存可以确定, 有一个为我们输入的序列号, 一个为10001的字符串, 它是RSA公钥对中最常用的e , 还有一个长度为128的字符串, 这个很容易就可以怀疑它是RSA公钥对中的n. 另外一个会在下面的比较函数中用它, 它就是结果输出缓冲区了。

函数:sub_402BC0

.text:00402BC0 ; Attributes: bp-based frame

.text:00402BC0

.text:00402BC0 ; int __stdcall sub_402BC0(int input_sn,int rsa_e_10001,int rsa_n,LPSTR dst_buffer)

.text:00402BC0 sub_402BC0     proc near              ; CODE XREF: DialogFunc+189p

.text:00402BC0

.text:00402BC0 String2        = byte ptr -2088h

.text:00402BC0 var_88         = dword ptr -88h

.text:00402BC0 var_big_e      = dword ptr -64h

.text:00402BC0 var_big_n      = dword ptr -44h

.text:00402BC0 var_big_sn     = dword ptr -20h

.text:00402BC0 var_10         = dword ptr -10h

.text:00402BC0 var_C          = dword ptr -0Ch

.text:00402BC0 var_4          = dword ptr -4

.text:00402BC0 input_sn       = dword ptr 8

.text:00402BC0 rsa_e_10001    = dword ptr 0Ch

.text:00402BC0 rsa_n          = dword ptr 10h

.text:00402BC0 dst_buffer     = dword ptr 14h

.text:00402BC0

.text:00402BC0                push   ebp

.text:00402BC1                mov    ebp, esp

.text:00402BC3                push   0FFFFFFFFh

.text:00402BC5                push   offset loc_406973

.text:00402BCA                mov    eax, large fs:0

.text:00402BD0                push   eax

.text:00402BD1                mov    large fs:0, esp

.text:00402BD8                push   ecx

.text:00402BD9                mov    eax, 2078h

.text:00402BDE                call   sub_4034A0

.text:00402BDE

.text:00402BE3                push   ebx

.text:00402BE4                push   esi

.text:00402BE5                push   edi

.text:00402BE6                lea    ecx, [ebp+var_88]

.text:00402BEC                mov    [ebp+var_10], esp

.text:00402BEF                call   sub_402900

.text:00402BEF

.text:00402BF4                xor    ebx, ebx

.text:00402BF6                lea    ecx, [ebp+var_big_sn]

.text:00402BF9                mov    [ebp+var_4], ebx

.text:00402BFC                call   sub_401060

.text:00402BFC

.text:00402C01                mov    eax, [ebp+rsa_e_10001]

.text:00402C04                lea    ecx, [ebp+var_big_e]

.text:00402C07                push   eax

.text:00402C08                mov    byte ptr [ebp+var_4], 2

.text:00402C0C                call   sub_4028F0       ; 大数转换, 只有一个参数为大数的字符串表示。 之前有几个函数调用, 像是初始化之类的东西, 具体没弄明白。

.text:00402C0C

.text:00402C11                mov    ecx, [ebp+rsa_n]

.text:00402C14                push   ecx

.text:00402C15                lea    ecx, [ebp+var_big_n]

.text:00402C18                call   sub_4028F0

.text:00402C18

.text:00402C1D                mov    edx, [ebp+input_sn]

.text:00402C20                lea    ecx, [ebp+var_big_sn]

.text:00402C23                push   edx

.text:00402C24                call   sub_4028F0

.text:00402C24

.text:00402C29                mov    ecx, 800h

.text:00402C2E                xor    eax, eax

.text:00402C30                lea    edi, [ebp+String2]

.text:00402C36                rep stosd

.text:00402C38                lea    eax, [ebp+var_big_sn]

.text:00402C3B                lea    ecx, [ebp+String2]

.text:00402C41                push   eax

.text:00402C42                push   2000h

.text:00402C47                push   ecx

.text:00402C48                lea    ecx, [ebp+var_88]

.text:00402C4E                call   sub_402A40       ;大数转换完, 下一步自然是计算, 这个函数很麻烦, 需要跟进, 验证序列号有一部分在这里面。

.text:00402C4E

.text:00402C53                mov    eax, [ebp+dst_buffer]

.text:00402C56                lea    edx, [ebp+String2]

.text:00402C5C                push   edx            ; lpString2

.text:00402C5D                push   eax            ; lpString1

.text:00402C5E                call   ds:lstrcpyA       ;将结果复制到目的缓冲区, 可以由这儿中断, 然后直接修改内存使eax指向内在为我们输入的用户名, 继续后可以看到, 会提示注册成功, 所以后面调用的函数我们就可以不用关心了。

.text:00402C64                lea    ecx, [ebp+var_big_sn]

……………

.text:00402C96

.text:00402C96 sub_402BC0     endp

IDA有个很实用的功能, 它可以让你修改参数名字, 它会在整个函数体里统一替换, 在自己确定了某个参数和变量的含义后可以修改它为好记的名字, 方便之后的阅读和理解。 上面的函数的参数为我跟踪替换后的样子,比最初版本肯定是要好些的。

回到分析上, 在大数的处理上, 不清楚这个CM用的什么大数库或者为自己写的吧。 上面瓢的大数的参数, 比如说var_big_e, 是个内存地址, 其+4后的地址指向malloc出来存放转换出来大数的地址。

函数:sub_402A40 其中

.text:00402A78

.text:00402A7D                lea    edi, [esi+44h]

.text:00402A80                add    esi, 24h

.text:00402A83                push   edi            ; big_n

.text:00402A84                push   esi            ; big_e_10001

.text:00402A85                lea    ecx, [esp+38h+var_AfterDeBuff]

.text:00402A89                push   ebx            ; big_sn

.text:00402A8A                push   ecx            ; out is powmod=sn^10001 (mod n)

.text:00402A8B                call   sub_402670

通过查看 402670 调用前后各参数地址的变化, 发现只有ecx指向的缓冲区有变化, 使用 BigIntCalc代入各参数计算, 发现ecx的结果恰巧是powmod操作。 由此可以确定第一步, 这个cm是把序列号转为大数, 用公钥解密了的。 那么没有私钥好像是不能继续下去了, 分解512 好像很花时间, 我们采用替换公钥对n的方法继续下面的分析, IDA 查看字符串参数, 找到公钥串所在偏移 4080e0, 相对文件偏移80e0(ida可以在状态栏看到的), Ultraedit打开exe, 直接定位并使用我们自己产生的公钥对中的n替换它。 这样我们就可得到一个知道私钥的修改版本。

重新截入修改后的版本, 在402a8b下断, 使用私钥加密我们输入的用户名, 加密后的结果做为序列号输入, 点击注册, 断下, 单步运行一下, 可以看到ecx指向的大数, 加密前的用户名的逆序。 ecx为指针, 它指向的大数实际地址为其地址+4, 然后再做为地址, 如:

0012d508 14 71 40 00 70 05 8f 00 则其指向的大数实际为8f0570, 查看这个地址, 可以看到调用402670前为我们输入的序列号, 调用后变为了我们输入的用户名的逆序。 本来以为这样应该算是注册了, 结果运行仍然弹出注册失败。 看来并不是简单的用户名私钥加密形成序列号。 继续。

mov    eax, [esp+30h+arg_2000]

lea    edx, [esp+30h+var_AfterDeBuff]

push   2

push   edx            ; addr after powmod

push   eax

push   ecx            ; addr String2

call   sub_402B10

402b10, 它有个参数为我们期望的外层比较函数将要使用的地址, 跟进它。

402b10 调用 4024a0, 这个函数对解密后的数据做了进一步的判断, 如果不符合要求, 就返回一个 负数, 解密出来的内容并不会复制到我们期望的String2的地址中, 这个函数我没分析出来, 后来在密码学CM主帖中看到一个RSA1024有效的注册码, RSA1024那个CM与512这个反汇编后除了公钥n长度不一致外其它倒是一样。 所以看到powmod后的地址的结果, 从而猜测出解密后数据应该的内容继而得出4024a0函数各参数的意义和作用。

4024a0, 它判断了解密后数据的长度, 然后符合长度限制的它复制了指定偏移指定位的数据到目的地址。 其4个参数分别为:

源地址, 目的地址, 偏移位置, 复制字节数。

402b10 3次调用4024a0, 分别做了如下操作, 1复制并检查powmod解密后数据倒数第二个字节为2, 2复制获得powmod解密后数据倒数3,4字节做为有效数据长度xlen, 3以第二步取到长度复制偏移0长度xlen的数据到目的缓冲区。

最后, 可以看到sn产生的办法, 取这样一个串, user 256-4-ulen的任意字符 两字节ulen 02 任意结尾。 最后将这个串逆序 得到 加密前原文, 该串以私钥加密即得到序列号。 因为填充字符的存在, 所以相同用户名是可以有很多匹配的序列号的。

结束:

验证用工具使用了 readyu 大侠提供的, RDLP, BigInterCalc.

下载位置:

bbs1t=47934&highlight=RDLP

bbs1t=49005&highlight=RDLP

附一组修改公钥n后验证成功的注册码

替换的公钥n:

C1E8FDD98735103BCCEC2032A319FB8ADB1E79D5663486116CF54EE96CE3CB8988974330DEBB3639DC41C0FC0680F0549D94E90410D1B01A58E9D0F265008FD9

加密用私钥d:

41A1C0B9EDBF921D0B81286CBB33C225FF8053305D858D933C53D33FC2B15F6437E7D80333B01EE6DF23D3BF378F6FAAF366BC5398CF9E74B4E6836174894A59

加密前源串:

01020a00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFeeFFFFFFFFFFFFFFFFFF00636F6F6C737461723134

用户名:coolstar14

序列号:5BC6E01B6C7D34455FDB584A6B5352187CF9ECCB29FD28E4FFFF3FB33D4A6B27191285FFB23451FA9DDA95EA44909D2B9D54BBC77841F668CD9F6F3BC

本文由用户糖娃娃分享,如有侵权请联系。如若转载,请注明出处:http://www.yunpanclub.com/25702.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注