CTF-Crypto现代加密入门

优秀的人,不是不合群,而是他们合群的人里面没有你

古典密码我放在这里

http://106.14.63.154/CTF-%E8%A7%A3%E5%AF%86%E5%B8%B8%E7%94%A8%E7%BD%91%E5%9D%80%E9%9B%86%E5%90%88.html

现代加密

对称加密:(AES、DES)相对于与非对称加密而言,加密、解密用的密匙想同,就像日常生活中的钥匙,开门和锁门都是同一把。

非对称加密:(RSA)相对于上述的对称加密而言,加密、解密用的密匙不同,有公匙和私匙之分。

散列算法:md5,sha1这种

RSA字母意义

在密码学中,‌特别是在RSA算法中,‌n, p, e, 和 c 分别代表以下概念:‌

n:‌模数。其中n=p*q,‌这个值是公钥和私钥共同的一部分,‌用于计算。‌


p 和 q :n的两个因子


e:‌公钥的一部分,‌用于加密数据。

d:‌私钥的一部分,‌用于解密数据。‌

m:明文,原文文件。


c:‌密文,加密后的文件。


{N,e}称为公钥,{N,d}称为私钥

RSA加密原理

ras有公钥和私钥啦,他的基础是将两个大的质数相乘,然后用因式分解后的两个数作为密钥来加密。

ras主要涉及三个参数,ned,其中nd是私钥,ne是公钥。一般公钥加密,私钥解密。那么解密需要解出来私钥。

一般来说,ne也就是公钥,是公开的,但是n一般是两个很大(几千位)的大质数的乘积,很难解出来d。

密钥生成步骤

  1. 随机选择两个不相同的质数q和p

    如61和53。(质数越大越安全。)

  1. 计算出p和q的乘积,也就是n(把n转换成二进制数据,二进制长度就是密钥的长度,一般选择1024位或者2048位)

    n = 61×53 = 3233
    代码 n=p*q
    3233写成二进制是110010100001,一共有12位,所以这个密钥就是12位。

  2. 计算n的欧拉函数【对于任意正整数N,把少于或等于N ([1,N]),且与N互质的正整数(包括1)的个数,称作对N的欧拉函数,记作φ(n)。注:互质为两者没有除1外的公因数】

根据公式:
  φ(n) = (p-1)(q-1)
    代码:phi = (p-1)(q-1)
算出φ(3233)等于60×52,即3120。
  1. 随机选择一个整数e,其中φ(n)>e>1,并且e与φ(n)互为质数(实际中e一般选择65537)

    在1到3120之间,随机选择了17

  2. 计算e对于φ(n)和模反元素d

所谓”模反元素”就是指有一个整数d,可以使得ed被φ(n)除的余数为1。
  ed ≡ 1 (mod φ(n))
这个式子等价于
  ed - 1 = kφ(n)
于是,找到模反元素d,实质上就是对下面这个二元一次方程求解。
  ex + φ(n)y = 1
已知 e=17, φ(n)=3120,
  17x + 3120y = 1

解答得出x=-367 y=2

代码:d = gmpy2.invert(e,phi)
  1. 公钥一般提供的是(n,e),自己要算的是(n,d)
  2. 解密过程:m = c**d mod n,那么解密需要知道c,d,n

    代码:m = pow(c,d,n)

分解n

分解n,使用在线网址http://www.factordb.com/

或者用yafu

打开yafu文件夹,在文件夹内右键打开cmd

然后用以下办法来分解n

纯输入方法

./yafu-x64.exe "factor(1455925529734358105461406532259911790807347616464991065301847)"

大整数装进txt里方法(记得在txt里面复制粘贴完数字后回车)

./yafu-x64.exe "factor(@)" -batchfile data.txt

例题演示

话不多说,直接上个经典题型吧

    ------ enc -------
DTlEiAKLE24m19es4TBWl4Uo2MvmQMEYqWBCFggWJlJSjCwl3fT9322ytgudiQW2raDh53e6t2ed
ygpFOP+MsAPXlU469rlmVng5JyDl0CF0ypevnaM5i+CvNT2mBoDadIYnPBVGMtj9HVVPDpMIgv5b
F9N5ddQS7JB21oDdQBdDLTkKvcSqegtjNFv04R8+yrqOMZYpzdCRRw0j/MMt2JefC6z36mjrTL85
A9EKlwKg5ydW7qELycfjBvzB/cwJ7mJ2I0xVPToa3sSLNDyddFttATwU6wmCa4XaWpTwVR/PfET2
FRj0p+8UwYSDdlLLh6gRUVURpT+2jc9zx/rhOw==

这个应该是私钥,看着base64加密过的,只能用python进行解密,用别的咳嗽

pk = (25572000680139535995611501720832880791477922165939342981900803052781801299380515116746468338767634903543966903733806796606602206278399959935132433794098659859300196212479681357625729637405673432324426686371817007872620401911782200407165085213561959188129407530503934445657941975876616947807157374921539755157591354073652053446791467492853468641331291383821277151309959102082454909164831353055082841581194955483740168677333571647148118920605752176786316535817860771644086331929655259439187676703604894258185651165017526744816185992824404330229600417035596255176459265305168198215607187593109533971751842888237880624087,65537)

开始解答啦~~

