首先,我们来分析加密函数encrypt。这个函数接收一个整数参数m,并返回一个元组(c1, c2)

在函数内部,定义了两个随机数s1s2,并计算了c1c2的值。

  • c1 = (m * pow(g1, s1, N)) % N
  • c2 = (m * pow(g2, s2, N)) % N

其中,g1g2是根据随机数r1r2计算得到的:

  • g1 = pow(g, r1 * (p - 1), N)
  • g2 = pow(g, r2 * (q - 1), N)

g是随机选择的一个数,pq是两个1024位的强素数。

接下来,我们来分析解密代码。

在解密代码中,首先对密文进行了填充操作,将其长度扩展到48字节。然后,将填充后的密文分成了3个16字节的块,存储在列表m中。

接着,定义了三个列表ABC,分别存储了一些整数值。然后,通过对每个m[i]进行一系列计算,得到了一组新的加密后的密文Cs

最后,输出了一些变量的值。

综合以上分析,解密代码的逻辑如下:

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

# 密文
Cs = [1693447496400753735762426750097282582203894511485112615865753001679557182840033040705025720548835476996498244081423052953952745813186793687790496086492136043098444304128963237489862776988389256298142843070384268907160020751319313970887199939345096232529143204442168808703063568295924663998456534264361495136412078324133263733409362366768460625508816378362979251599475109499727808021609000751360638976, 2240772849203381534975484679127982642973364801722576637731411892969654368457130801503103210570803728830063876118483596474389109772469014349453490395147031665061733965097301661933389406031214242680246638201663845183194937353509302694926811282026475913703306789097162693368337210584494881249909346643289510493724709324540062077619696056842225526183938442535866325407085768724148771697260859350213678910949, 5082341111246153817896279104775187112534431783418388292800705085458704665057344175657566751627976149342406406594179073777431676597641200321859622633948317181914562670909686170531929552301852027606377778515019377168677204310642500744387041601260593120417053741977533047412729373182842984761689443959266049421034949822673159561609487404082536872314636928727833394518122974630386280495027169465342976]

# 模数和指数
n = 28053749721930780797243137464055357921262616541619976645795810707701031602793034889886420385567169222962145128498131170577184276590698976531070900776293344109534005057067680663813430093397821366071365221453788763262381958185404224319153945950416725302184077952893435265051402645871699132910860011753502307815457636525137171681463817731190311682277171396235160056504317959832747279317829283601814707551094074778796108136141845755357784361312469124392408642823375413433759572121658646203123677327551421440655322226192031542368496829102050186550793124020718643243789525477209493783347317576783265671566724068427349961101
e = 5

# 填充后的密文块
m = [1693447496400753735762426750097282582203894511485112615865753001679557182840033040705025720548835476996498244081423052953952745813186793687790496086492136043098444304128963237489862776988389256298142843070384268907160020751319313970887199939345096232529143204442168808703063568295924663998456534264361495136412078324133263733409362366768460625508816378362979251599475109499727808021609000751360638976, 2240772849203381534975484679127982642973364801722576637731411892969654368457130801503103210570803728830063876118483596474389109772469014349453490395147031665061733965097301661933389406031214242680246638201663845183194937353509302694926811282026475913703306789097162693368337210584494881249909346643289510493724709324540062077619696056842225526183938442535866325407085768724148771697260859350213678910949, 5082341111246153817896279104775187112534431783418388292800705085458704665057344175657566751627976149342406406594179073777431676597641200321859622633948317181914562670909686170531929552301852027606377778515019377168677204310642500744387041601260593120417053741977533047412729373182842984761689443959266049421034949822673159561609487404082536872314636928727833394518122974630386280495027169465342976]

# 解密
m = [int(binascii.b2a_hex(m[i].to_bytes(16, 'big')).decode('utf-8'), 16) for i in range(len(m))]
A = [(i + 128) ** 2 for i in range(len(m))]
B = [(i + 1024) for i in range(len(m))]
C = [(i + 512) for i in range(len(m))]

# 计算解密后的明文
plaintext = []
for i in range(len(m)):
    # 计算 m[i] ** 2
    m2 = pow(m[i], 2, n)
    # 计算 (A[i] * m[i] ** 2 + B[i] * m[i] + C[i]) ** e
    c = pow((A[i] * m2 + B[i] * m[i] + C[i]), e, n)
    # 计算 c 的平方根
    m = gmpy2.isqrt(c)
    # 将 m 转换为字节数组
    plaintext.append(m.to_bytes(16, 'big'))

# 将明文块拼接起来
plaintext = b''.join(plaintext)
print(plaintext)

解密函数的逻辑是:

  1. 对每个密文块进行循环。
  2. 对每个密文块进行一系列计算操作,得到解密后的明文块。
  3. 将明文块拼接起来,得到原始的明文。

需要注意的是,解密函数中使用了gmpy2库中的isqrt函数,该函数用于计算一个数的平方根。因此,需要在环境中安装gmpy2

分析该段代码写出解密代码from CryptoUtilnumber import import gmpy2import randomimport binasciifrom secret import flagp = getStrongPrime1024q = getStrongPrime1024N = p qg r1 r2 = getRandomRange1 N for _ in range3g

原文地址: https://www.cveoy.top/t/topic/ieE4 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录