2018-06-05

關(guān)于實現(xiàn)RSA的具體算法


1.素性判斷

Prime.py

# coding:utf-8

import math

import random

# 擴展歐幾里得算法求模反元素

def ex_euclid(a, b, list):

? ? if b == 0:

? ? ? ? list[0] = 1L

? ? ? ? list[1] = 0L

? ? ? ? list[2] = a

? ? else:

? ? ? ? ex_euclid(b, a % b, list)

? ? ? ? temp = list[0]

? ? ? ? list[0] = list[1]

? ? ? ? list[1] = temp - a / b * list[1]

# 求模反元素

def mod_inverse(a, b):

? ? list = [0L, 0L, 0L]

? ? if a < b:

? ? ? ? a, b = b, a

? ? ex_euclid(a, b, list)

? ? if list[1] < 0:

? ? ? ? list[1] = a + list[1]

? ? return list[1]

# 快速冪模運算七问,把b拆分為二進制,遍歷b的二進制,當(dāng)二進制位為0時不計入計算

def quick_pow_mod(a, b, c):

? ? a = a % c

? ? ans = 1

? ? while b != 0:

? ? ? ? if b & 1:

? ? ? ? ? ? ans = (ans * a) % c

? ? ? ? b >>= 1

? ? ? ? a = (a % c) * (a % c)

? ? return ans

# n為要檢驗的大數(shù)哆窿,a < n,k = n - 1

def miller_rabin_witness(a, n):

? ? if n == 1:

? ? ? ? return False

? ? if n == 2:

? ? ? ? return True

? ? k = n - 1

? ? q = int(math.floor(math.log(k, 2)))

? ? while q > 0:

? ? ? ? m = k / 2 ** q

? ? ? ? if k % 2 ** q == 0 and m % 2 == 1:

? ? ? ? ? ? break

? ? ? ? q = q - 1

? ? if quick_pow_mod(a, n - 1, n) != 1:

? ? ? ? return False

? ? b1 = quick_pow_mod(a, m, n)

? ? for i in range(1, q + 1):

? ? ? ? if b1 == n - 1 or b1 == 1:

? ? ? ? ? ? return True

? ? ? ? b2 = b1 ** 2 % n

? ? ? ? b1 = b2

? ? if b1 == 1:

? ? ? ? return True

? ? return False

# Miller-Rabin素性檢驗算法,檢驗8次

def prime_test_miller_rabin(p, k):

? ? while k > 0:

? ? ? ? a = random.randint(1, p - 1)

? ? ? ? if not miller_rabin_witness(a, p):

? ? ? ? ? ? return False

? ? ? ? k = k - 1

? ? return True

# 判斷 num 是否與 prime_arr 中的每一個數(shù)都互質(zhì)

def prime_each(num, prime_arr):

? ? for prime in prime_arr:

? ? ? ? remainder = num % prime

? ? ? ? if remainder == 0:

? ? ? ? ? ? return False

? ? return True

# return a prime array from begin to end

def get_con_prime_array(begin, end):

? ? array = []

? ? for i in range(begin, end):

? ? ? ? flag = judge_prime(i)

? ? ? ? if flag:

? ? ? ? ? ? array.append(i)

? ? return array

# judge whether a number is prime

def judge_prime(number):

? ? temp = int(math.sqrt(number))

? ? for i in range(2, temp + 1):

? ? ? ? if number % i == 0:

? ? ? ? ? ? return False

? ? return True

# 根據(jù) count 的值生成若干個與質(zhì)數(shù)數(shù)組都互質(zhì)的大數(shù)

def get_rand_prime_arr(count):

? ? arr = get_con_prime_array(2, 100000)

? ? prime = []

? ? while len(prime) < count:

? ? ? ? num = random.randint(pow(10, 100), pow(10, 101))

? ? ? ? if num % 2 == 0:

? ? ? ? ? ? num = num + 1

? ? ? ? while True:

? ? ? ? ? ? if prime_each(num, arr) and prime_test_miller_rabin(num, 8):

? ? ? ? ? ? ? ? if num not in prime:

? ? ? ? ? ? ? ? ? ? prime.append(num)

? ? ? ? ? ? ? ? break

? ? ? ? ? ? num = num + 2

? ? return prime



2.RSA具體實現(xiàn)

RSA.py

# coding:utf-8

import random

import Prime

