N = 9354989215068158144043140201182704736159947394157330700447282783241788585482102156255293917437554835381114716778 5844819790395407225817235426413294207470454583232796302469349068346152820921191513267542584628588614810778342591 674538229518195823357632385246395692767294668921897962854736600178473173740528805639 • e = 1 27
• N = 93549892150681581440431402011827047361599473941573 30700447282783241788585482102156255293917437554835 38111471677858448197903954072258172354264132942074 70454583232796302469349068346152820921191513267542 58462858861481077834259167453822951819582335763238 52463956927672946689218979628547366001784731737405 28805639 • e = 1 from Crypto.Util.number import long_to_bytes c = 10962199806997852621849592264890411439467769672834706813 # Nは不要 e = 1 # 暗号化の式: c ≡ m^e (mod N) # e = 1 なので、c ≡ m (mod N) # c が Nよりもかなり小さく、余りではなく # c = m の可能性が高い(実際合ってる) m = c m_str = long_to_bytes(m) print(m_str) 平文: rsa{e_is_1_then_c_is_m} 49
3008712141197748966521481477063141164885022950779891 4909296650135790977622509151894254905163494357711113 9950003269349470731079127788078104797580254455400193 616106658993971704377611189507947103649247229584 • N = 9900125982750383321313457773382502108359409207027265 3059661967928815977565185935322378922028178494862289 3721008564352007872075363664453997221338974336844967 3296078931051884885950288593347547184200174454499588 8275871747404666508451688056124064493381659642475078 198315894882290460124015791475489317063448792013 • e = 3 平文: rsa{mod_cubic_root_abcdefghijklmnopqrstuvw} from Crypto.Util.number import long_to_bytes import gmpy2 c = 5330771718594563231935137401530046955438217958208649161138916935712595446531235678512 8561928472916501126300871214119774896652148147706314116488502295077989149092966501357 9097762250915189425490516349435771111399500032693494707310791277880781047975802544554 00193616106658993971704377611189507947103649247229584 N = 9900125982750383321313457773382502108359409207027265305966196792881597756518593532237 8922028178494862289372100856435200787207536366445399722133897433684496732960789310518 8488595028859334754718420017445449958882758717474046665084516880561240644933816596424 75078198315894882290460124015791475489317063448792013 e = 3 # 暗号化の式: c = m^e (mod N) より、 # c = m^e + kN を満たす整数 k が存在。 # m = (c - kN)^(1/e) (e乗根)が整数になる k を探索。 def decrypt_iroot_e(c, n, e): for k in range(-1000, 1000): c_kn = c - k * n if c_kn < 0: continue m, exact = gmpy2.iroot(c_kn, e) if exact: # m が整数 return m m = decrypt_iroot_e(c, N, e) m_str = long_to_bytes(m) print(m_str) 51