NSSCTF——Round16——Crypto题解
pr
task
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| from Crypto.Util.number import * import random
flag=plaintext = 'NSSCTF{****************}' charset = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' padding_length = 100 - len(plaintext)
for _ in range(padding_length): plaintext += random.choice(charset)
public_exponent = 31413537523 message = bytes_to_long(plaintext.encode()) assert message > (1 << 512) assert message < (1 << 1024)
prime_p = getPrime(512) prime_q = getPrime(512) prime_r = getPrime(512) n1 = prime_p * prime_q n2 = prime_q * prime_r ciphertext1 = pow(message, public_exponent, n1) ciphertext2 = pow(message, public_exponent, n2) print('c1=', ciphertext1) print('c2=', ciphertext2) print('p=', prime_p) print('r=', prime_r)
''' c1= 36918910341116680090654563538246204134840776220077189276689868322808977412566781872132517635399441578464309667998925236488280867210758507758915311644529399878185776345227817559234605958783077866016808605942558810445187434690812992072238407431218047312484354859724174751718700409405142819140636116559320641695 c2= 15601788304485903964195122196382181273808496834343051747331984997977255326224514191280515875796224074672957848566506948553165091090701291545031857563686815297483181025074113978465751897596411324331847008870832527695258040104858667684793196948970048750296571273364559767074262996595282324974180754813257013752 p= 12101696894052331138951718202838643670037274599483776996203693662637821825873973767235442427190607145999472731101517998719984942030184683388441121181962123 r= 10199001137987151966640837133782537428248507382360655526592866939552984259171772190788036403425837649697437126360866173688083643144865107648483668545682383 '''
|
p,r都给了,在模p和模r下各求解一次,然后中国剩余定理组合即可
Exp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| from Crypto.Util.number import * import gmpy2
e = 31413537523 c1= c2= p= r=
dp = gmpy2.invert(e,p-1) dr = gmpy2.invert(e,r-1)
mp = pow(c1,dp,p) mr = pow(c2,dr,r)
m = CRT_list([int(mp),int(mr)],[p,r]) flag = long_to_bytes(int(m)) print(flag)
|
break
私钥文件缺失
因为$c \approx 2046bit$,可以推断出$n \approx 2048bit$
参考CTF Crypto — 七八月份比赛杂题记录_ctf替换了部分模型权重-CSDN博客中的”你懂RSA吗“
这三段分别是$q,d_p,d_q$
exp:
1 2 3 4 5 6 7 8 9 10 11
| from Crypto.Util.number import *
q = 0xe26146b07b963eacf6c585538c541f190727cc6b82e37920dd676de3106bf29411d27b2bc5090ab7212504e349350f65e699e69930bddad67527e8e448586686da985cc2b58b911ea7b9b5666f54094b38339851c69cbe7a2870726710fdaba0cf07ea3a8065adf3fe9d741976348654ff56ed74f420a237c05d7245cd1f7645 dp = 0xbbaa507453b9b653815d1bd79e95277e59228d515965640b878e2ee3821ecec7a2daf713799a2199d72bcfe38c97db5f0e27d662d3ca3abc8acce848a5e392b34ed1a6e22b889fc08ca68c7ee5e52da31cafc5af6bb365aef8845937dcc2304fa9faa23cfd31b6edd2320f3b1d80da9c528f044a5b3bb96e7f14403b6d84c289 dq = 0xbbd4ac9b781fa4674ce57c8762f2d54ea5e23eb9a1c36dd877fbfe701d4b03de199f83b5406a0d2aff6440d6f901fe81b54152d51e5d18bb423fd7fbb98f279a92bb429407a002cbe5acafb78b7db5ac64b86294cf6f7497d4ffdfdc667ba3b0ecb68b80f8d1e4f082fd4fbc64989630e61fd12c6df6b9c1fa694e8c5df2d1e5 inv = 0x3fec91f745c465b184793a535992dbb20cf6324d83dc4bcf99f1ce4a8f3e12e7fab760208b93b90b6ffbe7848c43fefbb655d74ae0e7229525dfdbc72f07d8837b690a3b9195ae9474d00d9305c203a19f4bba825262faa0bc6d6cd80c5390485ad8f57437bf028cb29aa6fbaf7bc4cf9d3145b42cc2faa1413d663122018ff9 c = 6081370370545409218106271903400346695565292992689150366474451604281551878507114813906275593034729563149286993189430514737137534129570304832172520820901940874698337733991868650159489601159238582002010625666203730677577976307606665760650563172302688129824842780090723167480409842707790983962415315804311334507726664838464859751689906850572044873633896253285381878416855505301919877714965930289139921111644393144686543207867970807469735534838601255712764863973853116693691206791007433101433703535127367245739289103650669095061417223994665200039533840922696282929063608853551346533188464573323230476645532002621795338655
m = pow(c,dq,q) print(long_to_bytes(m))
|