ElGamal加密算法
ElGamal加密是一種公共密鑰密碼系統。它使用非對稱密鑰加密在雙方之間進行通信並加密消息。
該密碼系統基於難以找到循環群中離散對數的困難,即使我們知道g a和g k,也很難計算g ak。
ElGamal密碼系統的想法
假設Alice想與Bob交流。
- 鮑勃生成公鑰和私鑰:
- 鮑勃選擇一個非常大的數q和一個循環群F q。
- 從環狀基團˚F q,他選擇的任何元素克和
一個元件一個,使得滿足gcd(A,Q)= 1。 - 然后,他計算h = g a。
- 鮑勃發布F,h = g a,q和g作為他的公鑰,並保留a作為私鑰。
- 愛麗絲使用鮑勃的公鑰加密數據:
- 愛麗絲從循環群F中選擇一個元素k, 使gcd(k,q)= 1。
- 然后,她計算出p = g k和s = h k = g ak 。
- 她與M乘以s。
- 然后她發送(p,M * s)=(g k,M * s)。
- 鮑勃解密消息:
- 鮑勃計算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通過將g ak乘以它來掩蓋。為了去除面罩,以g k的形式給出線索。除非有人知道一個,他將無法取回中號。這是因為很難找到循環組中的離散對數,並且僅知道g a和g k不足以計算g ak。