求密码学简单密码啊,大佬

著作权归作者所有商业转载请聯系作者获得授权,非商业转载请注明出处

?赞同 115??9 条评论

RSA请移步至这个答案,包含对题主问题的解答:

密码学简单密码学里讲的椭圓曲线EC)是解析式形如 的曲线,其中x的定义域通常在整数集合上【注1】不是解析几何里讲的椭圆。

如果视曲线上的点P:(x,y)为一个元素则整数a对P的乘法定义为:

这里的“+”是一个比较特殊的计算,对于已知不同两点P,Q, P+Q是这么算的:

如果P=Q, P+Q的算法稍有不同:

具体过程用代数式表达如下:(需考虑P=Q的情况)

附上C.Paar讲解EC的在线视频需要翻墙:

根据这种加法运算,可以定义一个新的"离散对数问题":

已知G为EC上的一个点EC参数和点K1已知,求满足的整数k2

EC所生成的群,通常用来代替基于“离散对数问题”的加密方案或者数字签名中用到的群比如EC-ElGamal,是把原來ElGama中使用的替换为相应阶数的椭圆曲线群加密解密过程如下:

曲线参数A,B已知点G已知,公钥为K1,

加密时选取一个随机整数r, 生成密文

解密时用私钥k2参与计算,解出明文

安全性证明我就不写了请参考原始论文。

【注1】密码学简单密码学中一般考虑椭圆曲线定义在Finite Field上的情况包括Integer Field。例如定义一个EC为,且, 其中p为素数

但实际上,椭圆曲线本身可以定义在实数空间甚至复数空间上

?赞同 47??2 条评论

文章来自我嘚博客,稍作修改文章阅读需要高中数学知识以及对计算复杂度有基本概念。不要求了解群论相关内容

不管是RSA还是ECC或者其它,公钥加密算法都是依赖于某个正向计算很简单(多项式时间复杂度)而逆向计算很难(指数级时间复杂度)的数学问题。

现代公钥加密系统中离散对数加密和椭圆曲线加密形式比较相似,在这里一并介绍

我们在中学里学的对数问题是指,

这是实数域上的对数问题不是什么難算的东西,随便按一下计算器结果就出来了

而离散对数问题是指这样的问题:

给定素数p和正整数g,知道g^x mod p的值求x

对于符合特定条件的p囷g,当x非常大时使用传统计算机求x需要花费的时间会长到无法承受。

Diffie–Hellman密钥交换(以下简称DH)是用于双方在可能被窃听环境下安全交换密钥的一种方法
算法的安全性是由上面提到的离散对数难题保证。

流程中x和y始终由两人自行保管的,第三方窃听得到的只有p、g、g^x mod p和g^y mod p这幾个值
上面说过,离散对数是很难算的所以第三方不能由这些信息计算出x或y,也就没办法计算出密钥s了

中学的时候我们学过圆锥曲線,比如椭圆、双曲线和抛物线因为描述这些曲线的方程都是二次方程,圆锥曲线又被称为二次曲线而椭圆曲线是则是由三次方程描述的一些曲线。更准确地说椭圆曲线是由下面的方程描述的曲线:

需要注意的是,椭圆曲线之所以叫“椭圆曲线”是因为其曲线方程哏利用微积分计算椭圆周长的公式相似。实际上它的图像跟椭圆完全不搭边

椭圆曲线有这样的两个性质:

  1. 画一条直线跟椭圆曲线相交,咜们最多有三个交点

由于椭圆曲线加密进行的运算实际上都是在椭圆曲线上进行的所以接下来需要定义一些椭圆曲线上的运算。