这就是 公钥 n 和 e

第一步分解n,使用在线网址http://www.factordb.com/index.php

输入进去,直接得到两个值,这两个值长度一样
p = 149930380465516707151079321019435489399072155945793735032334088844599773034021170995501688132861944516938448679935403246643441984203770825485165700862168437691254557323938150173733659070945061763789341407547559935070758242521126066900261360899379463301621378242061934281538210192731229473900396425739817670867

q = 170559166199281256887953076784727902849936084815549184550874370897326056825177365209113910954088389779180174518262922176726833811470419181874717574929460298509184863124213663255559781224744696195678069242025195218017449489985102637547369070225979448169459840545693721393354651993457943927480894225788038743661


第二部计算欧拉函数phi

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

第三部计算d

d = gmpy2.invert(e,phi)


第四部处理c


解码

enc=base64.b64decode(enc)

结果是bytes类型,没法直接运算,要转换一下,这个可以把bytes类型转长整形

from crypto.Util.number import *

enc = bytes_to_long(enc)

这就是私钥

第五步揭秘

m = pow(c,d,n)

这个结果是计算结束了,但是还是长整形,需要转换成bytes类型,那就再转换一下

m = long_to_bytes(m)

正经的脚本:

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

p = 149930380465516707151079321019435489399072155945793735032334088844599773034021170995501688132861944516938448679935403246643441984203770825485165700862168437691254557323938150173733659070945061763789341407547559935070758242521126066900261360899379463301621378242061934281538210192731229473900396425739817670867

q = 170559166199281256887953076784727902849936084815549184550874370897326056825177365209113910954088389779180174518262922176726833811470419181874717574929460298509184863124213663255559781224744696195678069242025195218017449489985102637547369070225979448169459840545693721393354651993457943927480894225788038743661

phi = (p-1)*(q-1)

e = 65537
n = p*q
d = gmpy2.invert(e,phi)

c = '''
DTlEiAKLE24m19es4TBWl4Uo2MvmQMEYqWBCFggWJlJSjCwl3fT9322ytgudiQW2raDh53e6t2ed
ygpFOP+MsAPXlU469rlmVng5JyDl0CF0ypevnaM5i+CvNT2mBoDadIYnPBVGMtj9HVVPDpMIgv5b
F9N5ddQS7JB21oDdQBdDLTkKvcSqegtjNFv04R8+yrqOMZYpzdCRRw0j/MMt2JefC6z36mjrTL85
A9EKlwKg5ydW7qELycfjBvzB/cwJ7mJ2I0xVPToa3sSLNDyddFttATwU6wmCa4XaWpTwVR/PfET2
FRj0p+8UwYSDdlLLh6gRUVURpT+2jc9zx/rhOw==
'''
c = base64.b64decode(c)
#print(c)
c = bytes_to_long(c)
m = pow(c,d,n)
print(m)
m = long_to_bytes(m)
print(m)

https://www.cnblogs.com/chenjiaxuan/p/15885305.html

第二种题目类型就是文件格式的,公钥密文格式都是文件格式,长的这丫样子~~~

解题思路如下:

    -----BEGIN PUBLIC KEY-----
这种开头的就是公钥文件,如果是文件,使用如下命令
  1. 提取公钥中的数据。kali下使用命令
openssl rsa -pubin -text -modulus -in pub.key
# pub.key是公钥

在kali下 openssl rsa -pubin -text -modulus -in pub.key > 1.txt保存到文本

数据是这样子

  1. 读取文件的内容

    然后Exponent的值就是e
    然后Modulus的值就是公钥里面的n的十六进制的结果,可以转换成十进制,然后再网站进行分解

    e = 31337

    n = 119514949101869418903318873112867362646835071069241106524305309393065463453656568774743760570131693630159578791023971219610889380592598543536351234572467281587006324435481617535146537233169791976943380665697114009764947413190424965605151568078201516319476934559728328089096265594820785319942352507655193149106742096711100954500911687865197173709176323170965183162767042434738106978751911965481346436431672573623281881734153294758147557422163198312359915688282919868328721978258906227136067834058632472297370857579705187167410321575782375360591482072103305682978126915060591553714123014075758332542543138964874724542072396937584280625337262888775332970921021304750133076287918708895881009630077473404974677880966925170111450054682589858406625668247502091263399827525224215993035344424566568011928443888310172591327112851125472052921219080258671669993973898127049957265386657286586085405099815473365810806674154776699651214819118383817272562813199977233417411126959716068072338393084310289588450441128514416597910759814182527294940228828417785903441042114817369303389645545333054503129561885740632378715731405799144085706505382819066670726261358910837171602305916072912729756717338147737273166145500948558122541808933901885205278570148809

    分解
    p = 345709341936068338730678003778405323582109317075021198605451259081268526297654818935837545259489748700537817158904946124698593212156185601832821337576558516676594811692389205842412600462658083813048872307642872332289082295535733483056820073388473845450507806559178316793666044371642249466611007764799781626418800031166072773475575269610775901034485376573476373962417949231752698909821646794161147858557311852386822684705642251949742285300552861190676326816587042282505137369676427345123087656274137257931639760324708350318503061363031086796994100943084772281097123781070811610760735943618425858558459014484742232018933

    q = 345709341936068338730678003778405323582109317075021198605451259081268526297654818935837545259489748700537817158904946124698593212156185601832821337576558516676594811692389205842412600462658083813048872307642872332289082295535733483056820073388473845450507806559178316793666044371642249466611007764799781626418800031166072773475575269610775901034485376573476373962417949231752698909821646794161147858557311852386822684705642251949742285300552861190676326816587042282505137369676427345123087656274137257931639760324708350318503061363031086796994100943084772281097123781070811610760735943618425858558459014484742232019973

  2. 第三布根据已知条件计算私钥的n

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

