ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2021 绿城杯 Crypto 部分wp

2021-09-29 19:05:33  阅读:371  来源: 互联网

标签:gmpy2 text str1 Crypto flag cipher 2021 wp import


1题目.

from Crypto.Util.number import *
from flag import flag
assert flag[:5]=='flag{'

str1 = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
def encode(plain_text, a, b, m):
	cipher_text = ''
	for i in plain_text:
		if i in str1:
			addr = str1.find(i)
			cipher_text += str1[(a*addr+b) % m]
		else:
			cipher_text += i
	print(cipher_text)


encode(flag,37,23,52)
# cipher_text = 'aoxL{XaaHKP_tHgwpc_hN_ToXnnht}'

传统的仿射加密方法。
明确给出了加密方式和加密的参数。

即:将明文中的每一个字母,一对一地映射到密码表的一个字母,类似键值对的关系。
将每一个字符通过加密函数得到对应的加密集,反过来就是对应的解密集。

str1 = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'

def encode(plain_text, a, b, m):
	cipher_text = ''
	for i in plain_text:
		if i in str1:
			addr = str1.find(i)
			cipher_text += str1[(a*addr+b) % m]
		else:
			cipher_text += i
	return cipher_text

dec = {}
for ch in str1:
    enc_ch = encode(ch,37,23,52)
    dec[enc_ch] = ch  # 将一个密文字符映射到一个明文字符

def decode(enc):
    if enc in str1:
        return dec[enc]
    return enc # 若字符未经加密则直接返回

cipher_text = 'aoxL{XaaHKP_tHgwpc_hN_ToXnnht}'
print(''.join(decode(i) for i in cipher_text)) #打印明文

即可得到flag

flag{AffInE_CIpheR_iS_clAssiC}

经典仿射加密

2.题目:

from Crypto.Util.number import *
import gmpy2
from flag import flag
assert flag[:5]==b'flag{'

m = bytes_to_long(flag)
p = getPrime(1024)
q = getPrime(1024)
n = p * q
print('n =',n)
e = 0x10001
M = 2021 * m * 1001 * p 
c = pow(M,e,n)
print('c =',c)

#n = 17365231154926348364478276872558492775911760603002394353723603461898405740234715001820111548600914907617003806652492391686710256274156677887101997175692277729648456087534987616743724646598234466094779540729413583826355145277980479040157075453694250572316638348121571218759769533738721506811175866990851972838466307594226293836934116659685215775643285465895317755892754473332034234495795936183610569571016400535362762699517686781602302045048532131426035260878979892169441059467623523060569285570577199236309888155833013721997933960457784653262076135561769838704166810384309655788983073376941843467117256002645962737847
#c = 6944967108815437735428941286784119403138319713455732155925055928646536962597672941805831312130689338014913452081296400272862710447207265099750401657828165836013122848656839100854719965188680097375491193249127725599660383746827031803066026497989298856420216250206035068180963797454792151191071433645946245914916732637007117085199442894495667455544517483404006536607121480678688000420422281380539368519807162175099763891988648117937777951069899975260190018995834904541447562718307433906592021226666885638877020304005614450763081337082838608414756162253825697420493509914578546951634127502393647068722995363753321912676

已知e,c,n,要求出flag,也就是要求出M
网站尝试分解n无果,只能从已知条件入手

>>> gmpy2.gcd(c,n)
mpz(150290608270992439844054823303154263794197803561695786056860615174575181277160032222859532335454486914357850849343036173838960820180867595169623670363963732315901587946639577107202780317748525709407153327463601548012321945759392416846089189522151851138821377551427960151260776474250605261723480167088408148729) 

于是成功分解n。

暂时将值分别赋值给p和q

>>> p = gmpy2.gcd(c,n)
>>> n%p
mpz(0)
>>> q = n//p

按步骤求出M

>>> e = 0x10001
>>> d = gmpy2.invert(e,p*q-p-q+1)
>>> M = pow(c,d,n)
>>> M
mpz(839557191476857941665476233330553501713716497294339152125932992839650592721485160403872136110418315458948348727530876368684706703897783475419961094360953385279781752500013759979228820668731130857877240875446092111185288540800083174791533659316206649254642561508806513443981994150015387695427576272218347161581110192205737072101697927873587752287392581838322987297150976125070114122865)

简单验算一下

>>> M%(2021*1001)
mpz(0)
>>> M%p
mpz(0)
>>> M%q
mpz(65474612994490743595307567400845726353964817450673526189849002591413379171120763579510522074305688595930063254638994149917069894951411587526157497240809530223522800190882193052998942162841327139276763569667223325545897581055534679226351135493091367975534910324477596809108688286418194639519316314924020879894)

这里 M % p == 0,直接除去即可得到m,即flag

>>> m = M//2021//1001//p
>>> import binascii
>>> binascii.unhexlify(hex(m)[2:])
b'flag{Math_1s_1nterest1ng_hah}'

既得flag:

flag{Math_1s_1nterest1ng_hah}

数学真有趣2333

完整代码:

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

n = 17365231154926348364478276872558492775911760603002394353723603461898405740234715001820111548600914907617003806652492391686710256274156677887101997175692277729648456087534987616743724646598234466094779540729413583826355145277980479040157075453694250572316638348121571218759769533738721506811175866990851972838466307594226293836934116659685215775643285465895317755892754473332034234495795936183610569571016400535362762699517686781602302045048532131426035260878979892169441059467623523060569285570577199236309888155833013721997933960457784653262076135561769838704166810384309655788983073376941843467117256002645962737847
c = 6944967108815437735428941286784119403138319713455732155925055928646536962597672941805831312130689338014913452081296400272862710447207265099750401657828165836013122848656839100854719965188680097375491193249127725599660383746827031803066026497989298856420216250206035068180963797454792151191071433645946245914916732637007117085199442894495667455544517483404006536607121480678688000420422281380539368519807162175099763891988648117937777951069899975260190018995834904541447562718307433906592021226666885638877020304005614450763081337082838608414756162253825697420493509914578546951634127502393647068722995363753321912676
e = 0x10001

p = gmpy2.gcd(c,n)
q = n // p

phin = (p-1) * (q-1)
d = gmpy2.invert(e,phin)
M = pow(c,d,n)
assert M % (2021*1001) == 0 and M % p == 0

m = M // 2021 // 1001 // p
print(binascii.unhexlify(hex(m)[2:]))

标签:gmpy2,text,str1,Crypto,flag,cipher,2021,wp,import
来源: https://blog.csdn.net/u010883831/article/details/120553690

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有