vctf crypto

文章展示了如何利用AES(AdvancedEncryptionStandard)进行CBC模式加密,并通过RSA算法进行公钥加密,同时介绍了密钥恢复的过程,以及如何使用欧拉函数和模指数运算来计算私钥解密。
摘要由CSDN通过智能技术生成

狂飙

import os
from flag import flag
from Crypto.Util.number import *
from Crypto.Cipher import AES
m = 88007513702424243702066490849596817304827839547007641526433597788800212065249
key = os.urandom(24)
key = bytes_to_long(key)
n=m % key
flag += (16 - len(flag) % 16) * b'\x00'
iv = os.urandom(16)
aes = AES.new(key,AES.MODE_CBC,iv)
enc_flag = aes.encrypt(flag)
​
print(n)
print(enc_flag)
print(iv)
​
​
#103560843006078708944833658339172896192389513625588
#b'\xfc\x87\xcb\x8e\x9d\x1a\x17\x86\xd9~\x16)\xbfU\x98D\xfe\x8f\xde\x9c\xb0\xd1\x9e\xe7\xa7\xefiY\x95C\x14\x13C@j1\x9d\x08\xd9\xe7W>F2\x96cm\xeb'
#b'UN\x1d\xe2r<\x1db\x00\xdb\x9a\x84\x1e\x82\xf0\x86'

由题意可得m-n=0(modkey),所以key是m-n的因数,先对m-n进行因式分解。

根据key长度为24求得部分key后,遍历所有的key代入求解即可得到flag

n=103560843006078708944833658339172896192389513625588
m = 88007513702424243702066490849596817304827839547007641526433597788800212065249
enc_flag=b'\xfc\x87\xcb\x8e\x9d\x1a\x17\x86\xd9~\x16)\xbfU\x98D\xfe\x8f\xde\x9c\xb0\xd1\x9e\xe7\xa7\xefiY\x95C\x14\x13C@j1\x9d\x08\xd9\xe7W>F2\x96cm\xeb'
iv=b'UN\x1d\xe2r<\x1db\x00\xdb\x9a\x84\x1e\x82\xf0\x86'
k=[3,37,439,3939851,265898280367,5036645362649,342291058100503482469327892079792475478873]
key=[]
def getkey(s,i):
    for j in range(i,len(k)):
        if(len(long_to_bytes(s*k[i]))==24):
            if(s*k[i] not in key):
                key.append(s*k[i])
            return
        getkey(s,j+1)
        getkey(s*k[j],j+1)
getkey(1,0)
for i in key:
    aes = AES.new(long_to_bytes(i),AES.MODE_CBC,iv)
    print(aes.decrypt(enc_flag))
#flag{cf735a4d-f9d9-5110-8a73-5017fc39b1b0}

RRSA

from flag import flag
import random
from Crypto.Util.number import *
​
def genprime():
    o = getPrime(300)
    while True:
        r = random.randint(2**211,2**212)
        if isPrime(o*r+1):
            return o,o*r+1
o1,p = genprime()
o2,q = genprime()
n=p*q
g = random.randint(2,n)
order = o1*o2
​
a = pow(g, (p-1)*(q-1)//order, n)
assert pow(a,order,n)==1
​
m = bytes_to_long(flag)
e = 65537
c = pow(m,e,n)
print(f'n={n}')
print(f'c={c}')
print(f'a={a}')
print(f'o={order}')
n=44435425447782114838897637647733409614831121089064725526413247701631122523646623518523253532066782191116739274354991533158902831935676078270115998050827358178237970133151467497051097694866238654012042884894924846645692294679774577780414805605811029994570132760841672754334836945991390844881416693502552870759
c=41355409695119524180275572228024314281790321005050664347253778436753663918879919757571129194249071204946415158483084730406579433518426895158142068246063333111438863836668823874266012696265984976829088976346775293102571794377818611709336242495598331872036489022428750111592728015245733975923531682859930386731
a=39844923600973712577104437232871220768052114284995840460375902596405104689968610170336151307934820030811039502338683925817667771016288030594299464019664781911131177394369348831163266849069740191783143327911986419528382896919157135487360024877230254274474109707112110411601273850406237677432935818199348150470
o=1745108106200960949680880500144134006212310627077303652648249235148621661187609612344828833696608872318217367008018829485062303972702933973340909520462917612611270028511222134076453

根据p,q的生成可知n=(o1r1+1)(o2r2+1)=o1o2r1r2+o1r1+o2r2+1,所以可知n-1=o1r1+o2r2(mod order),而o1r1+o2r2是小于order的,因此可以直接得到o1r1o2r2,phi=o1o2r1r2,所以phi=n-1-o1r1-o2r2,剩下的就很简单了。

n=44435425447782114838897637647733409614831121089064725526413247701631122523646623518523253532066782191116739274354991533158902831935676078270115998050827358178237970133151467497051097694866238654012042884894924846645692294679774577780414805605811029994570132760841672754334836945991390844881416693502552870759
c=41355409695119524180275572228024314281790321005050664347253778436753663918879919757571129194249071204946415158483084730406579433518426895158142068246063333111438863836668823874266012696265984976829088976346775293102571794377818611709336242495598331872036489022428750111592728015245733975923531682859930386731
a=39844923600973712577104437232871220768052114284995840460375902596405104689968610170336151307934820030811039502338683925817667771016288030594299464019664781911131177394369348831163266849069740191783143327911986419528382896919157135487360024877230254274474109707112110411601273850406237677432935818199348150470
o=1745108106200960949680880500144134006212310627077303652648249235148621661187609612344828833696608872318217367008018829485062303972702933973340909520462917612611270028511222134076453
phi=n-1-((n-1)%o)
e=65537
d=inverse(e,phi)
print(long_to_bytes(pow(c,d,n)))
#flag{0228FC7F-C865-BD0F-F124-9F9860B3542B}

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值