【Crypto】RSA

这篇具有很好参考价值的文章主要介绍了【Crypto】RSA。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.已知(p,q,e),求d

2.已知(p,q,e,c),求m

3.已知(p,q,dp,dq,c),求m

4.已知(e,dp,n,c),求m

5.已知(n,e1,e2,c1,c2),求m

6.已知(e,n1,c1,n2,c2),求m

7.已知(p+q,p-q,e,c),求m

7.已知(e,n,c),求m

8.已知(e,n,c),求m(e极小,如3,低加密指数攻击)

9.已知(e,n,c),求m(e很大,低解密指数攻击)

10.已知(c,n,p*(q-1),q*(p-1)),求m


参考:CTF中关于RSA的常见题型_abtgu的博客-CSDN博客_ctf rsa题目

1、RSA算法需要的基础知识:

【Crypto】RSA

5判断互质数:

1)两个质数一定是互质数。

2)一个质数如果不能整除另一个合数(合数是指在大于1的整数中除了能被1和本身整除外,还能被其他数(0除外)整除的数),这两个数为互质数。例如,3与10、5与 26。

3)1不是质数也不是合数,它和任何一个自然数在一起都是互质数。

4)相邻的两个自然数是互质数。如 15与16。

5)相邻的两个奇数是互质数。如 49与 51。

6)大数是质数的两个数是互质数。如97与88。

7)小数是质数,大数不是小数的倍数的两个数是互质数。如 7和16。

8)两个数都是合数(二数差又较大),小数所有的质因数,都不是大数的约数(因数),这两个数是互质数。如357与715,357=3×7×17,而3、7和17都不是715的约数,这两个数为互质数。

等等。。。

6什么是模运算与模指数运算?

模运算是整数运算,有一个整数m,以n为模做模运算,即m mod n。让m被n整除,只取所得的余数作为结果,就叫做模运算。例如,10 mod 3=1;26 mod 6=2;28 mod 2 =0等等。

模指数运算就是先做指数运算,取其结果再做模运算。如(5^3) mod 7 = (125 mod 7) = 6。

2、RSA加解密

1RSA加密算法由五个部分组成:

原文(Message)密文(Ciphertext)公钥(Public Key)私钥(Secret Key)加密算法(Encryption)解密算法(Decryption)。

2RSA求公钥私钥步骤如下:

1)随机选择两个不相同的素数 p,q 

2)将p,q相乘,记为 n = p × q 。

3)计算n的欧拉函数φ(n),当p,q为不相同的素数时φ(n)=(p−1)(q−1)。

4)随机选择一个整数e,满足两个条件:φ(n)与e互质,且 1 < e <φ(n)。

5)计算e对于φ(n)的模反元素d,也就是说找到一个d满足ed = 1modφ(n)。这个式子等价于ed = kφ(n) + 1,实际上就是对于方程ed  kφ(n) = 1求(d,k)的整数解。这个方程可以用扩展欧几里得算法求解。

6)最终把(e,n)封装成公钥,(d,n)封装成私钥。

3)RSA加密与解密

【Crypto】RSA

【Crypto】RSA

4RSA算法的破解

1)由于公钥中n已知,只需计算出d,便可通过M=Cd mod n计算出明文M。

2)由于方程ed  kφ(n) = 1公钥中e已知,我们只需要知道φ(n)的值便可求出(d,k)的整数解

3)由于φ(n) = (p - 1)(q - 1),我们需要求出p,q的值。

4)由于n = p * q,我们需要对n做因数分解。

只要n可以被因数分解为p,q,我们便可反推破解私钥,从而破解密文。

-------------------------------------------------------------------------------------------------------------------------------

1.已知(p,q,e),求d

import gmpy2
p = 
q = 
e = 
phi = (p-1)*(q-1)
d = gmpy2.invert(e,phi)
print(d)

2.已知(p,q,e,c),求m

密文c,明文m

import gmpy2 
import binascii

c = 
e =  
p = 
q = 
 
# 计算私钥 d
phi = (p-1)*(q-1)
d = gmpy2.invert(e, phi)
 
# 解密 m
m = gmpy2.powmod(c,d,p*q)
print(binascii.unhexlify(hex(m)[2:]))

3.已知(p,q,dp,dq,c),求m

【Crypto】RSA

import gmpy2
import binascii
p =
q =
dp =
dq =
c =

I = gmpy2.invert(p,q)
mp = gmpy2.powmod(c,dp,p)
mq = gmpy2.powmod(c,dq,q)