4 或者用脚本rsatool.py

python rsatool.py -p 345709341936068338730678003778405323582109317075021198605451259081268526297654818935837545259489748700537817158904946124698593212156185601832821337576558516676594811692389205842412600462658083813048872307642872332289082295535733483056820073388473845450507806559178316793666044371642249466611007764799781626418800031166072773475575269610775901034485376573476373962417949231752698909821646794161147858557311852386822684705642251949742285300552861190676326816587042282505137369676427345123087656274137257931639760324708350318503061363031086796994100943084772281097123781070811610760735943618425858558459014484742232018933 -q 345709341936068338730678003778405323582109317075021198605451259081268526297654818935837545259489748700537817158904946124698593212156185601832821337576558516676594811692389205842412600462658083813048872307642872332289082295535733483056820073388473845450507806559178316793666044371642249466611007764799781626418800031166072773475575269610775901034485376573476373962417949231752698909821646794161147858557311852386822684705642251949742285300552861190676326816587042282505137369676427345123087656274137257931639760324708350318503061363031086796994100943084772281097123781070811610760735943618425858558459014484742232019973 -e 31337 -f PEM -o pri.pem

这样就直接生成了私钥的文件,还需要密文

然后用openssl解密,kali下使用命令

openssl rsautl -decrypt -in des.enc -inkey pri.pem -out xx.txt

RSA-Tool 2 by 使用方法

首先要知道这个工具能完成哪些运算

  1. 全数字用10进制,否则用16进制
  2. e是默认16进制,如果要用10进制需要转换一下

    https://tool.oschina.net/hexconvert/

上面选10进制,下面选16进制,正常情况17–>11;23—>17

  1. 若条件给了N,点击Factor N可转成素数p,q
  2. 若条件给了p和q就能转成N,点击Cale.D自动生成N,D

用一个案例演示一下就好了

已知一段 RSA 加密的信息为:0xdc2eeeb2782c 且已知加密所用的公钥:
(N=322831561921859 e = 23)请解密出明文,提交时请将数字转化为 ascii 码提交。
RSATool2,已知c,n,e求m

  1. 图中的 P、Q、R、D、E 分别就是 RSA 算法中的 p、q、N、d、e,右上角选择进制,注意不要弄错,e 只有十六进制可用,所以这里把 23 换成 17。
    (如果给出的全部是数字就选用16进制,如果给出的是含有数字和字母的就选用16进制)
  1. 将N=322831561921859
  1. 左下角有一个 Factor N 的按钮,这是分解 N 的意思,点一下,会自动开始分解因数,得到 P=13574881、Q=23781539
  1. 再点一下 Calc. D,计算出d=42108459725927,这时可以看到 Test 按钮不再是灰色,表明可以使用简单的加解密功能,点它,弹出一个框
  1. 密文 0xdc2eeeb2782c,换算十进制 242094131279916,在密文框输入这个值

  2. 点 Decrypt,直接得到字符串 3a5Y

总结

1,看给的条件情况,若全是数字就是十进制,有字母试试十六进制
2,此工具的e需转成十六进制

  1. 若条件给了N,点击Factor N可转成素数p,q
  2. 因为n=p*q,所以有了p和q就能转成N,点击Cale.D自动生成N,D
  3. 最后点击test进行测试

数字转成字符串

使用代码

from Crypto.Util.number import *
print(long_to_bytes('456463216854648764352164316854651658446'))

python对称加密代码解读

案例1

先学一个基础知识,在Python中,^操作符是按位异或操作符。它用于对两个整数进行按位异或运算,即对两个整数的二进制表示进行逐位比较,如果相应位上的值不同,则结果为1,否则为0。

例如,假设有两个整数a和b,它们的二进制表示分别为a_bin和b_bin。那么a ^ b的结果将是一个新的整数,其二进制表示为a_bin ^ b_bin。

如果 a^b=c
那么 b = a^c
那么 a = b^c

举个例子:

from os import urandom
from secret import flag
key = urandom(1)

def xor(plaintext, key):
    ret = []
    for i in range(len(plaintext)):
        ret.append(plaintext[i] ^ key[0])
    return bytes(ret)

ciphertext = xor(flag, key)

print(ciphertext.hex())
# 9b919c9a8685cd8fa294c8a28c88cc89cea2ce9c878480

