应用Elgamal算法实现远程证明方案
远程证明方案
1|0知识点:
Elgamal算法
AES加密算法
RSA算法数字签名和检验
2|0知识点详解:
2|1Elgamal算法
推荐网址:
https://zhuanlan.zhihu.com/p/340162669
https://www.cnblogs.com/zeroy610/p/15117747.html
https://blog.csdn.net/u012391423/article/details/116952687
ElGamal公钥密码体制是由 T.ElGamal于 1985年提出的,与 Diffie-Hellman密钥分配体制密切相关。ElGamal密码体系应用于一些技术标准中,如数字签名标准(DSS)和 S/MIME电子邮件标准。直到现在仍然是一个安全性能良好的公钥密码体制。该算法既能用于数据加密也能用于数字签名,其安全性依赖于计算有限域上离散对数这一难题。Elgamal加密方案可以视为DHKE协议的拓展,无容置疑,其安全性也是基于离散函数问题和Diffie_Hellman问题的难度。
2|2AES加密算法:
推荐网址:https://blog.csdn.net/weixin_44259720/article/details/110952842
效率对比:
RSA:解密的效率远低于加密效率,按照表里的时间估算,加密1G的文件需要1分钟,但是解密却需要65小时。
AES:加密 1G 的文件大概需要 4 分多钟左右;解密文件所需时间也是加密时间的两倍;
AES加密速度快,但密钥协商和传输过程使安全性降低。RSA安全性高,但是运行较AES更慢.
2|3RSA算法数字签名和检验:
使用Crypto实现RSA算法的数字签名和检验
3|0实际案例:
3|1设计方案
步骤1:获取基于Elgamal算法生成的公钥和私钥
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | def alg_generate_pub_pri(): #选择一个大质数 # prime_num = int(random.choice(prime)) prime_num = getsushu() #计算本原元 alpha = primitive_root(prime_num) #选择整数d作为私钥 d = random.randint( 2 , prime_num - 2 ) #汇总私钥和公钥 #β=α^d mod p,β=2^5 mod 37 = 32 # bata = alpha**d % prime_num bata = pow (alpha, d, prime_num) print (f "私钥d:{d}\n公钥prime_num:{prime_num} alpha:{alpha} bata:{bata}" ) result = { 'pri' :d, 'pub' : [prime_num, alpha, bata]} return result |
步骤2:将Elgamal算法生成的公钥传递给agent(可以手动放置), 进行agent端发送数据和签名验证过程
步骤3:agent使用ip和mac作为签名的数据(考虑数据大小影响性能和机器唯一性的因素)并使用rsa算法进行签名
1 2 3 4 5 6 7 | def signaturer(key, data): # 获取消息的HASH值,摘要算法MD5,验证时也必须用MD5 digest = MD5.new(data.encode( 'utf-8' )) # 使用私钥对HASH值进行签名 # signature = pkcs1_15.new(private_key).sign(digest) signature = pkcs1_15.new(key).sign(digest) return signature |
步骤4:得到签名数据后,开始进入AES算法对数据进行加密流程
1 2 3 | AES_SECRET__ = '8labsecretpwdfqm' AES_IV__ = AES_SECRET__[:: - 1 ] aes_encrypt = AESHelper(AES_SECRET__, AES_IV__).encrypt( str (data)) |
步骤5:因AES 算法加密速度快,但密钥协商和传输过程使安全性降低, 因此考虑和Elgamal算法结合使用,提高数据的安全性
步骤6:使用Elgamal算法的公钥,生成秘钥和随机数
1 2 3 4 5 6 7 8 9 10 11 12 13 | def encryption(pub): #加密 p = pub[ 0 ] alpha = pub[ 1 ] bata = pub[ 2 ] x = random.randint( 0 , p - 2 ) k = random.randint( 2 , p / / 2 ) print (f "输入的随机数x是:{x}" ) print (f "输入的随机数K是:{k}" ) y1 = alpha * * k % p y2 = x * bata * * k % p print (f "生成的秘钥:{str([y1, y2])}" ) return str ([y1, y2]), x |
步骤7:对Elgamal算法生成的随机数,对AES算法机密后的数据按照一定的规则打乱数据
1 2 3 4 | front = x % crack_rule back = x - front print (f "截取的前:{front}, 后:{back}" ) aes_encrypt_string = random_str[:front] + aes_encrypt + random_str[front:] |
步骤8:agent把数据(签名数据和验证签名数据、AES加密数据,agent公钥,Elgamal秘钥)发送给server来验证签名和解密数据
步骤9:server收到agent数据,开始验证签名和解密数据过程
步骤10:server验证签名
1 2 3 4 5 6 7 8 9 10 | def verifier(public_key, data, signature): digest = MD5.new(data.encode( 'utf-8' )) try : pkcs1_15.new(public_key).verify(digest, signature) print ( "签名验证成功!!!" ) except : print ( "签名无效!!!" ) return False else : return True |
步骤11: ElGamal算法解密生成x
1 2 3 4 5 6 7 8 9 | def decryption(pri, pub, secret_key): #解密 if type (secret_key) = = str : secret_key = eval (secret_key) p = pub[ 0 ] y1 = secret_key[ 0 ] y2 = secret_key[ 1 ] x = y2 * inv(y1 * * pri, p) % p return x |
步骤12: 根据x获取AES加密数据,并解密
1 2 3 4 5 6 7 8 | front = x % crack_rule back = x - front print (f "截取的前:{front}, 后:{back}" ) aes_str = aes_string[front: - back] AES_SECRET__ = '8labsecretpwdfqm' AES_IV__ = AES_SECRET__[:: - 1 ] # print(f"算法处理后的数据:{aes_str}") aes_decrypt = AESHelper(AES_SECRET__, AES_IV__).decrypt(aes_str) |
3|2案例展示:
执行过程:
代码:
需要代码的可以评论给我
4|0总结:
Elgamal算法也可以实现加密和签名的过程, 与RSA算法相比,ElGamal算法哪怕是使用相同的私钥,对相同的明文进行加密,每次加密后得到的签名也各不相同,有效的防止了网络中可能出现的重放攻击。Rsa是基于大质数分解难题;而Elgamal是基于G上的离散对数难题
签名过程也可以使用Elgamal算法, 因为我这经常使用RSA签名, Elgamal签名使用过的少, 担心会出现预料之外的问题, 所以没有尝试使用
本次案例也只是针对AES算法安全性考量,所以考虑结合Elgamal算法, 增强安全性,当然Elgamal也可以直接对数据进行加解密操作
有兴趣的小伙伴, 也可以尝试下
__EOF__

本文链接:https://www.cnblogs.com/chaolumeng/p/16932923.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)