A*m+B*n=D问题的数学推导求解

本文介绍了一种解决A*m+B*n=D问题的方法,其中D是m和n的最大公因数。通过数学推导详细解释了算法步骤,并给出了具体的交换值算法。

    

       A*m+B*n=D问题的数学推导求解

流浪狗  2006.3

  正整数mn,求mn的最大公约数问题是一个算法入门的题目。但是要求解两个整数AB,使得A*m+B*n=DDm,n的最大公因数。求解最大公约数的问题可以表示如下:

1)            输入正整数m,n

2)            r=m%n;

3)            判断r是否等于0,如果等于0,则结束

4)            m=n;  n=r;转到(2

5)            输出n

  而要求解A*m+B*n=D的问题,令

    a'*m+b'*n=c,

    a*m+b*n=d

在程序运行过程中始终成立,则

1)            输入m,n

2)            a'=b=1,a=b'=0,c=m,d=n;

3)            q=c/d;r=c%d;

4)            判断r是否等于0,如果等于0,则结束

5)            交换值,怎样交换?转向(3

具体怎样交换呢?我们可以通过数学推倒来确定。

已知条件为

  ck1dk,

    dk1rk,

    rk+1=ck+1%dk+1

因为

  a’k*m+b’k*n=ck,

     ak*m+bk*n=dk

所以

  a’k1*m+b’k1*n=ck1dk= ak*m+bk*n

由于a’k1b’k1akbk都是整数,故有

a’k1ak;    b’k1=bk; ……………………………………….(1)

 

  ak1*m+bk1*ndk1rk= ck% dk= ck-q* dk

ak1*m+bk1*n=a’k*m+b’k*n-q*( ak*m+bk*n)

ak1*m+bk1*n=( a’k-q* ak)*m+( b’k-q* bk)

故有

   ak1= a’k-q* ak;    bk1= b’k-q* bk………………………..(2)

由(1)(2)可以得出第5步的具体算法:

 

   c=d; d=r;
   t=a’;
   a’=a;
   a=t-q*a;
   t=b’;
   b’=b;
   b=t-q*b;

 

from Crypto.Util.number import * n=1130559951242142418553461557920917245278152787036994964813122956739956040733223190585188299825937660853090732755660557900622564346469528239989519875434612493124663925800482373019421482927567375862528994310090666571233446002163478309309649223886467303834842172338454971591276606602163799133000582891965785243482166772793400065793927508012418516719549212969303944155066541587875789636798394581666621711612432864870236407912486149901575077993702841083287354610398446101725184000000000000000000000000000000149 e=65537 m=bytes_to_long(flag) def zhuanzhuan(n): if n < 2: return n return 9* zhuanzhuan(n - 1) + zhuanzhuan(n - 2) g = 1766592252951269548814352411327322447034194093921285273353477875204196603230641896039854934719468650093602325707751568 hint_0=zhuanzhuan(g)%50254221567892101225665855 def encrypt(hint_0): #n_1,n_2 both are int if (n_1+hint_0)**2+1712463104290490642*n_1+4730060142800357260761833404838169046987798-66666666*n_2**2=0: d=55607604802787651645008458776960381905274761803290637507632188635838921065681450951091689278291418693230528750002533602907652688436593464630306292523277204515196410606067221890882848225521819884919432609641732036959698443050773592482567332594684068998082886109352105201496925283866221090767083891241755981564899917062843679988341936588610298860835342859782896551931353504004447312763256966682142206683209406463516580194846276027818291321875085607298572702721743561*n_1+n_2-69462057634597116805075535702860983356198049 return d c=pow(m,e,n)=encrypt(hint_0) #The n is very dangerous 结果是多少
06-03
<think>嗯,我现在需要解决这个RSA加密的问题,用户给了一些代码和参数,还有自定义的函数。首先,用户提到n、e、m这些参数,还有自定义的zhuanzhuan函数和encrypt函数。目标应该是计算c=pow(m,e,n)的值,然后分析encrypt(hint_0)的作用和结果。首先,我应该先理解各个部分的关系。给定的n是模数,e是公钥,m是明文,需要加密成密文c。根据RSA的基本原理,c应该是通过pow(m, e, n)计算的。这部分应该没问题,直接用Crypto库的bytes_to_long转换flag为m,然后用pow计算即可。接下来是zhuanzhuan函数,看起来是一个递归函数。用户给了一个例子,计算g的值,然后用hint_0=zhuanzhuan(g)%某个数。这里可能需要分析zhuanzhuan函数的数学表达式,否则递归深度太大,无法直接计算。比如,当n很大时,递归会导致栈溢出或者计算时间过长。比如题目中的g是一个很大的数,1766...568,直接递归计算显然不可行,必须找到递推公式的闭合表达式或者矩阵快速幂的方法来优化。然后,encrypt函数里面有一个条件判断,如果满足某个二次方程的话,就会计算d的值。这个方程是(n_1 +hint_0)^2 +1712...*n_1 +4730... -66666666*n_2^2=0。需要解这个方程得到n_1和n_2的值,然后代入到d的表达式中,d是某个大数乘以n_1加上n_2减去另一个数。这可能涉及到求解这个二次方程,找到整数解,从而得到d的值。而d可能与RSA的私钥有关,因为通常d是私钥,满足e*d ≡1 modφ(n)。但这里d的表达式看起来不寻常,可能是一个自定义的生成方式,需要结合方程的解来推导。 用户的问题是如何计算c=pow(m,e,n)以及分析encrypt(hint_0)的作用。首先,计算c应该是直接的,但需要确保m是正确转换后的长整数。然后,encrypt函数返回的d可能被用作解密指数,但需要先解出n_1和n_2的值。这可能需要将二次方程转化为某种形式,比如佩尔方程或者其他类型,找到整数解。例如,原方程可以整理为:(n_1 +hint_0)^2 +1712...n_1+ ...=66666666*n_2^2。可能存在某种因式分解或变形,使得n_1和n_2可以表示为某些参数的形式。另外,引用中的分析提到,当已知leak、r、t时,可以通过(leak+tmp)*inverse(r,t) %t来求解p。这可能与当前问题中的某些参数相关,比如hint_0可能与leak类似,用来帮助分解n或者找到p、q。但需要更多的信息来确定具体的应用方法。可能的步骤是:1.分析zhuanzhuan函数的递归关系,找到其闭合表达式,以便快速计算hint_0的值。2.计算hint_0后,代入encrypt函数的条件方程,求解n_1和n_2的整数解。 3.使用得到的n_1和n_2计算d,然后使用d作为私钥解密c,得到明文m。 对于第一步,zhuanzhuan(n)的递归式是:当n <2时返回n,否则返回9*zhuanzhuan(n-1)+ zhuanzhuan(n-2)。这看起来是一个线性递推关系,可以表示为二阶齐次递推方程。特征方程应该是r²=9r+1,解为r =[9± sqrt(85)] /2。因此,闭合表达式应该是这两个根的线性组合,通过初始条件确定系数。这样就能快速计算g对应的zhuanzhuan(g),而无需递归。一旦得到hint_0,即zhuanzhuan(g) mod50254221567892101225665855,接下来需要处理二次方程。将方程整理为关于n_1和n_2的形式,可能需要将其视为某种二次曲线,寻找整数解。或者,可能存在某种参数替换,使得方程能够分解为两个线性项的乘积,从而得到n_1和n_2的关系。例如,将方程视为关于n_2的二次方程,或者关于n_1的二次方程,然后使用判别式必须是平方数等条件来寻找解。假设解得n_1和n_2后,代入d的表达式,得到d的值。此时,d可能与RSA的私钥有关,或者直接用于解密。但需要检查d是否满足e*d ≡1mod φ(n),如果符合,则d就是私钥,可以直接解密c得到m。否则,可能需要其他方法,比如分解n,或者利用已知的某些参数结构(如p和q的形式)来恢复私钥。 总结来说,关键步骤是:-求解zhuanzhuan的闭合表达式,计算hint_0。-解二次方程得到n_1和n_2。-计算d,并验证其是否为有效的私钥。 -使用d解密c,得到flag。 可能遇到的挑战包括递归函数的优化计算、二次方程的整数解求解,以及d的有效性验证。需要结合数论和代数知识,以及可能的编程实现来逐步解决。</think>### 加密计算与函数分析 #### 一、计算$c = \text{pow}(m,e,n)$ 1. **基础加密流程**: - 使用`bytes_to_long`将flag转换为整数$m$ - 直接调用RSA加密公式: $$c \equiv m^e \mod n$$ - 代码实现: ```python from Crypto.Util.number import bytes_to_long m = bytes_to_long(flag) c = pow(m, e, n) # 直接计算结果 ``` #### 二、分析`encrypt(hint_0)`函数 1. **函数逻辑解析**: - 函数接受`hint_0`作为输入,需满足二次方程约束: $$(n_1 + \text{hint}_0)^2 + 1712463104290490642 \cdot n_1 + 4730060142800357260761833404838169046987798 - 66666666 \cdot n_2^2 = 0$$ - 方程可变形为: $$66666666 \cdot n_2^2 = (n_1 + \text{hint}_0)^2 + 1712463104290490642 \cdot n_1 + \text{常数项}$$ 这暗示可能存在某种整数分解或特殊数论结构[^1]。 - 若方程有解,则私钥$d$的表达式为: $$d = 556076048027876516... \cdot n_1 + n_2 - 69462057634597116805075535702860983356198049$$ 2. **关键步骤**: - **步骤1**:计算$\text{hint}_0 = \text{zhuanzhuan}(g) \mod 50254221567892101225665855$ - 递归函数$\text{zhuanzhuan}(n)$的递推关系: $$ f(n) = \begin{cases} n & \text{if } n < 2 \\ 9f(n-1) + f(n-2) & \text{otherwise} \end{cases} $$ - 通过特征方程法求解闭合表达式: $$r^2 = 9r + 1 \implies r = \frac{9 \pm \sqrt{85}}{2}$$ 通解为$f(n) = A \cdot r_1^n + B \cdot r_2^n$,代入初始条件$f(0)=0, f(1)=1$确定系数[^2]。 - **步骤2**求解二次方程 - 将方程视为关于$n_2$的二次型: $$66666666 \cdot n_2^2 = (n_1 + \text{hint}_0)^2 + 1712463104290490642 \cdot n_1 + \text{常数项}$$ - 可能需通过参数替换或模运算缩小解的范围,例如对模数分解后寻找可行解。 - **步骤3**:验证$d$的有效性 - 检查是否满足$e \cdot d \equiv 1 \mod \phi(n)$,若成立则$d$为有效私钥[^3]。 #### 三、示例代码 ```python # 计算zhuanzhuan(n)的闭合表达式(需预先推导) def zhuanzhuan_closed(n): sqrt85 = 85**0.5 r1 = (9 + sqrt85)/2 r2 = (9 - sqrt85)/2 A = (1 - r2)/(r1 - r2) B = (r1 - 1)/(r1 - r2) return int(A * (r1**n) + B * (r2**n)) # 计算hint_0 hint_0 = zhuanzhuan_closed(g) % 50254221567892101225665855 # 解二次方程(需数值计算工具) from sympy import symbols, Eq, solve n1, n2 = symbols('n1 n2') equation = Eq((n1 + hint_0)**2 + 1712463104290490642*n1 + 4730060142800357260761833404838169046987798, 66666666*n2**2) solutions = solve(equation, (n1, n2)) # 可能需要整数解约束 ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值