应用Elgamal算法实现远程证明方案

远程证明方案

知识点:

Elgamal算法

AES加密算法

RSA算法数字签名和检验

知识点详解:

Elgamal算法

推荐网址:

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问题的难度。

 

 

 

 

AES加密算法:

推荐网址:https://blog.csdn.net/weixin_44259720/article/details/110952842

效率对比:

RSA:解密的效率远低于加密效率,按照表里的时间估算,加密1G的文件需要1分钟,但是解密却需要65小时。

AES:加密 1G 的文件大概需要 4 分多钟左右;解密文件所需时间也是加密时间的两倍;

AES加密速度快,但密钥协商和传输过程使安全性降低。RSA安全性高,但是运行较AES更慢.

 

 

RSA算法数字签名和检验:

使用Crypto实现RSA算法的数字签名和检验

 

 

实际案例:

设计方案

步骤1:获取基于Elgamal算法生成的公钥和私钥

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算法进行签名

 

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算法对数据进行加密流程

AES_SECRET__ = '8labsecretpwdfqm'
AES_IV__ = AES_SECRET__[::-1]
aes_encrypt = AESHelper(AES_SECRET__, AES_IV__).encrypt(str(data))

  

步骤5:因AES 算法加密速度快,但密钥协商和传输过程使安全性降低, 因此考虑和Elgamal算法结合使用,提高数据的安全性

步骤6:使用Elgamal算法的公钥,生成秘钥和随机数

 

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算法机密后的数据按照一定的规则打乱数据

 

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验证签名

 

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

 

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加密数据,并解密

 

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)

  

案例展示:

执行过程:

 

D:\ProgramData\Anaconda3\python.exe "D:/PycharmProjects/sklearn_project/Unsupervised learning/conf/Remote_authentication/server.py"
私钥d:168
公钥prime_num:317 alpha:2 bata:244
ElGamal算法生成秘钥对耗时:0.0010027885437011719
将算法生成的公钥发送给agent并等待发送数据Y/N: Y
正在执行...
本机的mac地址是:48:89:e7:c6:bd:3e
本机的ip地址是:192.168.233.1
生成公钥私钥耗时:0.36302924156188965
签名耗时:0.00498652458190918
AES加密耗时:0.0009980201721191406
进入加密流程... ...
输入的随机数x是:308
输入的随机数K是:91
生成的秘钥:[314, 149]
生成随机字符串长度:308
截取的前:4, 后:304
应用算法添加随机字符串耗时:0.003998994827270508
agent耗时:0.3850116729736328
已收到agent发送过来的数据,是否接收处理Y/N: Y
正在执行...
签名验证成功!!!
验证签名耗时:0.000997304916381836
ElGamal解析后的x:308
ElGamal算法解密生成x耗时:0.009972095489501953
截取的前:4, 后:304
{'host_ip': '192.168.1.192', 'pcr': '0000000000000000000000000000000000000000', 'sig': 'na+XFjz0mkjlP1gPkSK6tMTpVXQQAzH4I9rI6eZatKdiCSZpuD8kaIHsuWqerGazjhZs1gfw/FVMap+8tao71IvR2JMbCKwITnwmt4RIKwXdasLJU7GCbIHmqfPLWhhBTcvai1hqXMdD2J/t3NdyL4CsaTKxVfjgauhN1JTIgH5rf1RTS1BNyotB4GqSiuY3RqxBiE/Q6OYB9TA4Ou7rQa1L55/kt9ERyxuhTBmbBeJEulWkGpiiZsakR6+X20TTwWIF2ZfFaAMJ48Z305io1hzyZqSCqwbQrx7nefgORWlVOtlmQAvfWYBB3sHFB8j8/GhwfNtTN/1ei1cu/4brmA==', 'port': 50052, 'host_name': 'tpm-192', 'curr_seek': 450, 'line_num': 4, 'ima_list': [{'file_path': '/home/lab/fqm/test/pp88.sh', 'file_hash': 'e64632747b73cd46c7d2e05fdb1b2e6f2eea6f8c', 'file_size': 36, 'file_type': 'Bourne-Again shell script, ASCII text executable', 'access_auth': '0o100755', 'uid': 0, 'gid': 0, 'last_visit_time': '2022-10-19 23:54:26', 'modify_file_time': '2022-10-18 19:03:38'}, {'file_path': '/home/lab/fqm/test/pp99.sh', 'file_hash': 'e64632747b73cd46c7d2e05fdb1b2e6f2eea6f8c', 'file_size': 36, 'file_type': 'Bourne-Again shell script, ASCII text executable', 'access_auth': '0o100755', 'uid': 0, 'gid': 0, 'last_visit_time': '2022-10-19 23:54:26', 'modify_file_time': '2022-10-18 22:19:13'}, {'file_path': '/home/lab/fqm/test/pp100.sh', 'file_hash': 'e64632747b73cd46c7d2e05fdb1b2e6f2eea6f8c', 'file_size': 36, 'file_type': 'Bourne-Again shell script, ASCII text executable', 'access_auth': '0o100755', 'uid': 0, 'gid': 0, 'last_visit_time': '2022-10-19 23:54:26', 'modify_file_time': '2022-08-08 23:23:25'}, {'file_path': '/usr/bin/ag', 'file_hash': 'cec492721758b5a1642deb7b14e4ffc8a4d27718', 'file_size': 82296, 'file_type': 'ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=9fec1d51053182d4d1138d4c8d86b0375e856247, stripped', 'access_auth': '0o100755', 'uid': 0, 'gid': 0, 'last_visit_time': '2022-10-19 23:55:19', 'modify_file_time': '2017-11-06 18:39:50'}], 'detect_status': 0, 'curr_lines': 954, 'timestamp': 1666166252, 'host_sys': 'LINUX', 'total_lines': 954, 'start_lines': 950, 'total_seek': 450, 'start_seek': 34840}

Process finished with exit code 0

 

代码:

 需要代码的可以评论给我

 

总结:

Elgamal算法也可以实现加密和签名的过程, 与RSA算法相比,ElGamal算法哪怕是使用相同的私钥,对相同的明文进行加密,每次加密后得到的签名也各不相同,有效的防止了网络中可能出现的重放攻击。Rsa是基于大质数分解难题;而Elgamal是基于G上的离散对数难题

签名过程也可以使用Elgamal算法, 因为我这经常使用RSA签名, Elgamal签名使用过的少, 担心会出现预料之外的问题, 所以没有尝试使用

本次案例也只是针对AES算法安全性考量,所以考虑结合Elgamal算法, 增强安全性,当然Elgamal也可以直接对数据进行加解密操作

有兴趣的小伙伴, 也可以尝试下

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章