草庐IT

【Crypto】RSA

菜鸟ql 2023-07-13 原文

目录

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题目

p,q->n,φ(n)
φ(n)->e
e,φ(n)->k,d:d = gmpy2.invert(e,(p-1)*(q-1))
e,n->公钥
d,n->私钥
c = pow(m, e, n)

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

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

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

 

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查看完整数据,但是在复制数据时注意它的每一行都有空格,粘贴后要去掉

若以上都不好用,则用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,低加密指数攻击)

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文件放在同一个目录下)

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的更多相关文章

  1. ruby-on-rails - Ruby - 如何从 ruby​​ 上的 .pfx 文件中提取公钥、rsa 私钥和 CA key - 2

    我有一个.pfx格式的证书,我需要使用ruby​​提取公共(public)、私有(private)和CA证书。使用shell我可以这样做:#ExtractPublicKey(askforpassword)opensslpkcs12-infile.pfx-outfile_public.pem-clcerts-nokeys#ExtractCertificateAuthorityKey(askforpassword)opensslpkcs12-infile.pfx-outfile_ca.pem-cacerts-nokeys#ExtractPrivateKey(askforpassword)o

  2. ruby - 从 Ruby 打开 RSA 私钥 - 2

    我认为我知道如何创建自定义的加密RSAkey,但我如何才能像ssh-keygen那样读取一个加密的key?我知道我可以做到:OpenSSL::PKey::RSA.new(File.read('private_key'))但是OpenSSL要求我提供密码...我如何将它作为参数传递给OpenSSL?而且,我如何创建一个与ssh-keygen生成的兼容的?我做这样的事情来创建私有(private)加密key:pass='123456'key=OpenSSL::PKey::RSA.new(1024)key="0000000000000000#{key.to_der}"c=OpenSSL::C

  3. ruby - 使用安全转换验证使用 Ruby/OpenSSL 创建的 RSA 签名 - 2

    我正在尝试为我的应用程序实现一个简单的许可key方案,但我遇到了重大障碍。我正在按照OpenSSLforLicenseKeys中的示例进行操作.自从该博文写于2004年并且OpenSSL在OSX上已被弃用后,我尝试使用SecurityTransformsAPI代替OpenSSL来完成许可证key验证。但是,我正在使用OpenSSL生成私钥和公钥;许可证key由Ruby网络应用程序使用私钥生成,该应用程序使用来自购买者电子邮件地址的SHA-256摘要的RubyOpenSSL包装器库。问题是,我所做的任何事情似乎都无法使用安全转换API验证的OpenSSL从Ruby生成签名。我正在处理的R

  4. ruby - 使用 SHA256 摘要签名的 OpenSSL RSA - 2

    我正在尝试找出与我拥有的小型ruby​​脚本等效的shell脚本。这是ruby脚本:require'openssl'require'base64'k=OpenSSL::PKey::RSA.new(File.read("key.pem"))res=File.read("res.tmp")digest=OpenSSL::Digest::SHA256.newsignature=k.sign(digest,res)File.write("foo1.txt",Base64.strict_encode64(signature))就是这样。它需要一些数据,获取它的SHA256哈希值,然后用我拥有的私

  5. javascript - 如何使用 Web Crypto API 解密使用 OpenSSL 创建的文件? - 2

    我正在尝试解密使用OpenSSL命令行界面创建的文件。此文件创建于:opensslaes-256-cbc-a-infile.txt-outfile_encrypted.txt并且可以用以下方法解密:opensslaes-256-cbc-d-a-infile_encrypted.txt通过使用-p标志,我可以检索WebCryptoAPI所需的实际值、salt和IV:>opensslaes-256-cbc-d-a-p-infile_encrypted.txtsalt=F57F1CC0CD384326key=0E971326890959386F1CFB91F185CFE109203DCEBC

  6. javascript - Crypto-JS 中的解密给出数字十六进制输出而不是原始明文字符串 - 2

    我使用Crypto-JSsourcesiteatGooglecode中的示例进行了简单测试:在页眉中:在Javascript函数中:varencrypted=CryptoJS.AES.encrypt("Message","SecretPassphrase");vardecrypted=CryptoJS.AES.decrypt(encrypted,"SecretPassphrase");alert('encrypted:'+encrypted+'decrypted:'+decrypted);但是输出是:encrypted:U2FsdGVkX19hsNqFBS5xcUoVBCu/hPHep

  7. javascript - 实用程序.crypto.lib。 randomBytes 不是函数 : aws cognito js throws error on authentication - 2

    我收到以下错误:TypeError:__WEBPACK_IMPORTED_MODULE_0_aws_sdk_global__.util.crypto.lib.randomBytesisnotafunction当我尝试使用我编写的以下代码对用户进行身份验证时:import{CognitoUserPool,CognitoUserAttribute,CognitoUser,AuthenticationDetails}from'amazon-cognito-identity-js';letauthenticationDetails=newAuthenticationDetails({Usern

  8. javascript - Node.js:crypto.pbkdf2 十六进制密码 - 2

    我目前使用以下设置来注册新用户://createsanewuserapp.post('/users',function(req,res){//createnewuservaruser=newUser();//assignpostuser.username=req.body.username;user.email=req.body.email;crypto.randomBytes(32,function(err,buf){if(err)throwerr;user.salt=buf.toString('hex');crypto.pbkdf2(req.body.password,user.s

  9. javascript - Crypto JS SHA3 在相同的输入上给出不同的输出 - 2

    我们使用CryptoJSSHA3将我们的用户名和密码哈希在一起。该函数从两个html输入字段获取用户名和密码的输入,将它们与盐连接起来,并对它们进行哈希处理。第一个散列成功运行,但是再次散列相同的输出会产生不同的结果。这是相关代码:$prehash=$salt+$user+$pass;$prehash=CryptoJS.enc.Utf8.parse($prehash);varsha3=CryptoJS.algo.SHA3.create();sha3.update($prehash);varpassword=sha3.finalize().toString(CryptoJS.enc.He

  10. javascript - javascript 中的 RSA 不再支持 ASCII/字节数组 - 2

    我正在使用来自http://www-cs-students.stanford.edu/~tjw/jsbn/的rsa.jsv1.0在浏览器中加密ASCII字符串。该字符串实际上是一个16字节的数组,其中包含一个双倍长度的TripleDeskey。使用rsav1.0这有效。字节数组在服务器上(使用BouncyCaSTLe或ThalesHSM)被正确解密为16字节数组。例如varzpk=hex2a("E0F8AD4092F81FC401E60ECB7F5B8F1A");varrsa=newRSAKey();rsa.setPublic(modulus,exponent);varres=rsa.

随机推荐