栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

RSA系列(目前没有更新完)_rsa过期?

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

RSA系列(目前没有更新完)_rsa过期?

目录

普通题目

RSA共模攻击

 RSA低加密指数攻击

RSA维纳攻击

easyrsa6

easyrsa7

enc与pem文件


普通题目

rsa最简单的题目,是给出pq等数据,要求求解d或是明文,使用脚本就可以轻松解密。

import libnum
import gmpy2

p=libnum.generate_prime(1024)#生成随机数
q=libnum.generate_prime(1024)
n=p*q
e=65537
phi_n=(p-1)*(q-1)
d=gmpy2.invert(e,phi_n)
c=pow(c,m,n)


print("p=",p)
print("q=",q)
print("n=",n)
print("d=",d)

print("e=",e)
import libnum

n=
e=
d=
c=4
m=pow(c,d,n)
print(libnum.n2s(m))

以上分别为解密与解密脚本。

RSA共模攻击

rsa共模攻击通俗来说,就是同一明文,同一个n,e不相同,进行加密。

简单解密脚本如下:

import libnum
import gmpy2

n=
e1=
e2=
c1=
c2=
s1,s2,s3=gmpy2.gcdext(e1,e2)#拓展欧几里得算法
print(s1,s2,s3)
m=(pow(c1,s2,n)*pow(c2,s3,n)%n)
print(libnum.n2s(int(m)))

其数学原理如下:

 RSA低加密指数攻击

该类型攻击一般指数e为3,ctf题目里有非常明显的特征,

 解密脚本如下:

import libnum

def key(c, e, n):
    k = 0
    while True:
        m1 = c + n*k
        result, flag = gmpy2.iroot(m1, e)
        if True == flag:
            return result
        k += 1
n=
e=
c=
m=key(c,e,n)
print(m)
print(libnum.n2s(int(m)).decode())

 在理解脚本时,有一些小白对mod捉摸不清,这里先介绍一下mod,我们可以把它比喻成钟表的运算,在日常面对钟表时,我们通常会说18点为6点,是因为大脑自动进行了mod运算,18mod12=6,而在早上6点是就称作6点,是因为6比12小,6mod12依然为6,可以在此基础上理解脚本。

RSA维纳攻击

维纳攻击是一种e过小或者e过大而进行的攻击方式(自我理解)

其原理因涉及到数论,因此针对一些小白这里直接提供最简便的代码(其实是自己也没理解透彻),有兴趣的可以去康康大佬的博客,

from Crypto.Util.number import *
from gmpy2 import *
from RSAwienerHacker import *

e = 
n=
c=


d=hack_RSA(e,n)
flag=long_to_bytes(pow(c,d,n))
print(flag)

在这个脚本里有以下几点需要注意。

首先是引用的RSAwienerHacker库不是python里的,它取自于github,如:文件地址

其次是Crypto库的使用,该库不可以在windows系统里使用(我的不行),需要在kali虚拟机里,使用python进行解密。这个使用pip的教程网上都是,可以自行查找也可以留言。

easyrsa6

这个主要是针对于一个题型,此次红明谷举办的赛事里也有这种类型的题目。

import gmpy2,libnum
from Crypto.Util.number import getPrime
from secret import flag

e = 0x10001
p = getPrime(1024)
q = gmpy2.next_prime(p)
n = p * q
print("n =",n)
m = libnum.s2n(flag)
c = pow(m,e,n)
print("c =", c)

这是easyrsa6的题目,该类型题目运行脚本会报错,因为它找不到flag模块,这里的第三行代码,就是说题目要读取内容,相当于flag=flag{***},如果要解题的话还是要自行解决脚本。

解题代码如下:

import gmpy2
import libnum

p=
q=
e=
n= 
c=

phi_n=(p-1)*(q-1)
d=gmpy2.invert(e,phi_n)
m=pow(c,d,n)
print(libnum.n2s(int(m)))

easyrsa7

 这是ctfshow中的rsa题目,其余的均采用了16进制可以理解,唯一疑惑的地方就是p>>128<<128

这其实是代表着p低位数据的损失,低位数据跟高位数据就相当于,你的银行卡存款的第一位+1和最后一位+1,感觉是完全不一样的,前者是高位,后者是低位。对于这种情况,应使用sagemath恢复数据,

 在恢复了p之后,解密也就和之前的解法一样了。

(题目里给出的16进制数,换与不换均不影响结果。)

enc与pem文件

有些题目下载附件之后即给出了enc文件与pem文件,这些均需要在linux里打开,对于这些题目,

我们的思路为

1.先破解公钥,找到其中的e和n

2 将n分解开来,找到两个质因数p和q

3.在python中编写rsa的简单脚本,找出明文。

1.首先在kali里输入openssl rsa -pubin -text -modulus -in warmup -in ****.pem,即可得到e和n

 2在网站上输入factordb.com,即可对n进行质因数分解,记得提前把n从十六进制转换为十进制。

3编写脚本解密

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/783208.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号