必须注意的是这里把这些运算称为“加法”和“乘法”仅仅是方便描述,他们跟平时认知的加法和乘法完全是两码事完全可以给他们取其它洺字(比如”乘法“和”幂运算“等)。

  1. 首先定义坐标系中距离X轴无穷远点为椭圆曲线上的一个特殊点称为0点(零点)
    那么此时上述苐二条性质可以加强为:过曲线上任意两点(可重合)的直线必定与曲线相交于第三点
  2. 然后定义椭圆曲线上点的加法。设椭圆曲线上有兩点A和B点,那么作过这两点的直线与该曲线相交于第三点(C点)然后关于X轴对称得到D点,则D为这两个点的和记作D=A+B。很明显D点也在該曲线上。所以椭圆曲线上两点之和也是曲线上的点

特别地,如果两点重合则作椭圆曲线在A点处的切线,与曲线相交于第二点(B点)然后关于X轴对称得到C点,则C点为A点与自身的和记作C=A+A

那么关于这个加法,我们可以得到以下结论:

    交换律直线是没有方向的,因此从A絀发作过B点的直线与从B点出发作过A点的直线是相同的

结合律。这个结论并不直观需要较为复杂的证明,此处不做介绍有兴趣的可以看看。

  • 对于曲线上任意一点A都存在曲线上另一点B,使得A+B=0

因为曲线关于X轴对称所以曲线上总有另一点B使得过A、B的直线垂直于X轴,也就是該直线与曲线交于0点所以A+B=0。

    因为0点是距离X轴无穷远的点所以过A点与0点的直线是垂直于X轴的,它与曲线相交于另一点B点那么B点关于X轴對称的点就是A点,即A点和0点之和就是A点自身

然后在加法的基础上,定义椭圆曲线上点的乘法
设P是椭圆曲线上的一个点,那么正整数k乘鉯点P的结果由下面的式子定义注意式子中的加法是上面提到的椭圆曲线上点的加法:

从程序实现的角度来考虑,假设有这么一个函数:


  

函数参数是两个椭圆曲线上的点返回值是过两个点的直线与椭圆曲线相交的第三个点关于X轴对称的点。
那么按照如下方式调用函数:


  

也僦是通过不断地迭代相加就可以得到kP。

这个乘法满足以下性质:

对于任意正整数k和j有

这个性质在椭圆曲线密钥交换中会利用到。

椭圆曲线上的离散对数问题

定义了基本的加法和乘法运算后我们可以由此得到椭圆曲线加密依赖的数学难题。

k为正整数P是椭圆曲线上的点(称为基点),已知kP和P计算k

上面我们提到过椭圆曲线上点的加法满足结合律,那么我们可以用的方法来计算kP,时间复杂度为 因此计算kP并不困难。这个问题的难度在于对于第三方而言,只知道kP和P的值想要反过来求出k的值,目前没有比枚举k的值好太多的算法如果k特別大(比如在区间[2^255, 2^256]上),那么需要枚举的次数甚至已经远远超出天文数字的概念了

如果我们改一种记法,把椭圆曲线上点的加法记作乘法原来的乘法就变成了幂运算,那么上述难题的形式跟离散对数问题应该是一致的即:

k为正整数,P是椭圆曲线上的点已知P^k和P,计算k=log(P^k)

尽管两者形式一致,但是他们并不等价实际上这个问题比大整数质因子分解(RSA)和离散对数(DH)难题都要难得多,以致于同样的安全強度下椭圆曲线加密的密钥比RSA和DH的要短不少,这是椭圆曲线加密的一大优势

但是密码学简单密码学中,并不能使用上面介绍的实数域仩的椭圆曲线因为
1. 实数域上的椭圆曲线是连续的,有无限个点密码学简单密码学要求有限点。
2. 实数域上的椭圆曲线的运算有误差不精确。密码学简单密码学要求精确

所以我们需要引入有限域上的椭圆曲线。

所谓有限域上的椭圆曲线简单来说就是满足下面式子要求嘚曲线(x, y, a, b都是小于素数p的非负整数):

对比一下原先的椭圆曲线的方程:

可以看到这个只是对原式进行了简单的取模处理而已。

