這個題目其實思路一開始是很正確的,但中間有些關鍵點沒想到,特此記錄一下。
題目給出了多組[N,e,c]的值,很明顯就是rsa加密了,觀察可以看到N值都相同,首先想到的就是可不可以暴力把N分解出來,用msieve進行嘗試,發現N太大無法得到結果。
繼續思考,想到既然給了多組密文,有沒有可能都是對同一組明文的加密,根據rsa的計算方法,可以求出來一個M^gcd(e1,e2),這樣M上面的指數就變小了很多,說不定可以暴力解出來。思考到這一步之后,隨便嘗試了兩個e,求出來gcd(e1,e2)=2059,陷入了僵局。這時候主要有兩個關鍵點沒解決:
(1)如何驗證這多組密文是同一個明文加密而來
(2)暴力求解是不可行的,最好找到兩個e,使得gcd(e1,e2)=1
看完wp后,豁然開朗:原來給出的所有的e都是19^a1*71^a2的形式,這樣如果要驗證第一點,只需要找一組e1,e2,使得e1|e2或者e2|e1,經過驗證可以發現確實加密的是同一個明文。第二個問題也就比較好解決了:e1=19^a1*71^0,e2=19^0*71^a2。這樣就保證了e1,e2的互素。
這樣就可以求出明文了,解得m=11859814987468385682904193929732856121563109146807186957694593421160017639466355
面對這個想的肯定是怎么轉換成字符串,首先想到的是每2個或者3個數字代表一個ascii碼,但實踐之后發現不可行:得出的一些字符毫無意義,并且還有無法顯示的字符。
再看wp,發現需要先轉換成16進制,然后再每兩個數字對應一個字符。
因為wp中涉及到了python的切片運算符和decode函數,在這里記錄一下:
s[a1:a2:a3],a1,a2代表要截取的字符串的開頭和結尾(左閉右開,從0開始算),a3代表步長。同時這些數字可以為負數,比如a2=-1表示截取到倒數第一個(不包括),
a3=-1則會返回字符串的倒序序列。
至于decode函數的解釋,這個解釋的挺好的。
新聞熱點
疑難解答