解答,又有常识,明文开头是flag{xxxxxxxx

# coding:utf-8
hex_value = "9b919c9a8685cd8fa294c8a28c88cc89cea2ce9c878480"
binary_value =  bytes.fromhex(hex_value)
key = (binary_value[0])^ord('f')
print(key)
flags = ''
for x in binary_value:
    flags+=chr(x^key)
print(flags)

下面是一个简单的示例:

a = 5  # 二进制表示为 0101
b = 3  # 二进制表示为 0011

result = a ^ b  # 二进制表示为 0110,即6

print(result)  # 输出 6

发现一段代码

import base64
def encode():
    flag = '*************'  # 这就是我们要逆向求出来的结果
    ciphertext = []   # 这个值在下面
    for i in range(len(flag)):  # 根据flag值的长度,输出
        s = chr(i ^ ord(flag[i]))
        # 这一段有点拗口,flag第一个值,转换成ascii的值纯数字,与i异或算法,得出来的结果使用chr转换成字母
        # 源关于^这个功能,我在上面介绍
        if i % 2 == 0:
            # 如果循环迭代到双数位置
            s = ord(s) + 10
            # s的结果+10
        else:
            s = ord(s) - 10
        ciphertext.append(str(s))
    return ciphertext[::-1]
    # 将结果倒置一下
ciphertext = [
'96', '65', '93', '123', '91', '97', '22', '93', '70', '102', '94', '132', '46', '112',
'64', '97', '88', '80', '82', '137', '90', '109', '99', '112']

结题代码一下就出来了

res=(ciphertext[::-1]) # 把正确结果调到正确
real = []  # 用来保存修改后的值
for i in range(len(res)):
    z = ''
    # 临时设置一个值,保存矫正的正确数字
    if i%2 ==0:
        z = (int(res[i])-10)
        # 同上逆向矫正
        z = chr(i^z)
        # 然后直接^运算
    else:
        z = (int(res[i]) + 10)
        z = chr(i ^ z)
    real.append(z)
print(''.join(real))

解题思路

rsatools

  1. 知道知道p和q,就能求出n
  2. 知道p和q和e,就能求出n和d
  3. 只要知道n,就能求出q和p

python脚本

  1. 知道p,q,e,c求m

用gmpy2库求解

from Crypto.Util.number import *

from gmpy2 import*

p=447685307 
q=2037
e=17
c=704796792
n=p*q
phi = (p-1)*(q-1)
d=inverse(e,phi)
m=pow(c,d,n)

print(m)

结题笔记

我找到一个整合很到位的网址:

https://blog.csdn.net/m0_74345946/article/details/131192056

就看这个就够了~~

c,n,e求m

已知一段 RSA 加密的信息为:0xdc2eeeb2782c 且已知加密所用的公钥:
(N=322831561921859 e = 23)请解密出明文,提交时请将数字转化为 ascii 码提交。
RSATool2



1. 图中的 P、Q、R、D、E 分别就是 RSA 算法中的 p、q、N、d、e,右上角选择进制,注意不要弄错,e 只有十六进制可用,所以这里把 23 换成 17。
(如果给出的全部是数字就选用16进制,如果给出的是含有数字和字母的就选用16进制)



2.将N=322831561921859 



3. 左下角有一个 Factor N 的按钮,这是分解 N 的意思,点一下,会自动开始分解因数,得到 P=13574881、Q=23781539



4. 再点一下 Calc. D,计算出d=42108459725927,这时可以看到 Test 按钮不再是灰色,表明可以使用简单的加解密功能,点它,弹出一个框


5. 密文 0xdc2eeeb2782c,换算十进制 242094131279916,在密文框输入这个值

6. 点 Decrypt,直接得到字符串 3a5Y

p,q,e求d

RSA 在一次RSA密钥对生成中, 假设 p=473398607161, q=4511491, e=17 求解出d



p = 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483 q = 11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407 e = 65537 c = 83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034




使用方法


给出p=3,q=5,点击Calc.D即可自动算出N和D的值,如果已知N的值,点击Generate即可拿到P和Q的值,再点击test即可进行加密解密操作。

c,n,pq,qp,e求m

# coding:utf-8
from Crypto.Util.number import inverse,long_to_bytes
c= 8722269075970644434253339592758512788160408912707387632591552130175707843950684315083250494010055435391879036285103810263591951437829414438640307561645721347859659807138051841516634704123100270651976676182059252251162982609391666023674158274992400910869692389001622774140191223807887675081808561012755545464977015973615407965906513878979919700065923364884766974187303774330319143647840846354404070430118235352622445115153298578370521811697710289716188726587743282814946239856766713516166990341116198180068191759095913957606379780234116317390622824096667107736103270907349927467971817639795094030622157581511033950777
n= 10466186506773626671397261081802640650185744558208505628349249045496105597268556020207175016523119333667851114848452038431498926527983706092607207796937431312520131882751891731564121558651246025754915145600686076505962750195353958781726515647847167067621799990588328894365930423844435964506372428647802381074584935050067254029262890188260006596141011807724688556673520261743199388391094490191001701011230322653422314758778116196105077883955436582364267530633358016652912054880813710531145973799193443828969535902856467548523653920307742364119002349899553478815101092655897400295925170383678499125295006364960124859003
pq= 10466186506773626671397261081802640650185744558208505628349249045496105597268556020207175016523119333667851114848452038431498926527983706092607207796937431312520131882751891731564121558651246025754915145600686076505962750195353958781726515647847167067621799990588328894365930423844435964506372428647802381074488896197029704465200125337817646702009123916866455067019234171839614862660036737875747177391796376553159880972782837853473250804807544086701088829096838316550146794766718580877976153967582795248676367265069623900208276878140709691073369415161936376086988069213820933152601453587292943483693378833664901178324
qp= 10466186506773626671397261081802640650185744558208505628349249045496105597268556020207175016523119333667851114848452038431498926527983706092607207796937431312520131882751891731564121558651246025754915145600686076505962750195353958781726515647847167067621799990588328894365930423844435964506372428647802381074475956379708898904933143429835002718457573266164923043251954374464149976302585916538814746811455883837138715445492053610047383292461097590195481556557381952895539341802954749542143253491617052100969586396996063822508764438280468492894012685918249843558593322831683872737943676955669923498182824352081785243246
e = 65537
phi = pq*qp//n
print(phi)
d = inverse(e,phi)
m = pow(c,d,n)
print(long_to_bytes(m))

p,q,e,c球m

from Crypto.Util.number import *

from gmpy2 import*

p=447685307 
q=2037
e=17
c=704796792
n=p*q
phi = (p-1)*(q-1)
d=inverse(e,phi)
m=pow(c,d,n)

print(m)

p,q,e,c求m

1、RSA-Tool 2 by tE!

e = 65537 -> 10001

2、
c = 4772758911204771028049020670778336799568778930072841084057809867608022732611295305096052430641881550781141776498904005589873830973301898523644744951545345404578466176725030290421649344936952480254902939417215148205735730754808467351639943474816280980230447097444682489223054499524197909719857300597157406075069204315022703894466226179507627070835428226086509767746759353822302809385047763292891543697277097068406512924796409393289982738071019047393972959228919115821862868057003145401072581115989680686073663259771587445250687060240991265143919857962047718344017741878925867800431556311785625469001771370852474292194

print(pow(c,d,n))

m = 2077392566271985655506271571624317

10进制 -> 16进制:

666C61677B623462795F5235417D

Hex -> Text:
import gmpy2 
from Crypto.Util.number import *
print(long_to_bytes(m))
----- : flag{b4by_R5A}

e,n,c球解密c

使用RSA-Tool分解N,得到q、p;

calc获得D;运行test测试;

解密。



两套e,n,c
e都一样
解密c

import gmpy2 
import binascii

e = 65537 
n1 = 23686563925537577753047229040754282953352221724154495390687358877775380147605152455537988563490716943872517593212858326146811511103311865753018329109314623702207073882884251372553225986112006827111351501044972239272200616871716325265416115038890805114829315111950319183189591283821793237999044427887934536835813526748759612963103377803089900662509399569819785571492828112437312659229879806168758843603248823629821851053775458651933952183988482163950039248487270453888288427540305542824179951734412044985364866532124803746008139763081886781361488304666575456680411806505094963425401175510416864929601220556158569443747 
c1 = 1627484142237897613944607828268981193911417408064824540711945192035649088104133038147400224070588410335190662682231189997580084680424209495303078061205122848904648319219646588720994019249279863462981015329483724747823991513714172478886306703290044871781158393304147301058706003793357846922086994952763485999282741595204008663847963539422096343391464527068599046946279309037212859931303335507455146001390326550668531665493245293839009832468668390820282664984066399051403227990068032226382222173478078505888238749583237980643698405005689247922901342204142833875409505180847943212126302482358445768662608278731750064815

n2 = 22257605320525584078180889073523223973924192984353847137164605186956629675938929585386392327672065524338176402496414014083816446508860530887742583338880317478862512306633061601510404960095143941320847160562050524072860211772522478494742213643890027443992183362678970426046765630946644339093149139143388752794932806956589884503569175226850419271095336798456238899009883100793515744579945854481430194879360765346236418019384644095257242811629393164402498261066077339304875212250897918420427814000142751282805980632089867108525335488018940091698609890995252413007073725850396076272027183422297684667565712022199054289711 

c2 = 2742600695441836559469553702831098375948641915409106976157840377978123912007398753623461112659796209918866985480471911393362797753624479537646802510420415039461832118018849030580675249817576926858363541683135777239322002741820145944286109172066259843766755795255913189902403644721138554935991439893850589677849639263080528599197595705927535430942463184891689410078059090474682694886420022230657661157993875931600932763824618773420077273617106297660195179922018875399174346863404710420166497017196424586116535915712965147141775026549870636328195690774259990189286665844641289108474834973710730426105047318959307995062

p = gmpy2.gcd(n1,n2) # 欧几里得算法,p为两者的最大公约数 

q = n1 // p phi = (p-1)*(q-1)

d = gmpy2.invert(e,phi) 

m = gmpy2.powmod(c1,d,n1)

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

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

共模攻击

两套e,n,c
n都一样
解密c



from Crypto.Util.number import *
from gmpy2 import gcdext
n = 27235417945955877305315479885923738091002489648238576298420353144290606241844795268855190436147498685165492060755987345495512936007288067090612151169350372157131202845335164852936826027543748199249663527064277075801738624261068045961935165466075600260635095351905680802124008717402352789256073813836721932197169205453298497476302051310321480078280697286848120573368705850987929047322275479477686185991959158293365719861923266921578216120593345055867463362968053157705303411833791697212926004547565287036158877828243035757746713073211087041718443527381725569319760574874661567422820859992033429002389706331862551586577
e1 = 87719
e2 = 115127
c1 = 12723299062942630102738910523127284020453510754363793479302698131176068181448118630269425082012593597113536871873123915346711244939183260297496153550011069638768889641583729617308811049169874609234313366012352794062135533546807652247715911033964005841883445120376024200010650691262425249900746974080354101662271143212209834938484294435476917626130580157149453281448465764839052361272515235095138180617635934233516729837888382915688797335109056423674889719794987380386893974570471932695261699069670046671186404302449907617090008457648408079266188590827125640645648577753563757615281059063894230204418179837299790981240
c2 = 17238453157666192628160667652079964464419809686355676673652527346926684465499606616211869859306437820671181312821289950470070172195118169114078251849239159342226576662588234935768080196285528192683608134619505915076956214519841925675469488935344185889533187844728589896328786401006361577506406151018141954956514476793256082068536455646532740293369284597041928140874543885080669341265244521368948715541882353406460347572422846786937251444710152509439835279217069720133512820478146959651987858758018527620328299630217640010364186930644634652609379041025628717065117341233985230402510916526309853729440439571799917729013

_,u,v = gcdext(e1,e2)
m = pow(c1,u,n) * pow(c2,v,n) % n
print(long_to_bytes(m))

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

低加密指数攻击

import gmpy2
from Crypto.Util.number import *

def de(c, e, n):
    k = 0
    while True:
        m = c + n*k
        result, flag = gmpy2.iroot(m, e)
        if True == flag:
            return result
        k += 1
e= 3
n= 0x52d483c27cd806550fbe0e37a61af2e7cf5e0efb723dfc81174c918a27627779b21fa3c851e9e94188eaee3d5cd6f752406a43fbecb53e80836ff1e185d3ccd7782ea846c2e91a7b0808986666e0bdadbfb7bdd65670a589a4d2478e9adcafe97c6ee23614bcb2ecc23580f4d2e3cc1ecfec25c50da4bc754dde6c8bfd8d1fc16956c74d8e9196046a01dc9f3024e11461c294f29d7421140732fedacac97b8fe50999117d27943c953f18c4ff4f8c258d839764078d4b6ef6e8591e0ff5563b31a39e6374d0d41c8c46921c25e5904a817ef8e39e5c9b71225a83269693e0b7e3218fc5e5a1e8412ba16e588b3d6ac536dce39fcdfce81eec79979ea6872793
c= 0x10652cdfaa6b63f6d7bd1109da08181e500e5643f5b240a9024bfa84d5f2cac9310562978347bb232d63e7289283871efab83d84ff5a7b64a94a79d34cfbd4ef121723ba1f663e514f83f6f01492b4e13e1bb4296d96ea5a353d3bf2edd2f449c03c4a3e995237985a596908adc741f32365

m=de(c,e,n)
print(m)
print(long_to_bytes(m))









import gmpy2 
from Crypto.Util.number import *

def de(c, e, n): 
    k = 0 
    while True: 
        m = c + n * k result, flag = gmpy2.iroot(m, e) 
        if True == flag: 
            return result k += 1

e = 3 
n = 18970053728616609366458286067731288749022264959158403758357985915393383117963693827568809925770679353765624810804904382278845526498981422346319417938434861558291366738542079165169736232558687821709937346503480756281489775859439254614472425017554051177725143068122185961552670646275229009531528678548251873421076691650827507829859299300272683223959267661288601619845954466365134077547699819734465321345758416957265682175864227273506250707311775797983409090702086309946790711995796789417222274776215167450093735639202974148778183667502150202265175471213833685988445568819612085268917780718945472573765365588163945754761 
c = 150409620528139732054476072280993764527079006992643377862720337847060335153837950368208902491767027770946661

m = de(c, e, n) 
print(m) 
print(long_to_bytes(m))










from Crypto.Util.number import *

def get_pq(a,b,c):      # 由p+q和pq的值通过维达定理来求解p和q
    par=isqrt(b*b-4*a*c)   # 由上述可得,开根号一定是整数,因为有解
    x1,x2=(-b+par)//(2*a),(-b-par)//(2*a)
    return x1,x2

def wienerAttack(e,n):
    for dk in continued_fraction(e/n).convergents(): 
        d = dk.denominator()
        k = dk.numerator()
        if k==0:                     # 可能会出现连分数的第一个为0的情况,排除
            continue
        if (e*d-1)%k!=0:             # ed=1 (mod φ(n)) 因此如果找到了d的话,(ed-1)会整除 φ(n),也就是存在k使得(e*d-1)//k=φ(n)
            continue
        phi=(e*d-1)//k               # 这个结果就是 φ(n)
        px,qy=get_pq(1,n-phi+1,n)
        if px*qy==n:
            p,q=abs(int(px)),abs(int(qy))     # 可能会得到两个负数,负负得正未尝不会出现
            d=inverse(e,(p-1)*(q-1))     # 求ed=1 (mod  φ(n))的结果,也就是e关于 φ(n)的乘法逆元d
            return d
    print("该方法不适用")

n = 15088604128478468977566549781105092683347539947348937490176419856356065434456779556064092549108615523127666554897844330164168229344072311774605533892734588398052920720635504619280237988159486581078687811307922574023224119128640446733102319281384567142284146095475216753185154191721944236464638911559894028485432795189775795831433934161095833583153532968049868435932884483661140855893363480029071277412363917343948514737408834993781077430331977564387866552105817476279408735993480716805300450493181681413405987292272733017014550825672240924489724844725325931897081230290178227062710064903854344354557049800111205687197
e = 790142680055451797287471412348850571010486995509022389039756914714559607878217133093316171823607854252726685939931818326808367362243744306142193144042300423428274544907281455058012658772015876990050157589177318880578375252515206769099355808606968684061844566345930280809023645248443130147277438333825548805734080416665789226478379710244036997877325674271526429108712875192888158335939716083256112177193790258171223899489719203252256888818777923376238918119595364810493883858015687532376703938184808317229942799291302711237311062630130553574846019928363972312260820571126554487165159492848299527173505694474097994587
c = 5506806473846050197095534924873053009955837252724617326703967025931017796089327573032228468881762244339142609915863307479644751778961843466686220687863499734629695808563115879790742322778570499788472782252536410852811749191269483232006252750937168108094746385250524894904282857367448778825919736341780839616335236183799339760376367656113963860479277535575918673496483084779331958090456462677018388746643839357078746610506188838811958414895770899920197584850991513686247975668057301261160534405883093755580091313937238128158300865835312776083074991966213689048768359829887854513429838452992818030264685993228541502080
d = wienerAttack(e,n)
m = pow(c,d,n)
print(long_to_bytes(m))

n,e,c 其中e特别特别特别长

from Crypto.Util.number import *

def get_pq(a,b,c):      # 由p+q和pq的值通过维达定理来求解p和q
    par=isqrt(b*b-4*a*c)   # 由上述可得,开根号一定是整数,因为有解
    x1,x2=(-b+par)//(2*a),(-b-par)//(2*a)
    return x1,x2

def wienerAttack(e,n):
    for dk in continued_fraction(e/n).convergents(): 
        d = dk.denominator()
        k = dk.numerator()
        if k==0:                     # 可能会出现连分数的第一个为0的情况,排除
            continue
        if (e*d-1)%k!=0:             # ed=1 (mod φ(n)) 因此如果找到了d的话,(ed-1)会整除 φ(n),也就是存在k使得(e*d-1)//k=φ(n)
            continue
        phi=(e*d-1)//k               # 这个结果就是 φ(n)
        px,qy=get_pq(1,n-phi+1,n)
        if px*qy==n:
            p,q=abs(int(px)),abs(int(qy))     # 可能会得到两个负数,负负得正未尝不会出现
            d=inverse(e,(p-1)*(q-1))     # 求ed=1 (mod  φ(n))的结果,也就是e关于 φ(n)的乘法逆元d
            return d
    print("该方法不适用")

n = 468459887279781789188886188573017406548524570309663876064881031936564733341508945283407498306248145591559137207097347130203582813352382018491852922849186827279111555223982032271701972642438224730082216672110316142528108239708171781850491578433309964093293907697072741538649347894863899103340030347858867705231
e = 284100478693161642327695712452505468891794410301906465434604643365855064101922252698327584524956955373553355814138784402605517536436009073372339264422522610010012877243630454889127160056358637599704871937659443985644871453345576728414422489075791739731547285138648307770775155312545928721094602949588237119345
c = 350429162418561525458539070186062788413426454598897326594935655762503536409897624028778814302849485850451243934994919418665502401195173255808119461832488053305530748068788500746791135053620550583421369214031040191188956888321397450005528879987036183922578645840167009612661903399312419253694928377398939392827
d = wienerAttack(e,n)
m = pow(c,d,n)
print(long_to_bytes(m))

知道e,q,p,n

费马分解

代码,有计算出来的n和c,

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)
# n = 26737417831000820542131903300607349805884383394154602685589253691058592906354935906805134188533804962897170211026684453428204518730064406526279112572388086653330354347467824800159214965211971007509161988095657918569122896402683130342348264873834798355125176339737540844380018932257326719850776549178097196650971801959829891897782953799819540258181186971887122329746532348310216818846497644520553218363336194855498009339838369114649453618101321999347367800581959933596734457081762378746706371599215668686459906553007018812297658015353803626409606707460210905216362646940355737679889912399014237502529373804288304270563
# c = 18343406988553647441155363755415469675162952205929092244387144604220598930987120971635625205531679665588524624774972379282080365368504475385813836796957675346369136362299791881988434459126442243685599469468046961707420163849755187402196540739689823324440860766040276525600017446640429559755587590377841083082073283783044180553080312093936655426279610008234238497453986740658015049273023492032325305925499263982266317509342604959809805578180715819784421086649380350482836529047761222588878122181300629226379468397199620669975860711741390226214613560571952382040172091951384219283820044879575505273602318856695503917257

