生成主密钥tls1.2

时间:2018-07-17 11:51:50

标签: https 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)+种子)+ ... 机密=客户的主控机密 其中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

1 个答案:

答案 0 :(得分:0)

您的问题对我不清楚(英语不是我的母语。) 但是我自己实现了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)是通过对以前生成的哈希进行哈希运算而生成的。 代码不是抽象的,而是具体的示例。

我希望您可以在此代码中获得所需的信息。