ElGamal算法加解密

ElGamal算法加解密

算法流程

  • 参数选取:素数p,生成元g,小于p的随机非负整数x
  • 产生密钥:公钥: y = g ^ x mod p, 私钥: x
  • 加密过程:选取小于p的随机非负整数k, 对于明文M, 产生密文对{C1 = g ^ x mod p, C2 = M * y ^ k mod p}
  • 解密过程:M = C2 / C1 ^ x mod p
  • 注意:k需要永久保存,且不能重复使用

代码实现

# -*-coding:utf-8-*-
"""
File Name: ElGamal算法加解密.py

Program IDE: PyCharm

Create Time: 2021-09-16 16:11

Create By Author: 陆依依

"""

# 密钥产生:素数p,生成元g,小于p的随机非负整数x, 产生公钥: y = g ^ x mod p, 私钥: x
#
# 加密过程:小于p的随机非负整数k, 明文M, 密文对{C1 = g ^ x mod p, C2 = M * y ^ k mod p}
#
# 解密过程:M = C2 / C1 ^ x mod p
#
# 注意:k需要永久保存,且不能重复使用

def Init():
    print("ElGamal加密算法:")
    print("输入:素数p,生成元g,小于p的随机数x, 私钥:x,小于p的随机非负整数k, 明文M")
    print("请输入初始参数:")
    p = int(input("大素数p="))
    g = int(input("生成元g="))
    x = int(input("随机数x="))
    k = int(input("随机数k="))
    M = int(input("明文M="))
    return p, g, x, k, M


def BuildKey(g, x, p):
    return g**x % p, x


def Encrypt(p, g, k, y, M):
    return g**k % p, (M * y**k) % p


# 求分数的模p同余   a/x mod p
def ModP(a, x, p):
    # 统一x为正数
    if x < 0:
        x = -x
        a = -a

    # 统一a为非负数
    while a < 0:
        a += p

    a = a % p

    i = 0
    while True:
        if (i*x) % p == a:
            return i*x
        i = i + 1


# 解密
def Decrypt(C1, C2, x, p):
    return ModP(C2, C1**x, p) / abs(C1**x)


# demo
if __name__ == "__main__":
    # 初始化参数
    p, g, x, k, M = Init()

    # 产生公私钥对(y, x)
    y, x = BuildKey(g, x, p)

    # 加密,产生密钥对(C1, C2)
    C1, C2 = Encrypt(p, g, k, y, M)
    print("密文对为{" + str(C1) + ", " + str(C2) + "}")

    # 解密
    M1 = int(Decrypt(C1, C2, x, p))
    print("解密后的明文:" + str(M1))

测试数据

    # 测试数据1:密文对:(97,31)
    # 97
    # 5
    # 58
    # 36
    # 3

运行结果

运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值