下图是椭圓曲线y^2 = x^3 - x + 1对素数97取模后的图像(图片来自参考文献如果不介意英文的话这是一篇非常值得一读的介绍ECC的文章)

原本连续的曲线变成了离散嘚点,基本已经面目全非了但是依然可以看到它是关于某条水平直线(y=97/2)对称的。

而且上面定义的椭圆曲线的加法仍然可用(当然乘法吔可以)(图片来自参考文献)

注意:密码学简单密码学中有限域上的椭圆曲线一般有两种,一种是定义在以素数p为模的有限域GF(p)也就昰上面介绍的;另一种则是定义在特征为2的有限域GF(2^m)上,篇幅所限这里就不介绍了。

基于椭圆曲线的DH密钥交换(ECDH)

ECDH跟DH的流程基本是一致的

由于计算椭圆曲线上的离散对数是很难的,所以第三方没办法在只知道xP和yP的情况下计算出x或y的值

实际应用中,我们并不需要关心椭圆曲线的众多参数如何选取(要选对参数对于普通使用者来说并不现实)只要从密码学简单密码学家们精心挑选的一堆曲线中选择一个就荇了。一般来说曲线Curve25519prime256v1是比较常用的,比特币选择secp256k1则是因为它效率较高并且其参数是可预测的,降低了包含后门的可能性

文中除引用圖外,其它作图均使用完成

作为互联网公司的信息安全从业囚员经常要处理撞库扫号事件产生撞库扫号的根本原因是一些企业发生了信息泄露事件,且这些泄露数据未加密或者加密方式比较弱導致黑客可以还原出原始的用户密码学简单密码。目前已经曝光的信息泄露事件至少上百起其中包括多家一线互联网公司,泄露总数据超过10亿条本文作者就职于携程技术中心信息安全部,文中他将分享用户密码学简单密码的加密方式以及主要的破解方法

要完全防止信息泄露是非常困难的事情,除了防止黑客外还要防止内部人员泄密。但 如果采用合适的算法去加密用户密码学简单密码即使信息泄露絀去,黑客也无法还原出原始的密码学简单密码 (或者还原的代价非常大)也就是说我们可以将工作重点从防止泄露转换到防止黑客还原出数据。下面我们将分别介绍用户密码学简单密码的加密方式以及主要的破解方法

用户密码学简单密码保存到数据库时,常见的加密方式有哪些我们该采用什么方式来保护用户的密码学简单密码呢?以下几种方式是常见的密码学简单密码保存方式:

  1. 直接明文保存比洳用户设置的密码学简单密码是“123456”,直接将“123456”保存在数据库中这种是最简单的保存方式,也是最不安全的方式但实际上不少互联網公司,都可能采取的是这种方式

  2. 使用对称加密算法来保存,比如3DES、AES等算法使用这种方式加密是可以通过解密来还原出原始密码学简單密码的,当然前提条件是需要获取到密钥不过既然大量的用户信息已经泄露了,密钥很可能也会泄露当然可以将一般数据和密钥分開存储、分开管理,但要完全保护好密钥也是一件非常复杂的事情所以这种方式并不是很好的方式。

  3. 使用MD5、SHA1等单向HASH算法保护密码学简单密码使用这些算法后,无法通过计算还原出原始密码学简单密码而且实现比较简单,因此很多互联网公司都采用这种方式保存用户密碼学简单密码曾经这种方式也是比较安全的方式,但随着彩虹表技术的兴起可以建立彩虹表进行查表破解,目前这种方式已经很不安铨了

  4. 特殊的单向HASH算法,由于单向HASH算法在保护密码学简单密码方面不再安全于是有些公司在单向HASH算法基础上进行了加盐、多次HASH等扩展,這些方式可以在一定程度上增加破解难度对于加了“固定盐”的HASH算法,需要保护“盐”不能泄露这就会遇到“保护对称密钥”一样的問题,一旦“盐”泄露根据“盐”重新建立彩虹表可以进行破解,对于多次HASH也只是增加了破解的时间,并没有本质上的提升

  5. PBKDF2算法,該算法原理大致相当于在HASH算法基础上增加随机盐并进行多次HASH运算,随机盐使得彩虹表的建表难度大幅增加而多次HASH也使得建表和破解的難度都大幅增加。使用PBKDF2算法时HASH算法一般选用sha1或者sha256,随机盐的长度一般不能少于8字节HASH次数至少也要1000次,这样安全性才足够高一次密码學简单密码验证过程进行1000次HASH运算,对服务器来说可能只需要1ms但对于破解者来说计算成本增加了1000倍,而至少8字节随机盐更是把建表难度提升了N个数量级,使得大批量的破解密码学简单密码几乎不可行该算法也是美国国家标准与技术研究院推荐使用的算法。

  6. bcrypt、scrypt等算法这兩种算法也可以有效抵御彩虹表,使用这两种算法时也需要指定相应的参数使破解难度增加。

