我正在尝试使用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
答案 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)是通过对以前生成的哈希进行哈希运算而生成的。 代码不是抽象的,而是具体的示例。
我希望您可以在此代码中获得所需的信息。