m = bytes_to_long(long_to_bytes(randint(0,30))*208+flag)
c是$c=m^3\bmod n$
1
c = pow(m,3,n)
已知m高位,用CopperSmith已知明文高位攻击
当$|x|\leq N^{\frac{1}{e}}$,其中$m=mbar+x$时,下列关于x的方程
$$ c=m^e\bmod n =(mbar + x)^e \bmod n $$
其中$mbar=(m>>kbits)<<kbits$
有解
首先我们验证下,条件是否满足;x是315位的$N^{\frac{1}{e}}$约有683,条件成立
所以显然对于已知明文高位的攻击,还需要e比较小这个条件,不然e=65537明显解不出来
1
f = (mbar + x) ^ e - c
这是解出来的代码
1 2 3 4 5 6 7 8 9 10 11 12 13
from Crypto.Util.number import *
n = 14113948189208713011909396304970377626324044633561155020366406284451614054260708934598840781397326960921718892801653205159753091559901114082556464576477585198060530094478860626532455065960136263963965819002575418616768412539016154873800614138683106056209070597212668250136909436974469812231498651367459717175769611385545792201291192023843434476550550829737236225181770896867698281325858412643953550465132756142888893550007041167700300621499970661661288422834479368072744930285128061160879720771910458653611076539210357701565156322144818787619821653007453741709031635862923191561438148729294430924288173571196757351837 mbar = 1520800285708753284739523608878585974609134243280728660335545667177630830064371336150456537012842986526527904043383436211487979254140749228004148347597566264500276581990635110200009305900689510908049771218073767918907869112593870878204145615928290375086195098919355531430003571366638390993296583488184959318678321571278510231561645872308920917404996519309473979203661442792048291421574603018835698487725981963573816645574675640357569465990665689618997534740389987351864738104038598104713275375385003471306823348792559733332094774873827383320058176803218213042061965933143968710199376164960850951030741280074168795136 c = 6635663565033382363211849843446648120305449056573116171933923595209656581213410699649926913276685818674688954045817246263487415328838542489103709103428412175252447323358040041217431171817865818374522191881448865227314554997131690963910348820833080760482835650538394814181656599175839964284713498394589419605748581347163389157651739759144560719049281761889094518791244702056048080280278984031050608249265997808217512349309696532160108250480622956599732443714546043439089844571655280770141647694859907985919056009576606333143546094941635324929407538860140272562570973340199814409134962729885962133342668270226853146819 e = 3 kbits = 315
PR.<x>=PolynomialRing(Zmod(n)) f = (mbar + x) ^ e - c x0 = f.small_roots(X=2^kbits, beta=1)[0] # find root < 2^kbits with factor = n