[英]generate master key tls1.2
我正在嘗試使用openssl中的命令行為HTTP會話手動找出/生成主密鑰。 我一直在HTTPS對話中跟蹤所有相關數據,直到客戶端密鑰交換,更改密碼規范,加密握手消息為止。 到目前為止,我在RFC5246中閱讀的內容是:master_secret = PRF(pre_master_secret,“主密鑰”,ClientHello.random + ServerHello.random)[0..47];
RFC中的以下內容等於:
P_hash(秘密,種子)= HMAC_hash(秘密,A(1)+種子)+ HMAC_hash(秘密,A(2)+種子)+ ...其中secret =客戶的主控機密其中A(0)= SEED =“主密鑰” + clienthello.random + serverhello.random
A(1)= HMAC_hash(秘密,A(0))A(2)= HMAC_hash(秘密,A(1))
並遍歷直到我獲得所需的48個字節的主密鑰/密鑰
如果我的假設是正確的,那么我希望遍歷openssl的使用命令行來獲取我的48個字節(如果可能),例如2次或獲取48個字節所需的次數。 我知道這只會在屏幕上回顯我當然會存儲在下一次迭代中使用的值。 echo -n“值” | openssl dgst -sha1 -hmac“密鑰”
我是基於對RFC的解釋還是基於這種可能性? 如果我的解釋正確,我會錯過任何步驟嗎? 問候大衛B
我不清楚您的問題。(英語不是我的母語。)但是我自己實現了prf函數。 並用測試向量進行測試。 工作正常。
template<class H> class PRF
{//H is hash function usually sha256
public:
template<class It> void secret(const It begin, const It end) {
for(It it = begin; it != end; it++) secret_.push_back(*it);
hmac_.key(secret_.begin(), secret_.end());
}
void label(const char* p) {
while(*p) label_.push_back(*p++);
}
template<class It> void seed(const It begin, const It end) {
for(It it = begin; it != end; it++) seed_.push_back(*it);
}
std::vector<unsigned char> get_n_byte(int n) {
auto seed = label_;//seed = label + seed_
seed.insert(seed.end(), seed_.begin(), seed_.end());
std::vector<unsigned char> r, v;
std::vector<std::array<unsigned char, H::output_size>> vA;
vA.push_back(hmac_.hash(seed.begin(), seed.end()));//A(1)
while(r.size() < n) {
v.clear();
v.insert(v.end(), vA.back().begin(), vA.back().end());
v.insert(v.end(), seed.begin(), seed.end());
auto h = hmac_.hash(v.begin(), v.end());
r.insert(r.end(), h.begin(), h.end());
vA.push_back(hmac_.hash(vA.back().begin(), vA.back().end()));//A(i+1)
}
while(r.size() != n) r.pop_back();
return r;
}
protected:
HMAC<H> hmac_;
std::vector<unsigned char> secret_, label_, seed_;
};
正如您在代碼中看到的那樣,A(i + 1)是通過對先前生成的哈希進行哈希運算而生成的。 代碼不是抽象的,而是一個具體的示例。
我希望您可以在此代碼中獲得所需的信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.