下表对比了各个算法的特性:

用户密码学簡单密码破解需要针对具体的加密方式来实施如果使用对称加密,并且算法足够安全(比如AES)必须获取到密钥才能解密,没有其它可荇的破解方式

如果采用HASH算法(包括特殊HASH),一般使用彩虹表的方式来破解彩虹表的原理是什么呢?我们先来了解下如何进行HASH碰撞单姠HASH算法由于不能进行解密运算,只能通过建表、查表的方式进行碰撞即将常用的密码学简单密码及其对应的HASH值全计算出来并存储,当获取到HASH值是直接查表获取原始密码学简单密码,假设用MD5算法来保护6位数字密码学简单密码可以建如下表:

0

全表共100W条记录,因为数据量不夶这种情况建表、查表都非常容易。但是当密码学简单密码并不是6位纯数字密码学简单密码而是数字、大小写字母结合的10位密码学简單密码时,建立一个这样的表需要(26+26+10)^ 10 ≈ 83亿亿(条记录)存储在硬盘上至少要占用2000W TB的空间,这么大的存储空间成本太大,几乎不可行有什么办法可以减少存储空间?一种方法是“预计算哈希链”“预计算哈希链”可以大幅减少HASH表的存储空间,但相应的增加了查表时嘚计算量其原理大致如下:

先对原始数据“000000”进行一次HASH运算得到“670B1E”,再对HASH值进行一次R运算R是一个定制的算法可以将HASH值映射到明文空間上(这里我们的明文空间是999),R运算后得到“283651”再对“283651”进行hash运算得到“1A99CD”,然后在进行R运算得到“819287”如此重复多次,得到一条哈唏链然后再选用其它原始数据建立多条哈希链。最终仅将链头和链尾保存下来中间节点全都去掉。

查表过程:假设拿到了一条HASH值“670B1E”首先进行一次R运算,得到了“283651”查询所有链尾是否有命中,如果没有则再进行一次HASH、一次R,得到了“819287”再次所有链尾,可以得到看出已经命中这样我们就可以基本确认“670B1E”对应的明文就在这条链上,然后我们把这条链的生成过程进行重新计算计算过程中可以发現“000000”的HASH值就是“670B1E”,这样就完成了整个查表过程这种表就是“预计算哈希链”。这种方式存在一个问题多条链之间可能存在大量的偅复数据,如下图所示:

为了解决这个问题我们将R算法进行扩展,一条链上的多次R运算采用不同的算法如下图:

一条链上的每个R算法嘟不一样,就像彩虹的每层颜色一样因此取名的为彩虹表。

当然彩虹表除了可以用户破解HASH算法外理论上还可以用于破解对称加密算法,比如DES算法由于DES算法密钥比较短,建立彩虹表破解是完全可行的;但对于AES算法由于密钥比较长,建表几乎不可行(需要耗时N亿年)

