簡體   English   中英

生成主密鑰tls1.2

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM