ElGamal加密算法


 

ElGamal加密算法

ElGamal加密是一種公共密鑰密碼系統。它使用非對稱密鑰加密在雙方之間進行通信並加密消息。
該密碼系統基於難以找到循環群中離散對數的困難,即使我們知道g a和g k,也很難計算g ak

ElGamal密碼系統的想法
假設Alice想與Bob交流。

  1. 鮑勃生成公鑰和私鑰:
    • 鮑勃選擇一個非常大的數q和一個循環群q
    • 從環狀基團˚F q,他選擇的任何元素
      一個元件一個,使得滿足gcd(A,Q)= 1。
    • 然后,他計算h = g a
    • 鮑勃發布Fh = g aqg作為他的公鑰,並保留a作為私鑰。
  2. 愛麗絲使用鮑勃的公鑰加密數據:
    • 愛麗絲從循環群F中選擇一個元素k 使gcd(k,q)= 1。
    • 然后,她計算出p = g k和s = h k = g ak 
    • 她與M乘以s。
    • 然后她發送(p,M * s)=(g k,M * s)。
  3. 鮑勃解密消息:
    • 鮑勃計算s ' = p a = g ak
    • 他將M * s除以s '得到M,即s = s '

以下是ElGamal密碼系統在Python中的實現

# Python program to illustrate ElGamal encryption   
    
import random    
from math import pow  
    
a = random.randint(2, 10)   
    
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, q, h, g):   
    
    en_msg = []   
    
    k = gen_key(q)# Private key for sender   
    s = power(h, k, q)   
    p = power(g, k, q)   
        
    for i in range(0, len(msg)):   
        en_msg.append(msg[i])   
    
    print("g^k used : ", p)   
    print("g^ak used : ", s)   
    for i in range(0, len(en_msg)):   
        en_msg[i] = s * ord(en_msg[i])   
    
    return en_msg, p   
    
def decrypt(en_msg, p, key, q):   
    
    dr_msg = []   
    h = power(p, key, q)   
    for i in range(0, len(en_msg)):   
        dr_msg.append(chr(int(en_msg[i]/h)))   
            
    return dr_msg   
    
# Driver code   
def main():   
    
    msg = 'encryption'  
    print("Original Message :", msg)   
    
    q = random.randint(pow(10, 20), pow(10, 50))   
    g = random.randint(2, q)   
    
    key = gen_key(q)# Private key for receiver   
    h = power(g, key, q)   
    print("g used : ", g)   
    print("g^a used : ", h)   
    
    en_msg, p = encrypt(msg, q, h, g)   
    dr_msg = decrypt(en_msg, p, key, q)   
    dmsg = ''.join(dr_msg)   
    print("Decrypted Message :", dmsg);   
    
    
if __name__ == '__main__':   
    main()   

樣本輸出:

原始消息:加密
g使用:5860696954522417707188952371547944035333315907890
使用的g ^ a:4711309755639364289552454834506215144653958055252
使用的g ^ k:12475188089503227615789015740709091911412567126782
使用的g ^ ak:39448787632167136161153337226654906357756740068295
解密消息:加密

在該密碼系統中,原始消息M通過將ak乘以來掩蓋為了去除面罩,以k的形式給出線索除非有人知道一個,他將無法取回中號這是因為很難找到循環組中的離散對數,並且僅知道g a和g k不足以計算g ak

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM