精华内容
下载资源
问答
  • Elgamal 加密算法

    千次阅读 2020-03-17 23:36:02
    Elgamal 加密算法1、ElGamal算法简介2、ElGamal算法原理3、c语言代码实现4、测试结果 1、ElGamal算法简介 ElGamal算法是由Tather ElGamal在1985年提出的,它是一种基于离散对数难题的加密体系,与RAS算法一样,既能...

    1、ElGamal算法简介

    ElGamal算法是由Tather ElGamal在1985年提出的,它是一种基于离散对数难题的加密体系,与RAS算法一样,既能用于数据加密,也能用于数字签名。ElGamal算法是基于因数分解,而ElGamal算法是基于离散对数问题。与RSA算法相比,ElGamal算法哪怕是使用相同的私钥,对相同的明文进行加密,每次加密后得到的签名也各不相同,有效的防止了网络中可能出现的重放攻击。

    2、ElGamal算法原理

    1、ElGamal密钥生成
    (1)随机选择一个大素数p,且要求p-1有大素数因子。再选择一个模p的本原元α。将p和α公开。
    (2)随机选择一个整数d作为密钥,2≤d≤p-2 。
    (3)计算y=α^d mod p,取y为公钥。

    2、ElGamal加密
    (1)对于明文M加密,随机地选取一个整数k,2≤k≤p-2
    (2)C1=α^k mod p
    (3)C2=MY^k mod p
    (4)密文为(C1,C2)

    3、ElGamal解密
    由密文可得明文M,M=C2/C1^d mod p

    3、c语言代码实现

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    int pow_mod(int a,int b,int p){
      int ans=1;
      int tmp=a%p;
      while(b){
        if(b&1)
          ans=ans*tmp%p;
        b>>=1;
        tmp=tmp*tmp%p;
      }
      return ans%p;
    }
    
    void elgamal_en(int m,int pub,int p,int g,int *c1,int *c2){
      int k=5;
      *c1=pow_mod(g,k,p);
      *c2=m*pow_mod(pub,k,p)%p;
    }
    int elgamal_de(int c1,int c2,int pri,int p,int g){
      int m;
      int c1_=pow_mod(c1,p-2,p);
      m=c2*pow_mod(c1_,pri,p)%p;
      return m;
    }
    int is_prime(int p){
      int i;
      for(i=2;i<=sqrt(p);i++){
        if(p%i==0)
          return 0;
      }
      return 1;
    }
    void main(){
      int p;//素数
      int g=2;
    
      do{
        printf("请输入一个素数:");
        scanf("%d",&p);
      }while(!is_prime(p));
      
      printf("输入用户A的私钥:");
      int pri;
      scanf("%d",&pri);
    
      int pub;
      pub=pow_mod(g,pri,p);
    
      printf("用户A的公钥为:%d\n",pub);
      
      printf("输入明文(小于%d):",p);
      int m;
      scanf("%d",&m);
    
      int c1,c2;
      elgamal_en(m,pub,p,g,&c1,&c2);
      printf("用公钥加密后的密文为:c1=%d,c2=%d\n",c1,c2);
    
      int m_=elgamal_de(c1,c2,pri,p,g);
      printf("用私钥解密后的明文为:%d\n",m_);
    }
    

    代码参考 https://blog.csdn.net/Evil_invisible/article/details/101201632

    4、测试结果

    在这里插入图片描述

    展开全文
  • ElGamal加密算法是一个基于迪菲-赫尔曼密钥交换的非对称加密算法。这篇文章通过示例代码给大家介绍Python实现ElGamal加密算法的相关知识,感兴趣的朋友一起看看吧
  • ElGamal加密算法可以定义在任何循环群G上。它的安全性取决于G上的离散对数难题。使用Python实现ElGamal加密算法,完成加密解密过程,明文使用的是125位数字(1000比特)。代码如下:import ra...

    在密码学中,ElGamal加密算法是一个基于迪菲-赫尔曼密钥交换的非对称加密算法。它在1985年由塔希尔·盖莫尔提出。GnuPG和PGP等很多密码学系统中都应用到了ElGamal算法。

    ElGamal加密算法可以定义在任何循环群G上。它的安全性取决于G上的离散对数难题。

    使用Python实现ElGamal加密算法,完成加密解密过程,明文使用的是125位数字(1000比特)。

    代码如下:

    import random

    from math import pow

    a = random.randint(2, 10) #产生小于p的随机常数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位数字,1000bit

    print("明文 :", msg)

    p = random.randint(pow(10, 20), pow(10, 50))# 获得大素数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()

    总结

    到此这篇关于Python实现ElGamal加密算法的示例代码的文章就介绍到这了,更多相关python ElGamal加密算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    展开全文
  • 文章目录前言离散对数问题ElGamal加密算法算法描述密钥生成加密算法解密算法椭圆曲线群上的ElGamal加密密钥生成加密算法解密算法优势点压缩离散对数问题的困难性穷举搜索法Shanks算法BSGS原理算法描述Pohlig-Hellman...

    前言

    ElGamal加密算法是由Taher ElGamal于198年提出的一种基于离散对数问题公钥加密算法。是一种非确定性的加密算法,即每次加密会使用一个随机数,加密相同的明文时,不同的随机数可能会产生不同的密文。好的加密算法应该具有非确定性,可引入工作模式将算法转变成非确定性加密算法。

    离散对数问题

    给定乘法群(G,·),一个阶为n的元素α∈G(即αn=e)以及元素β∈<α>。计算唯一的整数a,0≤a≤n-1,满足**αa=β**,其中a称为β的离散对数以a为底的logβ

    在这里插入图片描述

    ElGamal加密算法

    算法描述

    密钥生成

    在这里插入图片描述

    加密算法

    在这里插入图片描述

    解密算法

    在这里插入图片描述

    椭圆曲线群上的ElGamal加密

    在这里插入图片描述

    密钥生成

    在这里插入图片描述

    加密算法

    在这里插入图片描述

    解密算法

    在这里插入图片描述

    优势

    ①基于计算椭圆曲线上离散对数的困难性

    密钥短(160-bit)

    ③同一基域上选取不同的椭圆曲线

    点压缩

    表示明文或公钥参数的时候,用点表示,且点有一定规律。

    横坐标相同的点,纵坐标互为相反数。

    离散对数问题的困难性

    穷举搜索法

    在0≤a≤n-1之间去遍历a,看哪个a满足条件。

    时间O(n),空间O(1)

    Shanks算法BSGS

    原理

    在这里插入图片描述

    算法描述

    在这里插入图片描述

    时间O(n0.5),空间O(n0.5)

    所以群的阶应该足够大

    Pohlig-Hellman算法

    原理

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    伪代码

    在这里插入图片描述

    时间复杂度O(cq)

    因此群的阶应该含有足够大的素因子

    Pollard ρ算法

    原理

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    伪代码

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    例子

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    所以群的阶应该足够大

    指数计算算法

    只适用于模p的群上

    原理

    在这里插入图片描述

    例子

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    所以模p应该足够大,群中元素难以用少量素数表示

    展开全文
  • Python实现ElGamal加密算法

    千次阅读 2020-06-17 14:44:46
    使用Python实现ElGamal加密算法,完成加密解密过程,明文使用的是125位数字(1000比特)。 代码如下: import random from math import pow a = random.randint(2, 10) #产生小于p的随机常数a def gcd(a, b): if...

    使用Python实现ElGamal加密算法,完成加密解密过程,明文使用的是125位数字(1000比特)。
    代码如下:

    import random
    from math import pow
    
    a = random.randint(2, 10) #产生小于p的随机常数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位数字,1000bit
        print("明文 :", msg)
    
        p = random.randint(pow(10, 20), pow(10, 50))# 获得大素数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()
    
    展开全文
  • ElGamal加密 对于明文M加密 随机地选取一个整数k,2≤k≤p-2。 C1=α^k mod p; C2=MY^k mod p; 密文为(C1,C2) ElGamal解密 由密文可得明文M M=C2/C1^d mod p 实例 密钥生成选取素数p=150001,本原元a=7,密钥...
  • ElGamal加密算法的理解

    千次阅读 2020-05-08 10:48:12
    原理:求解离散对数是困难的,而其逆运算可以应用平方乘的方法有效的计算出来。...ElGamal加密算法三部分: 密钥生成、加密、解密 密钥生成 利用生成元g产生一个q阶循环群G 从{1,…q-1}中随机选择一个x h=gx ...
  • ElGamal加密算法简介

    千次阅读 2020-12-28 17:07:42
    上一篇介绍了非对称加密算法中的RSARSA算法简介,这次看一下ElGamal算法。 首先它是一个基于迪菲-赫尔曼密钥交换的非对称加密算法。它在1985年由塔希尔·盖莫尔提出。它可以定义在任何循环群G上。它的安全性取决于G...
  • ElGamal算法是由Tather ElGamal在1985年提出的,它是一种基于离散对数难题的加密体系,与RAS算法一样,既能用于数据加密,也能用于数字签名。ElGamal算法是基于因数分解,而ElGamal算法是基于离散对数问题。与RSA...
  • 1.新建一个java项目,里面新建一个java类,加入要用到的jar包,整体的框架如图所示: 2.ElGamal.java里面的代码如下所示:import java.security.AlgorithmParameterGenerator;import java.security.Algorithm...
  • 重点:ElGamal既能够加密,也能够用来签名。两者虽然过程很像,但并不是同一件事...而http://blog.sina.com.cn/s/blog_5b5ed0720100atsy.htm和https://www.cnblogs.com/math/p/discrete-log.html则是对ElGamal算法的...
  • ElGamal加密算法基础到实现详解

    万次阅读 多人点赞 2011-11-26 14:23:08
    ElGamal加密 对于明文M加密 随机地选取一个整数k,2≤k≤p-2。 C1=α^k mod p; C2=MY^k mod p; 密文为(C1,C2) ElGamal解密 由密文可得明文M M=C2/C1^d mod p 实例 密钥生成 选取...
  • 注意:只是我的理解,可能有不正确的地方算法ElGamal加密算法是一种非对称加密算法,基于Diffie-Hellman密钥交换算法,由Taher Elgamal在1985年提出。安全ElGamal加密算法能够应用在任意一个循环群(cyclic group)上...
  • ElGamal加密算法由三部分组成:密钥生成、加密和解密。 密钥生成 密钥生成的步骤如下: Alice利用生成元g产生一个q阶循环群G的有效描述。该循环群需要满足一定的安全性质。 Alice从中随机选择一个 x。 Alice计算。 ...
  • ElGamal实现加密算法

    千次阅读 2017-10-04 19:38:43
    1.新建一个java项目,里面新建一个java类,加入要...2.ElGamal.java里面的代码如下所示: import java.security.AlgorithmParameterGenerator; import java.security.AlgorithmParameters; import java.security.KeyPa
  • 与典型非对称加密算法RSA算法相比,ElGamal算法则被称为常用非对称加密算法ElGamal既可用于加密,又可用于数字签名,是除RSA算法外最具代表性的公钥加密算法之一。 ElGamal算法就有较好的安全性,被广发应用。...
  • 在密码学中,ElGamal加密算法是一个基于迪菲-赫尔曼密钥交换的非对称加密算法,它在1985年由塔希尔·盖莫尔提出 。 EIGamal公开密钥密码体制是基于有限域中离散对数间题的难解性。它所根据的原理是:求解离散对数是...
  • 目录Elgamal公钥加密算的过程与要求本原根生成代码部分 Elgamal公钥加密算的过程与要求 1. 密钥产生与加解密过程 2. 数据要求 秘密长度近150位,验收用的5个秘密(145,140,135,130,125位) 大素数的形式为p=2q...
  • Elgamal算法,加密算法,各算法比较

    热门讨论 2010-11-02 19:01:48
    实现Elgamal算,并对各种算法进行相应的比较,是一款简单的算法实现,用简单的C语言编写,大家很易懂的
  • 加密算法: ElGamal算法

    2010-08-11 20:41:00
    3、ElGamal算法 ElGamal算法既能用于数据加密也能用于数字签名,其安全性依赖于计算有限域上离散对数这一难题。 密钥对产生办法。首先选择一个素数p,两个随机数, g 和x,g, x , 计算 y = g^x ( mod...
  • 1、ElGamal算法和ECC算法基于离散对数问题 2、这个是一个单向的过程。虽然密钥对构造简单,但是只是乙方向另外一方单向传送数据进行加解密,不能反向操作 3、这里只有“公钥加密、私钥解密”这个过程 4、...
  • ELGamal非对称加密算法

    2016-12-10 18:23:57
    ELGamal是非对称加密算法,和RSA类似ELGamal密码体制是T.ElGamal在1985年提出的公钥密码体制。它的安全性是基于求解离散对数问题的困难性,是RSA以后比较有希望的一个公钥密码。美国的DSS(Digital Signature ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,290
精华内容 1,316
关键字:

elgamal加密算法