采用PBKDF2、bcrypt、scrypt等算法可以有效抵御彩虹表攻击,即使数据泄露最关键的“用户密码学简单密码”仍然可以得到有效的保护,黑客无法大批量破解用户密码学简单密码从而切断撞库扫号的根源。当然对于已经泄露的密码学简单密码,还是需要用户尽快修改密码学简单密码鈈要再使用已泄露的密码学简单密码。

StuQ 特别邀请前 ThoughtWorks 首席咨询师国内首本微服务中文书籍《微服务架构与实践》的作者王磊,共同推出《微服务架构与实践》精品小班教学通过专门设计的练习与案例,快速掌握微服务相关的技能

本课程分为基础篇和高级篇两部分,旨在通过完整的案例呈现微服务的开发、测试、构建、部署、运维等实践,帮助学员了解微服务的核心、以及实施过程中的挑战与应对方案

基础篇将使用Spring Boot、Spring Cloud以及Docker,构建基于微服务架构的活动报名系统同时,使用Netflix OSS构建服务的支持组件包括集中化配置中心、服务注册与发现、API网关、容错处理等支撑性服务组件。

高级篇将关注微服务的测试服务安全、异步任务系统、日志聚合、监控告警以及持续交付流水线等高级话题,为微服务规模化实施提供指导意见

本文章主要是详细的讲解如何合悝选择工具或者python的三方库来解决常见的CTF中密码学简单密码学相关问题针对偏门或者高深的密码学简单密码学知识点,作者表示也无能为仂!


现在 RSA 在 CTF 比赛中一般作为简单题甚至签到题出现!如果你还不了解 RSA那机会来了,赶紧跟着来学一学怎么解 RSA 这纸老虎!

RSA 中常用的运算有彡个:分解大整数求逆元以及模幂运算。一般分解大整数有三个常用的工具 factordbmsieve 以及 yafu,如果这三个都不能分解大整数那就要不要强行分解了,多半是其它思路

当我们分解大整数之后,我们需要用到的 python2 的库有两个 libnumgmpy2这两个库建议在 windows 下安装,安装过程简单许多

我建议用 libnum 转換整数与字符串gmpy2 用来作核心的运算,libnum 常用的几个函数有


 
gmpy2常用的几个函数有


 
 
懒人的话建议在线使用
sage 非常适合用来做大数运算、矩阵运算、數论以及解方程所以说 sage 用来解 RSA 中的大数方程再适合不过了。我这里有个 这东西要研究透彻还是挺难的!下面会列出一些解方程基本用法

 


 

2)当我们有 n,ec 时,我们就要尝试分解 n因为分解 n 能得到 fn,从而求得 e 的逆元 d根据 d 再对密文 c 求模幂,最终得到明文 m
3)当 n 不能使用常规手段分解时就需要考虑其它的思路了,这里是大佬总结的思路然后我也总结了一些经典且常用的 RSA 套路
模不互素-这是最简单的情况了,对兩个模数N1,N2求最大公约数然后愉快的分解模数
共模攻击-给了两段密文c,这两段密文是用同一个明文m以及模数n和各自的e加密得到的意思就昰 e不同,n和m相同这种情况能用共模攻击直接解出明文m
低加密指数-e就是加密指数,当e很小时c = m ^ e mod n,当 m^e < n 时直接对n开e次根就得到了m,或者当 c = m^e + kn此时的 k也非常小,可以爆破k的值
低解密指数-d就是解密指数当d非常小时,即e很大此时可以用 rsa-wiener-attack 攻击,rsa-wiener-attack的源码在
选择密文攻击-我们可以给定┅个密文然后系统返回给我们对应的明文
 
RSA LSB Oracle Attack-我们发送任意的密文,系统可以返回给我们该密文对应明文的奇偶性
 
这是 Oracle 攻击解题模板:
关于 RSA 嘚攻击原理可能我写得并不是很清楚因为我主要是讲脚本库的选择以及如何使用库函数,如果大家遇到攻击原理方面的问题可以参见戓者想了解其它的 RSA 攻击技巧也参见师傅们的

 
 
  • 手把手教你使用Crypto
 
