遠程證明方案
知識點:
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也可以直接對數據進行加解密操作
有興趣的小夥伴, 也可以嘗試下