维纳攻击
适用情况e过大或过小
在e过大或过小的情况下,可使用算法从e中快速推断出d的值。
原理
我不生产原理,我只是原理的搬运工
Wiener 表示如果满足:
$d<\frac{1}{3}n^{\frac{1}{4} }$
那么一种基于连分数(一个数论当中的问题)的特殊攻击类型就可以危害 RSA 的安全。此时需要满足:
q<p<2q
如果满足上述条件,通过 Wiener Attack 可以在多项式时间中分解 n,思路如下:
回想一下 RSA:
N = pq
φ(n)=(p−1)(q−1)=pq−(p+q)+1=N−(p+q)+1
∵ p, q 非常大,∴ pq≫p+q,∴φ(n)≈N
∵ed≡1 mod φ(n),∴ed−1=kφ(n),这个式子两边同除 dφ(n) 可得:
$\frac{e}{\phi(n) } -\frac{k}{d} =\frac{1}{d\phi(n)}$
∵φ(n)≈N,∴$\frac{e}{N } -\frac{k}{d} =\frac{1}{d\phi(n)}$,同样 dφ(n) 是一个很大的数,所以$\frac{e}{N}$ 略大于 $\fr ...
低加密指数攻击
原理低加密指数攻击:
假设e=3, 公钥中的加密指数e很小,但是模数n很大
有RSA加密公式:$ c \equiv m^{e} \pmod{n} $ (c密文,m明文)
则:
当$m^{e}<n $时,$c = m^{e} $,所以对c开方就能得到m
当$m^{e}>n $ 时,此时用爆破的方法:
假设我们$m^{e} / n $的商为 k 余数为c,则$m^{e} = kn + c$,对k进行爆破,只要k满足 kn + c能够开e次方就可以得明文
脚本$m^{e}<n $时:
from gmpy2 import *from Crypto.Util.number import *n=0x52d483c27cd806550fbe0e37a61af2e7cf5e0efb723dfc81174c918a27627779b21fa3c851e9e94188eaee3d5cd6f752406a43fbecb53e80836ff1e185d3ccd7782ea846c2e91a7b0808986666e0bdadbfb7bdd65670a589a4d2478e9adcafe97 ...
低加密指数广播攻击
n不互素特点加密指数e非常小
一份明文使用不同的模数n,相同的加密指数e进行多次加密
可以拿到每一份加密后的密文和对应的模数n、加密指数e
解题思路由于模数n只能分解为p和q,所以当n很多时,p或q有相同的风险
因此不同的模数n中可能存在相同的p或者说q
求出不同n之间的最大公约数 gcd(),如果大于1说明这里存在漏洞,可以继续攻击
所得到的最大公约数就是p或q,然后可得d
有私钥d就能得到明文
例题m = xxxxxxxxe = 65537========== n c ==========n = 204749188940517785333052623456018809280882844711218237540497253540724771558737788480550738433458206978866410868426124865412501839659 ...
共模n攻击
例题c1=2232203527566323704164689377045193350932470191348430333807621060354261275895626286964082248647012114942448557136100742129367551633882219528031379499113604814091884247121984026353633888625049268273943641001343665116172072585548486669008478872134955566201987908150111322299612330553300932596437779889270316152185280595681121956388331289633015629862167468435391954755812792092570684280891476219901105495581653497767526739500957534782038707348392842506653636148277489237096952074030428745655550 ...
长安“战疫”网络安全卫士守护赛crypto
cry1题目如下,就是一个脚本:
from Crypto.Util.number import*from secret import flag,keyassert len(key) <= 5assert flag[:5] == b'cazy{'def can_encrypt(flag,key): block_len = len(flag) // len(key) + 1 new_key = key * block_len return bytes([i^j for i,j in zip(flag,new_key)])c = can_encrypt(flag,key)print(c)# b'<pH\x86\x1a&"m\xce\x12\x00pm\x97U1uA\xcf\x0c:NP\xcf\x18~l'
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * ...
公钥提取
特征此类题目一般会给pub.key和flag.enc。pub.key是公钥文件,可以用txt打开;flag.enc是加密后的二进制文件,用txt打开会是乱码。
公钥一般长这样:
——-BEGIN PUBLIC KEY——-MDwwDQYJKoZIhvcNAQEBBQADKwAwKAIhAMAzLFxkrkcYL2wch21CM2kQVFpY9+7+/AvKr1rzQczdAgMBAAE=——-END PUBLIC KEY——-
可以用在线网站去解析获得e和n:SSL在线工具-公钥解析 (hiencode.com)
当然也可以用python来解
获得n之后可以尝试利用工具分解n,分解n的在线网站:factordb.com
字节流转换为数字int.from_bytes()函数由于二进制文件读取之后是字节流,所以需要将其转换成十进制的数字,才能进行运算,这里就需要用到一个int.from_bytes()函数
函数格式: int.from_bytes(bytes, byteorder, *, signed=False)
简单demo:
s1 = b'\xf1\xff'pri ...
dp泄露
例题e = 65537n = 248254007851526241177721526698901802985832766176221609612258877371620580060433101538328030305219918697643619814200930679612109885533801335348445023751670478437073055544724280684733298051599167660303645183146161497485358633681492129668802402065797789905550489547645118787266601929429724133167768465309665906113dp = 905074498052346904643025132879518330691925174573054004621877253318682675055421970943552016695528560364834446303196939207056642927148093290374440210503657c = 14042367097625 ...
dp,dq泄露
例题p = 8637633767257008567099653486541091171320491509433615447539162437911244175885667806398411790524083553445158113502227745206205327690939504032994699902053229 q = 12640674973996472769176047937170883420927050821480010581593137135372473880595613737337630629752577346147039284030082593490776630572584959954205336880228469 dp = 6500795702216834621109042351193261530650043841056252930930949663358625016881832840728066026150264693076109354874099841380454881716097778307268116910582929 dq = 78347226367355 ...
KMP算法
概述KMP是三位大牛:D.E.Knuth、J.H.Morris和V.R.Pratt同时发现的。其中第一位就是《计算机程序设计艺术》的作者!
KMP算法要解决的问题就是在字符串(也叫主串)中的模式(pattern)定位问题。说简单点就是我们平时常说的关键字搜索。模式串就是关键字(接下来称它为子串),如果它在一个主串中出现,就返回它的具体位置,否则返回-1(常用手段)。
首先,对于这个问题有一个很单纯的想法:从左到右一个个匹配,如果这个过程中有某个字符不匹配,就跳回去,将子串向右移动一位。
这种方法也叫朴素的模式匹配:
简单来说就是:从主串s 和子串t 的第一个字符开始,将两字符串的字符一一比对,如果出现某个字符不匹配,主串回溯到第二个字符,子串回溯到第一个字符再进行一一比对。如果出现某个字符不匹配,主串回溯到第三个字符,子串回溯到第一个字符再进行一一比对……一直到子串字符全部匹配成功。
下面我们通过图片展示这个过程:竖直线表示相等,闪电线表示不等第一个过程:子串“goo”部分与主串相等,“g”不等,结束比对,进行回溯。
第二个过程:开始时就不匹配,直接回溯
第三个过程:开始时即不匹配 ...
SQL注入
预备知识mysql必备函数
database():返回当前数据库
version():返回数据库版本
user():返回当前用户
concat(s1,s2…sn):字符串 s1,s2…sn 等多个字符串合并为一个字符串,用于合并多个字符串
concat_ws(x, s1,s2…sn):同concat(s1,s2,…sn) 函数,但是每个字符串之间要加上 x,x 可以是分隔符,用于合并多个字符串,并添加分隔符
group_concat:将相同行的指定列的数据连在一起
substr(s, start, length):从字符串 s 的 start 位置截取长度为 length 的子字符串
ascii(s):返回字符串 s 的第一个字符的 ASCII 码
if(expr,v1,v2) 如果表达式 expr 成立,返回结果 v1;否则,返回结果 v2
left()函数是一个字符串函数,它返回具有指定长度的字符串的左边部分。left(str,length):接收两个参数:str:一个字符串;length:想要截取的长度,是一个正整数;
right()函数同理,从右侧截取
必备语句(1)
...