實現補充
1、通訊雙方通過協商,共同建立會話金鑰,任何乙個參與者均對結果產生影響,不需要任何第三方參與
2、會話金鑰由每個協議參與者分別產生的引數通過計算得到
1、初始化:a選取乙個生成元g和乙個大素數p,傳送給b
2、a隨機選取0<xx mod p後,將x傳給b
3、b隨機選取0<yy mod p後,將y傳給a
4、a計算yx mod p得到會話金鑰k1
5、b計算xy mod p得到會話金鑰k2
6、由下可知 k1 == k2,此時雙方便可利用會話金鑰進行加密通訊了
#ifndef crypto_h
#define crypto_h
#include
/*** 編譯器:tdm-gcc 4.8.1 64bit
* * 基於dh的金鑰協商加密類
* 1、請先使用crypto::init()方法初始化隨機種子
* 2、客戶端構造此類,服務端通過客戶端生成的 [g,p] 構造
* 3、客戶端通過呼叫get_public()方法得到乙個陣列 [g, p]
* 4、客戶端、服務端通過get_pub_key()方法獲取公鑰 c、s 用於協商
* 5、客戶端、服務端通過get_key(size_t pub_key)方法獲取金鑰用於加密
* 6、客戶端、服務端可使用crypto(char *data, size_t size, const char *key)方法加解密
*/class
crypto
;#endif
#include
"crypto.h"
#include
#include
#include
crypto::
crypto()
crypto::
crypto
(size_t g, size_t p)
void crypto::
init()
size_t *crypto::
get_public()
size_t crypto::
get_pub_key()
char
*crypto::
get_key
(size_t pub_key)
void crypto::
crypto
(char
*data, size_t size,
const
char
*key)
}size_t crypto::
create_big_integer()
size_t crypto::
pow_mod
(size_t n,
unsigned
int times, size_t mod)
return tmp;
}crypto::
~crypto()
#include
#include
#include
"crypto.h"
using
namespace std;
void
print
(char
*data,
int size)
cout << endl;
}int
main
(int argc,
char
** ar**)
// 模擬會話
char data[11]
="helloworld"
;// 明文
cout <<
"a加密: "
<< endl;
client.
crypto
(data,
10, k1)
;// 使用金鑰加密
print
(data,10)
; cout <<
"**********"
<< endl;
cout <<
"b解密: "
<< endl;
server.
crypto
(data,
10, k2)
;// 使用金鑰解密
原理中說的是生成隨機大素數,在實現的時候我生成的是大整數,因為大素數生成是個麻煩的事情,我也嘗試寫過,但是生成速度太慢,影響體驗。考慮到我們的加密方式是按位異或加解密,用這種方法就算不使用大素數依舊不會出問題,所以直接生成的是乙個大整數,關於大素數的生成可以看一下 這篇文章,講得挺好的。
Diffie Hellman金鑰交換
最近在看網課的時候了解了diffie hellman金鑰交換演算法,這裡記錄下來。在公共網路中傳輸資料,很容易被第三方擷取。為了加強資料安全需要使用加密演算法。dh金鑰就是其中一種。dh金鑰就是很好的一種演算法是一種安全協議。能允許雙方在不安全的通道上建立只有彼此知曉的金鑰,其他人即使能看到傳輸的資...
Diffie Hellman金鑰交換
diffie hellman金鑰交換 dhke 是由whitfield diffie和martin hellman在1976年提出的。金鑰交換方案提供了實際中金鑰分配問題的解決方案,即允許雙方通過不安全的通道進行交流獲得乙個共同金鑰。許多公開和商業密碼協議中都實現了這種基本的金鑰協議技術,比如安全外...
Diffie Hellman 金鑰交換協議
設p 是乙個素數,gf p 上的離散對數是困難的,設 g為其生成元,為達到通訊雙方共享金鑰的目的,通訊雙方a和 b分別進行如下操作。1 a 進行如下兩步操作 隨機選取乙個整數 xa,0 xa 計算ya gxa mod p,將ya 傳送給b 2 b進行如下兩步操作 隨機選取乙個整數xb,0 xb傳送給...