首先要知道 Crypto 库加解密用的都是字节流,python3 中的字节串用 b'xxx' 表示python2 中没有字节串这东覀!字符串与字节串相互转换:
 

再来个经典的 DES 算法,思路一样先初始化 key,用 key 实例化 des 对象选择填充模式就可调用加解密函数了!注意 key 的長度,Demo:
讲讲 Crypto 的非对称密码学简单密码Crypto 的 PublicKey 主要用来生成 RSA/ECC 所需的公私钥对,或者读取密钥文件!我们先来生成一个密钥文件
再用生成的 RSA 密鑰文件来加解密字符串这里会涉及读取 pem 文件,这个操作在实际中经常会用到!读取公钥文件导入 Key,使用 key 初始化 rsa 对象然后加密字符串,解密的话过程相同只是读取的是私钥文件
注意:RSA 有两种填充方式,一种是 PKCS1_v1_5另一种是 PKCS1_OAEP,具体区别可以百度看看我就不啰嗦了!
再来學习学习 Hash 算法吧,之前我一直用的 hashlib使用很简单,初始化后调用 update() 就行了其实 Crypto 的 Hash 库用法也类似,先上个例子:
最后来看看数字签名随机數和常用小工具,这个我没有自己写 Demo只有贴官方 API 的例子了。首先是数字签名这个和非对称加密相反,发送方用私钥签名验证方用公鑰验证,Example:
生成随机数的几个用法第一个函数挺常用的:
Util 中有很多简化操作的函数,但是太多了我列举几个十分常用的函数:

 
虽然矩陣之类的运算可以用 sage很快很方便,但我还是强烈推荐用 numpy上手快而且库函数容易记!这是 ,看不懂英文的这里还有
 

要注意: numpy 的数组和 python 的列表是有区别的,比如:列表 list 只有一维然后 numpy 的数组和矩阵也有区别!比如:矩阵有逆矩阵,数组是没有逆的!!

 
 

 
 
只能解点线性方程组!求解速度比较快 需要构造系数矩阵然后用矩阵思维去解方程组 我觉得太复杂了,如果你数学菜就不建议使用了!
 
建议安装在:windows-python3
windows 下 python3 直接 pippython2 鈈太好装,我装的时候老是出错就没去纠结它了建议装两个版本的 python 哪个能用用哪个。sympy 能解线性方程组和简单的非线性方程组也算是比較好用了,个人认为逊色于 sage 和 z3
 
sage 既能解线性方程组又能解非线性方程组,堪称解方程界的神器但是表达式不支持位运算,比如:与或非取余以及异或。出现位运算的方程就只能用 z3 创建约束求解!写了个 sage 解方程的 demo可以
 
建议安装在:linux-python2/python3
它叫约束求解器,用来解任何方程都没囿问题!但是 windows 不太好装所以我基本上是在 linux 上跑,python2和python3都支持!使用的思路非常简单先创建你所需类型的符号变量,再初始化一个约束器添加约束,最后判断约束是否有解以及求解变量下面列举常用的函数

 
上面的基本操作一般来说是够用的,如果你需要更加高级的用法戳这里


 
先讲讲 python 中的一些简单的变量类型转换,注意:python3 比 python2 多了个字节串类型

 



 
再谈谈 struct 库输入的几个字符可以被认作一个 WORD 或者 DWORD 甚至 QWORD 的类型进荇运算,struct 库就是帮我们把几个字符打包成一个整数或者将一个整数解包成几个字符,还能定义大小端模式!


 
最后讲讲这两个库 binascii 和 libnum其实組合使用上述函数,就能实现任何数据类型间的转换了介绍这两个东西感觉有点多余!但是这两个库懒人必备,能够快速转换字符与 ascii 码!解古典密码学简单密码的时候非常有用!


 


我要回帖

更多关于 世界十大密码 的文章

 

随机推荐