# encryption ,according to the formula:m^e = c (mod n) , calculate c ,c == secret,m == message

def encryption(message, puk):

? ? return Prime.quick_pow_mod(message, puk[1], puk[0])

# decryption ,according to the formula:c^d = m (mod n),? calculate m ,

def decryption(secret, prk):

? ? return Prime.quick_pow_mod(secret, prk[1], prk[0])

def get_RSAKey():

? ? RSAKey = {}

? ? prime_arr = Prime.get_rand_prime_arr(2)

? ? p = prime_arr[0]

? ? q = prime_arr[1]

? ? while p == q:

? ? ? ? q = random.choice(prime_arr)

? ? n = p * q

? ? s = (p - 1) * (q - 1)

? ? e = 65537

? ? d = Prime.mod_inverse(e, s)

? ? print "p = ", p, ",q = ", q

? ? print "n = ", n

? ? print "e = ", e, ",d = ", d

? ? puk = [n, e]

? ? prk = [n, d]

? ? RSAKey['puk'] = puk

? ? RSAKey['prk'] = prk

? ? return RSAKey

if __name__ == '__main__':

? ? RSAKey = get_RSAKey()

? ? print "Enter a number less and shorter than ", len(str(RSAKey['puk'][0])), ",", RSAKey['puk'][0], ":"

? ? # only encrypt a number type

? ? message = int(input())

? ? secret = encryption(message, RSAKey['puk'])

? ? print "After the encryption data :", secret

? ? print len(str(secret))

? ? message = decryption(secret, RSAKey['prk'])

? ? print "After the decryption data :", message

? ? print len(str(message))

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市月劈,隨后出現(xiàn)的幾起案子思劳,更是在濱河造成了極大的恐慌,老刑警劉巖型宝,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件八匠,死亡現(xiàn)場離奇詭異,居然都是意外死亡趴酣,警方通過查閱死者的電腦和手機梨树,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岖寞,“玉大人抡四,你說我怎么就攤上這事≌套唬” “怎么了指巡?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長隶垮。 經(jīng)常有香客問我藻雪,道長,這世上最難降的妖魔是什么狸吞? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任勉耀,我火速辦了婚禮,結(jié)果婚禮上蹋偏,老公的妹妹穿的比我還像新娘便斥。我一直安慰自己,他們只是感情好暖侨,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布椭住。 她就那樣靜靜地躺著,像睡著了一般字逗。 火紅的嫁衣襯著肌膚如雪京郑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天葫掉,我揣著相機與錄音些举,去河邊找鬼。 笑死俭厚,一個胖子當(dāng)著我的面吹牛户魏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播挪挤,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼叼丑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了扛门?” 一聲冷哼從身側(cè)響起鸠信,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎论寨,沒想到半個月后星立,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爽茴,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年绰垂,在試婚紗的時候發(fā)現(xiàn)自己被綠了室奏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡劲装,死狀恐怖胧沫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情酱畅,我是刑警寧澤琳袄,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布江场,位于F島的核電站纺酸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏址否。R本人自食惡果不足惜餐蔬,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望佑附。 院中可真熱鬧樊诺,春花似錦、人聲如沸音同。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽权均。三九已至顿膨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叽赊,已是汗流浹背恋沃。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留必指,地道東北人囊咏。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像塔橡,于是被迫代替她去往敵國和親梅割。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 關(guān)于使用python實現(xiàn)RSA加密解密 一葛家、非對稱加密算法 1户辞、乙方生成兩把密鑰(公鑰和私鑰)。公鑰是公開的惦银,任何...
    ttaymm閱讀 938評論 0 0
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些閱讀 2,030評論 0 2
  • 《道德經(jīng)》有言“道可道咆课,非常道”末誓。字面上的意思就是能說出來的道就不是道,或者說是片面的不完整的道书蚪。這就好像你跟一個...
    三月烽火閱讀 774評論 0 0
  • 最近做項目時喇澡,需要一次性修改幾百個文件的文件名稱。要是一個一個改下去殊校,我估計我會瘋晴玖。秉著消滅一切重復(fù)性勞動的強大信...
    小七君閱讀 558評論 4 10
  • 渾渾噩噩一天,差點沒完成打卡: 打卡的日子里還是先把任務(wù)完成了再去忙其他的事情为流。
    小小鳥028閱讀 133評論 0 1