m = ((I*(mp-mq))%q)*p+mp
print(binascii.unhexlify(hex(m)[2:]))

4.已知(e,dp,n,c),求m

【Crypto】RSA

import gmpy2
import binascii
e = 
n =
dp =
c =
for i in range(1,e):
    if (e*dp-1)%i == 0 and n%((e*dp-1)//i+1)==0:
        q = n//((e*dp-1)//i+1)
        phi = (q-1)*((e*dp-1)//i)
        d = gmpy2.invert(e,phi)
        m = gmpy2.powmod(c,d,n)

print(binascii.unhexlify(hex(m)[2:]))

5.已知(n,e1,e2,c1,c2),求m

 【Crypto】RSA

import gmpy2
import binascii

n =
c1 = 
c2 = 
e1 = 
e2 = 

s = gmpy2.gcdext(e1,e2)
a = s[1]
b = s[2]

if a<0:
    a = -a
    c1 = gmpy2.invert(c1,n)
else:
    b = -b
    c2 = gmpy2.invert(c2,n)

m = (gmpy2.powmod(c1,a,n)*gmpy2.powmod(c2,b,n))%n

print(binascii.unhexlify(hex(m)[2:]))

6.已知(e,n1,c1,n2,c2),求m

解题思路: 两组数中e相同,n,c不同,求出n1与n2的最大公因数即为p,之后就可以得到q和d,从而求解m。

import gmpy2
import binascii
 
e = 
n1 = 
c1 = 
n2 = 
c2 = 

p1 = gmpy2.gcd(n1,n2)
q1 = n1 // p1
phi1 = (p1-1)*(q1-1)
 
d1 = gmpy2.invert(e,phi1)
m1 = gmpy2.powmod(c1,d1,n1)

print(binascii.unhexlify(hex(m1)[2:]))

p2 = gmpy2.gcd(n2,n1)
q2 = n2 // p2
phi2 = (p2-1)*(q2-1)

d2 = gmpy2.invert(e,phi2)
m2 = gmpy2.powmod(c2,d2,n2)

print(binascii.unhexlify(hex(m2)[2:]))

7.已知(p+q,p-q,e,c),求m

import gmpy2
import binascii
e=
a=
b=
c=

p = (a+b)//2
q = (a-b)//2

phi = (p-1)*(q-1)
d = gmpy2.invert(e,phi)

m = gmpy2.powmod(c,d,p*q)
print(binascii.unhexlify(hex(m)[2:]))

7.已知(e,n,c),求m

解题思路:
可以分解n得到p,q

在线分解大整数网址:

http://www.factordb.com/index.php

分解质因数工具 - 整数分解最多为70位

注意:在factordb中因为数过大而显示不全时,可以点击show查看完整数据,但是在复制数据时注意它的每一行都有空格,粘贴后要去掉

【Crypto】RSA

【Crypto】RSA

若以上都不好用,则用yafu计算

import gmpy2
import binascii

e = 
n = 
c = 
p = 
q = 

phi = (p-1)*(q-1)
d = gmpy2.invert(e,phi)
m = gmpy2.powmod(c,d,n)

print(binascii.unhexlify(hex(m)[2:]))

8.已知(e,n,c),求m(e极小,如3,低加密指数攻击)

【Crypto】RSA

import gmpy2
import binascii

e =
n =
c =

i = 0
while True:
    if gmpy2.iroot((c+i*n),3)[1] == True:
        m = gmpy2.iroot((c+i*n),3)[0]
        break
    i += 1

print(binascii.unhexlify(hex(m)[2:]))

9.已知(e,n,c),求m(e很大,低解密指数攻击)

解题思路: 题中e很大,故可知是低解密指数攻击
可以使用破解脚本:求出d的值,文件下载地址GitHub - pablocelayes/rsa-wiener-attack: A Python implementation of the Wiener attack on RSA public-key encryption scheme.
(注意,这里要将破解脚本和rsa-wiener-attack的py文件放在同一个目录下)文章来源地址https://www.toymoban.com/news/detail-401359.html

import gmpy2
import binascii
import RSAwienerHacker

e =
n =
c =

d = RSAwienerHacker.hack_RSA(e,n)
m = gmpy2.powmod(c,d,n)

print(binascii.unhexlify(hex(m)[2:]))

10.已知(c,n,p*(q-1),q*(p-1)),求m

import gmpy2
from Crypto.Util.number import *
#pq = p*(q-1)
#qp = q*(p-1)
c= 
n= 
pq= 
qp= 

e = 65537
p = n - pq
q = n - qp
phi = (p - 1)*(q - 1)

d = gmpy2.invert(e,phi)
m = gmpy2.powmod(c,d,n)
print(long_to_bytes(m))

到了这里,关于【Crypto】RSA的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Hutool-crypto 加密、解密详解!

    在Java开发的过程中,很多场景下都需要加密解密。 比如对敏感数据的加密,对配置文件信息的加密,通信数据的加密等等。 今天介绍的是Hutool工具包中的加密模块 crypto。 加密分为三类: 对称加密(symmetric) 常用的有AES、DES 非对称加密(asymmetric) 常用的有RSA,DSA 摘要加

    2024年02月06日
    浏览(49)
  • python基于crypto实现加密与解密

    ps: 使用pip工具安装步骤: 1、直接安装pycryptodome模块即可 pip install pycryptodome 2、如果你已经通过pip install crypto命令安装了,那么需要做以下两步: (1)切换到python安装目录的liibsite-packages目录下,将crypto目录名称修改为Crypto,即将首字母小写改成大写。 (2)安装pycryptodom

    2024年02月06日
    浏览(36)
  • Node.js crypto模块 加密算法

    微信小程序调用飞蛾热敏纸打印机,需要进行参数sig签名校验,使用的是sha1进行加密

    2024年02月11日
    浏览(27)
  • python使用Crypto库实现加密解密

    pycrypto,pycryptodome是crypto第三方库,pycrypto已经停止更新三年了,所以不建议安装这个库;pycryptodome是pycrypto的延伸版本,用法和pycrypto 是一模一样的;所以只需要安装pycryptodome就可以了 1:crypto的加密解密组件des.py 2:crypto组件使用

    2024年02月13日
    浏览(39)
  • cocosCreator 之 crypto-es数据加密

    版本: 3.8.0 语言: TypeScript 环境: Mac 项目开发中,针对于一些明文数据,比如本地存储和Http数据请求等,进行加密保护,是有必要的。 关于加密手段主要有: 对称加密 使用相同的密钥来加密和解密数据,常用的有 AES、DES、3DES 等 非对称加密 使用公钥加密,私钥解密,常

    2024年02月05日
    浏览(32)
  • 前端使用AES密码加密、解密,使用详细(crypto加密解密,前后端分离,AES加密解密)

    1、 首先安装 crypto-js插件,安装命令如下:    -S等同于--save,保存在package.json文件中,是在dependencies 下, --save安装包信息将加入到dependencies(生产环境)中,生产阶段的依赖,也就是项目运行时的依赖,就是程序上线后仍然需要依赖; -D等同于--save-dev,也保存在package.j

    2024年02月11日
    浏览(48)
  • 微信小程序使用crypto.js加密解密

    crypto.js是用来进行AES加密的 注意AES在使用时有7个配置项,前后端加解密记着统一参数,测试时注意配置项的选择是否一致。 AES加密测试工具 文件存放路径: cryptoPro.js代码:

    2024年02月11日
    浏览(52)
  • Go语言中的加密艺术:深入解析crypto/subtle库

    在当今快速发展的互联网时代,数据安全成为了软件开发中的重中之重。对于使用 Go 语言的开发者来说,标准库中的 crypto/subtle 包提供了一系列重要的安全功能,尤其是在处理加密和安全相关的任务时。本文将深入探讨 crypto/subtle 库,详细介绍其主要函数的用途、工作原理及

    2024年02月19日
    浏览(40)
  • Java:Hutool工具箱之Hutool-crypto加密解密

    文档 https://hutool.cn/docs/#/crypto/概述 重点单词: 摘自文档 依赖 以MD5 为例 以AES 加密为例 这里有个问题,如果秘钥长度不够16位,会报错 长度只能是16位,24位,32位 参考 https://toscode.gitee.com/dromara/hutool/issues/I4O1EB 以RSA为例

    2024年02月16日
    浏览(60)
  • ERC721和加密收藏品(ERC721 & Crypto-Collectibles)

    唷!这里的气氛开始升温了…… 在这节课中,我们将更深入一些。 我们将讨论代币、ERC721标准和加密可收集资产。 换句话说,我们要做的是让你可以和朋友交换僵尸。 我们来谈谈代币。 如果你在以太坊领域呆过一段时间,你可能听过人们谈论代币——特别是 ERC20代币 。 以

    2024年03月11日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包