题目长得这样

结题答案如下

import gmpy2,libnum 
from Crypto.Util.number import getPrime 
from rsa import common 
import binascii 

n = 26737417831000820542131903300607349805884383394154602685589253691058592906354935906805134188533804962897170211026684453428204518730064406526279112572388086653330354347467824800159214965211971007509161988095657918569122896402683130342348264873834798355125176339737540844380018932257326719850776549178097196650971801959829891897782953799819540258181186971887122329746532348310216818846497644520553218363336194855498009339838369114649453618101321999347367800581959933596734457081762378746706371599215668686459906553007018812297658015353803626409606707460210905216362646940355737679889912399014237502529373804288304270563 

c = 18343406988553647441155363755415469675162952205929092244387144604220598930987120971635625205531679665588524624774972379282080365368504475385813836796957675346369136362299791881988434459126442243685599469468046961707420163849755187402196540739689823324440860766040276525600017446640429559755587590377841083082073283783044180553080312093936655426279610008234238497453986740658015049273023492032325305925499263982266317509342604959809805578180715819784421086649380350482836529047761222588878122181300629226379468397199620669975860711741390226214613560571952382040172091951384219283820044879575505273602318856695503917257 

e = 0x10001 

N=gmpy2.iroot(n,2) 
q=gmpy2.next_prime(N[0]) 
p=n//q l=(p-1)*(q-1) 
d=common.inverse(e,l) 
m=pow(c,d,n) 
print(binascii.unhexlify(hex(m)[2:]))

