Python實(shí)現(xiàn)ElGamal加密算法的示例代碼
在密碼學(xué)中,ElGamal加密算法是一個(gè)基于迪菲-赫爾曼密鑰交換的非對(duì)稱加密算法。它在1985年由塔希爾·蓋莫爾提出。GnuPG和PGP等很多密碼學(xué)系統(tǒng)中都應(yīng)用到了ElGamal算法。
ElGamal加密算法可以定義在任何循環(huán)群G上。它的安全性取決于G上的離散對(duì)數(shù)難題。
使用Python實(shí)現(xiàn)ElGamal加密算法,完成加密解密過程,明文使用的是125位數(shù)字(1000比特)。
代碼如下:
import random from math import pow a = random.randint(2, 10) #產(chǎn)生小于p的隨機(jī)常數(shù)a def gcd(a, b): if a < b: return gcd(b, a) elif a % b == 0: return b; else: return gcd(b, a % b) # Generating large random numbers def gen_key(q): key = random.randint(pow(10, 20), q) while gcd(q, key) != 1: key = random.randint(pow(10, 20), q) return key # Modular exponentiation def power(a, b, c): x = 1 y = a while b > 0: if b % 2 == 0: x = (x * y) % c; y = (y * y) % c b = int(b / 2) return x % c # Asymmetric encryption def encrypt(msg, p, h, r): en_msg = [] b = gen_key(p) # 得b K = power(h, b, p)#K=(Sa)^b mod p C1 = power(r, b, p) #C1=Sb=r^b mod p for i in range(0, len(msg)): en_msg.append(msg[i]) print("C1 : ", C1) # print("(Sa)^b mod p used : ", K) for i in range(0, len(en_msg)): en_msg[i] = K * ord(en_msg[i]) print("C2 : ", en_msg) return en_msg, C1 def decrypt(C2, C1, a, p): dr_msg = [] h = power(C1, a, p) for i in range(0, len(C2)): dr_msg.append(chr(int(C2[i] / h))) return dr_msg # Driver code def main(): msg = '01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234' # 共125位數(shù)字,1000bit print("明文 :", msg) p = random.randint(pow(10, 20), pow(10, 50))# 獲得大素?cái)?shù)q r = random.randint(2, p)#得r a = gen_key(p) # Private key for receiver h = power(r, a, p) C2, C1 = encrypt(msg, p, h, r) dr_msg = decrypt(C2, C1, a, p) dmsg = ''.join(dr_msg) print("解密后文 :", dmsg); if __name__ == '__main__': main()
總結(jié)
到此這篇關(guān)于Python實(shí)現(xiàn)ElGamal加密算法的示例代碼的文章就介紹到這了,更多相關(guān)python ElGamal加密算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
react+django清除瀏覽器緩存的幾種方法小結(jié)
今天小編就為大家分享一篇react+django清除瀏覽器緩存的幾種方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-07-07Python利用Matplotlib庫實(shí)現(xiàn)繪制餅形圖
這篇文章主要為大家分享了基于python+matplotlib庫的餅形圖繪制,具體內(nèi)容涉及一般的餅圖、分裂餅圖、以及環(huán)形圖,感興趣的小伙伴可以了解一下2022-04-04python利用pymysql和openpyxl實(shí)現(xiàn)操作MySQL數(shù)據(jù)庫并插入數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了如何使用Python連接MySQL數(shù)據(jù)庫,并從Excel文件中讀取數(shù)據(jù),將其插入到MySQL數(shù)據(jù)庫中,有需要的小伙伴可以參考一下2023-10-10Pandas操作CSV文件的讀寫實(shí)現(xiàn)方法
這篇文章主要介紹了Pandas操作CSV文件的讀寫實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11Python使用Turtle圖形函數(shù)畫圖顏色填充實(shí)例
這篇文章主要介紹了Python使用Turtle圖形函數(shù)畫圖顏色填充實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08Python使用shutil操作文件、subprocess運(yùn)行子程序
這篇文章介紹了Python使用shutil操作文件、subprocess運(yùn)行子程序的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05Django migrate報(bào)錯(cuò)的解決方案
在講解如何解決migrate報(bào)錯(cuò)原因前,我們先要了解migrate做了什么事情,本文就詳細(xì)的介紹migrate使用以及出現(xiàn)問題的解決,感興趣的可以了解一下2021-05-05