RSA模重複平方演算法小示例
阿新 • • 發佈:2018-11-05
RSA模重複平方演算法實現示例程式碼
- 模重複平方演算法
- 編碼實現的兩種思路:
2.1.先算高位再算低位
2.2.先算低位再算高位
本文參照《演算法導論》做了些許嘗試,發現matlab和C++都發生了超限情況。後無意中發現Python能夠很好的處理244位的大數數的乘法,於是使用Python實現模重複平方演算法,並給出一個小的例子。
2.1. 先算高位
"""模重複平方計算方法:算高位 """ import time #演算法解決的是a=b^n mod(n) #輸入的三個引數 n=5611111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111; m=777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777; b=7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777; len(str(n)) #244位的大整數 #小整數測試用例 # n =560 # m =561 # b =7 start_time = time.time(); n_2 = bin(n) x=0 a=1 for i in range(2,len(n_2)): x = 2*x a = a*a%m if float(n_2[i]) == 1: x = x+1 a = a*b%m end_time=time.time() total_time=end_time-start_time print('總時間為%.3f' %total_time) print('最終結果為%d' %a)
總時間為0.003
最終結果為597827521175301244475889063191856870100052394123770191590098011180384570125304731583699751371102528978113393699464822577528851786374198270141726642146665802894688261814615330540304839361320974730299148780013422574662587164800349707056407379
2.2.先算低位
"""模重複平方計算方法:算低位 """ import time #演算法解決的是a=b^n mod(n) #輸入的三個引數 n=5611111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111; m=777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777; b=7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777; #小整數測試 # n =560 # m =561 # b =7 start_time = time.time(); #將大素數轉化為二進位制 n_2 = bin(n) x=1 y=0 a=1 #轉化為二進位制最高兩位為0b for i in range(len(n_2)-1,1,-1): if float(n_2[i]) == 1: y = y+x a = a*b%m b = b*b%m x = 2*x end_time=time.time() total_time=end_time-start_time print('總時間為%.3f' %total_time) print('最終結果為%d' %a)
總時間為0.006
最終結果為597827521175301244475889063191856870100052394123770191590098011180384570125304731583699751371102528978113393699464822577528851786374198270141726642146665802894688261814615330540304839361320974730299148780013422574662587164800349707056407379