應用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也可以直接對數據進行加解密操作

有興趣的小夥伴, 也可以嘗試下

 

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