题目这样

e = 0x10001
p>>128<<128 = 0xd1c520d9798f811e87f4ff406941958bab8fc24b19a32c3ad89b0b73258ed3541e9ca696fd98ce15255264c39ae8c6e8db5ee89993fa44459410d30a0a8af700ae3aee8a9a1d6094f8c757d3b79a8d1147e85be34fb260a970a52826c0a92b46cefb5dfaf2b5a31edf867f8d34d2222900000000000000000000000000000000
n = 0x79e0bf9b916e59286163a1006f8cefd4c1b080387a6ddb98a3f3984569a4ebb48b22ac36dff7c98e4ebb90ffdd9c07f53a20946f57634fb01f4489fcfc8e402865e152820f3e2989d4f0b5ef1fb366f212e238881ea1da017f754d7840fc38236edba144674464b661d36cdaf52d1e5e7c3c21770c5461a7c1bc2db712a61d992ebc407738fc095cd8b6b64e7e532187b11bf78a8d3ddf52da6f6a67c7e88bef5563cac1e5ce115f3282d5ff9db02278859f63049d1b934d918f46353fea1651d96b2ddd874ec8f1e4b9d487d8849896d1c21fb64029f0d6f47e560555b009b96bfd558228929a6cdf3fb6d47a956829fb1e638fcc1bdfad4ec2c3590dea1ed3
c = 0x1b2b4f9afed5fb5f9876757e959c183c2381ca73514b1918d2f123e386bebe9832835350f17ac439ac570c9b2738f924ef49afea02922981fad702012d69ea3a3c7d1fc8efc80e541ca2622d7741090b9ccd590906ac273ffcc66a7b8c0d48b7d62d6cd6dd4cd75747c55aac28f8be3249eb255d8750482ebf492692121ab4b27b275a0f69b15baef20bf812f3cbf581786128b51694331be76f80d6fb1314d8b280eaa16c767821b9c2ba05dfde5451feef22ac3cb3dfbc88bc1501765506f0c05045184292a75c475486b680f726f44ef8ddfe3c48f75bb03c8d44198ac70e6b7c885f53000654db22c8cee8eb4f65eaeea2da13887aaf53d8c254d2945691

