【密码学】ElGamal加密算法原理 以及 例题讲解

前言

具体的性质:

  • 非对称加密算法
  • 应用于一些技术标准中,如数字签名标准(DSS)、S/MIME 电子邮件标准
  • 算法定义在任何循环群 G 上,安全性取决于 G 上的离散对数难题

1. 原理

主要由三部分组成:密钥生成、加密和解密

可以用这幅图讲解:(用公钥加密,私钥解密):
在这里插入图片描述

该算法与Difffie-Hellman一样,ElGamal的系统用户共同选择一个素数 q,a 是 q 的素根。

一、密钥生成:(用户A)

  1. 随机生成 整数X (1< X < q - 1)
  2. 计算 公钥Y = a X mod q

可以得到私钥 X,公钥 {q,a,Y}

二、加密:(用户B通过A的公开密钥进行加密)

  1. 发送信息为 整数 M(1 ≤ \leq X ≤ \leq q - 1),以分组密码序列的方式来发送信息,其中每个分块的长度不小于整数 q
  2. 取任意整数 小写k(1 ≤ \leq k ≤ \leq q - 1)
  3. 取一次密钥 大写K :K = ( Y ) k mod q
  4. 整数M 加密成 明文对(C1,C2),C1 = ak mod q ,C2 = KM mod q

三、解密:(用户A恢复密文)

  1. 计算密钥 大写K :K = (C1)X mod q
  2. 计算 整数M,M = (C2K-1) mod q

至于解密的式子 是这样生成:

式子一:
K = ( Y ) k mod q
K = ( a X mod q ) k mod q
K = a kX mod q
K = (C1)X mod q


式子二:
因为 C2 = KM mod q
所以 (C2K-1) mod q = KMK-1 mod q = M mod q = M

2. 例题

2.1 例题一

题目: 已知素数q为19,素根有 {2,3,10,13,14,15} ,此处 选择a = 10。

答案:

一、秘钥生成:(用户A)

  1. 选择X = 5
  2. 计算 Y = a X mod q = 10 5 mod 19 = 3

A用户的 私钥 为5, 公钥为 {q,a,Y} = {19,10,3}

二、加密:(用户B通过A的公开密钥进行加密)

  1. 发送消息17,想选择 小写k = 6
  2. 计算 大写K :K = ( Y ) k mod q = 36 mod 19 = 729 mod 19 = 7
  3. 密文 C1 = ak mod q = 106 mod 1 = 11 ,C2 = KM mod q = 7 x 17 mod 19 = 119 mod 19 =5
  4. 发送密文 M = (11,5)

三、解密:(用户A恢复密文)

  1. 计算 大写K ,K = (C1)X mod q = 115 mod 19 = 7
  2. K-1 为 7-1 mod 19 = 11
  3. 最终 M = (C2K-1) mod q = 5 x 11 mod 19 = 55 mod 19 = 17

2.2 例题二

题目: 素数 37,取素数根,最小为2

答案:

过程与上面类似,此处讲解下具体步骤

一、秘钥生成:(用户A)
随机取一个数,取X 为 5,Y = 2 5 mod 37 = 32

二、加密:(用户B通过A的公开密钥进行加密)
发送29消息,取 小写k 为 7
计算出的 大写K 为 19
C1 = 17,C2 = 33
M = (17,33)

三、解密:(用户A恢复密文)
大写K为 19
M 为 29

### ElGamal 公钥加密算法原理 ElGamal 加密算法由 Tather ElGamal 在 1985 年提出,是一种基于离散对数难题的非对称加密体系[^1]。此算法不仅可用于数据加密,也可用于数字签名。 #### 原理概述 ElGamal 算法的安全性依赖于有限域中的离散对数问题难以求解这一特性。具体来说,在给定的群 \( G \) 中,对于已知底数 \( g \) 和幂次结果 \( y=g^x\bmod p\) ,找到指数 \( x \) 是极其困难的任务。然而,正向操作即计算 \( y \),则相对容易完成。这种不对称性质使得 ElGamal 成为了一个单向函数的应用实例[^2]。 ### 密钥生成流程 1. **选择参数** - 随机选取一个大素数 \( p \),通常采用特殊形式如 \( p=2q+1 \),其中 \( q \) 同样为素数; - 找到模 \( p \) 下的一个本原元(生成元)\( g \)[^3]。 2. **私钥与公钥创建** - 用户随机挑选一个小于 \( p-1 \) 的整数作为自己的私钥 \( a \); - 计算对应的公钥部分 \( A = g^{a} \bmod p \)。 最终用户的公钥为 \( (p,g,A) \),而私钥则是 \( a \)。 ### 加密过程 假设发送方想要向接收方传递消息 \( M \): 1. 发送方获取接收者的公钥 \( (p,g,A) \); 2. 将原始信息转换成小于 \( p \) 的数值表示 \( m \); 3. 随机选择一个小于 \( p-1 \) 的临时密钥 \( k \); 4. 使用上述选定的信息构建两个组件构成的密文: - 组件之一 \( C_1 = g^{k}\bmod p\) - 另一组件 \( C_2 = mA^{k}\bmod p\) 因此形成的完整密文就是一对值 \( (C_1,C_2)\)。 ```python def encrypt(p, g, A, message): import random # Step 3: Choose ephemeral key 'k' k = random.randint(1, p-2) # Steps 4 and 5: Compute ciphertext components C1 = pow(g, k, p) C2 = (message * pow(A, k)) % p return C1, C2 ``` ### 解密过程 当接收到密文 \( (C_1,C_2) \): 1. 利用自己的私钥 \( a \) 来恢复共享的秘密 \( S=C_{1}^{a}\bmod p \); 2. 接着利用这个秘密来还原原文 \( m=\frac{C_2}{S}\bmod p \). ```python def decrypt(C1, C2, private_key_a, prime_p): shared_secret = pow(C1, private_key_a, prime_p) inverse_shared_secret = pow(shared_secret, -1, prime_p) decrypted_message = (C2 * inverse_shared_secret) % prime_p return decrypted_message ```
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农研究僧

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值