目录
8.已知(e,n,c),求m(e极小,如3,低加密指数攻击)
参考: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)
import gmpy2
p =
q =
e =
phi = (p-1)*(q-1)
d = gmpy2.invert(e,phi)
print(d)
密文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:]))

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:]))

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:]))

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:]))
解题思路: 两组数中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:]))
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:]))
解题思路:
可以分解n得到p,q
在线分解大整数网址:
http://www.factordb.com/index.php
注意:在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:]))

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:]))
解题思路: 题中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:]))
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))
我有一个.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
我认为我知道如何创建自定义的加密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
我正在尝试为我的应用程序实现一个简单的许可key方案,但我遇到了重大障碍。我正在按照OpenSSLforLicenseKeys中的示例进行操作.自从该博文写于2004年并且OpenSSL在OSX上已被弃用后,我尝试使用SecurityTransformsAPI代替OpenSSL来完成许可证key验证。但是,我正在使用OpenSSL生成私钥和公钥;许可证key由Ruby网络应用程序使用私钥生成,该应用程序使用来自购买者电子邮件地址的SHA-256摘要的RubyOpenSSL包装器库。问题是,我所做的任何事情似乎都无法使用安全转换API验证的OpenSSL从Ruby生成签名。我正在处理的R
我正在尝试找出与我拥有的小型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哈希值,然后用我拥有的私
我正在尝试解密使用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
我使用Crypto-JSsourcesiteatGooglecode中的示例进行了简单测试:在页眉中:在Javascript函数中:varencrypted=CryptoJS.AES.encrypt("Message","SecretPassphrase");vardecrypted=CryptoJS.AES.decrypt(encrypted,"SecretPassphrase");alert('encrypted:'+encrypted+'decrypted:'+decrypted);但是输出是:encrypted:U2FsdGVkX19hsNqFBS5xcUoVBCu/hPHep
我收到以下错误: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
我目前使用以下设置来注册新用户://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
我们使用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
我正在使用来自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.