答案:

from Crypto.Util.number import *
import gmpy2

e = 0x10001
c = 0x1b2b4f9afed5fb5f9876757e959c183c2381ca73514b1918d2f123e386bebe9832835350f17ac439ac570c9b2738f924ef49afea02922981fad702012d69ea3a3c7d1fc8efc80e541ca2622d7741090b9ccd590906ac273ffcc66a7b8c0d48b7d62d6cd6dd4cd75747c55aac28f8be3249eb255d8750482ebf492692121ab4b27b275a0f69b15baef20bf812f3cbf581786128b51694331be76f80d6fb1314d8b280eaa16c767821b9c2ba05dfde5451feef22ac3cb3dfbc88bc1501765506f0c05045184292a75c475486b680f726f44ef8ddfe3c48f75bb03c8d44198ac70e6b7c885f53000654db22c8cee8eb4f65eaeea2da13887aaf53d8c254d2945691
p = 104447286451939566076017797038369998283019120860149982200602344749600436385708441695230995780714906769626731151644722579252428917819367256207463696691033967714073069435280785389775459281272218174741165454138432242201951151298026448827619971129737985262978620243577274864410816225725466321200461416855483876019
q = 147305526294483975294006704928271118039370615054437206404408410848858740256154476278591035455064149531353089038270283281541411458250950936656537283482331598521457077465891874559349872035197398406708610440618635013091489698011474611145014167945729411970665381793142591665313979405475889978830728651549052207969
n = p*q
phi = (p-1)*(q-1)
d = gmpy2.invert(e,phi)
m = pow(c,d,n)
print(m)
print(long_to_bytes(m))
#b'flag{Kn0wn_Hi9h_Bit5}'
坚持原创技术分享,您的支持将鼓励我继续创作!

-------------本文结束感谢您的阅读-------------

腾讯云主机优惠打折:最新活动地址


版权声明

LangZi_Blog's by Jy Xie is licensed under a Creative Commons BY-NC-ND 4.0 International License
由浪子LangZi创作并维护的Langzi_Blog's博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证
本文首发于Langzi_Blog's 博客( http://langzi.fun ),版权所有,侵权必究。

0%