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)文章
Python?jieba分詞添加自定義詞和去除不需要長尾詞的操作方法
這篇文章主要介紹了Python?jieba分詞如何添加自定義詞和去除不需要長尾詞,主要介紹jieba的基礎(chǔ)用法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03
Django+python服務(wù)器部署與環(huán)境部署教程詳解
這篇文章主要介紹了Django+python服務(wù)器部署與環(huán)境部署教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
Django Admin后臺(tái)添加數(shù)據(jù)庫視圖過程解析
這篇文章主要介紹了Django Admin后臺(tái)添加數(shù)據(jù)庫視圖過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
基于Python編寫一個(gè)簡單的http服務(wù)器
這篇文章主要為大家詳細(xì)介紹了如何基于Python編寫一個(gè)簡單的http服務(wù)器,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-04-04
Python實(shí)現(xiàn)鏈表反轉(zhuǎn)的方法分析【迭代法與遞歸法】
這篇文章主要介紹了Python實(shí)現(xiàn)鏈表反轉(zhuǎn)的方法,結(jié)合實(shí)例形式分析了Python迭代法與遞歸法實(shí)現(xiàn)鏈表反轉(zhuǎn)的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2020-02-02

