我正在尝试使用openssl中的命令行手动计算/生成https会话的主密钥。我在HTTPS会话中记录了客户端密钥交换、更改密码规范、加密握手消息的所有相关数据。到目前为止,我在RFC5246中读到的内容是: master_secret = PRF(pre_master_secret,"master secret",ClientHello.random + ServerHello.random) 0..47;
其在RFC中的进一步读数将等于:
P_hash(秘密,种子)=HMAC_hash(秘密,A(1) +种子)+HMAC_hash(秘密,A(2) +种子)+ ...Where secret =来自客户端的预主密钥,其中A(0)=SEED =“master secret”+clienthello.random+serverhello.random
A(1)=HMAC_hash(secret,A(0)) A(2)= HMAC_hash(secret,A(1))
并遍历直到我得到所需的48字节的主密钥/密钥
如果我的假设是正确的,我希望通过使用openssl的命令行迭代来获得我的48字节,如果这是可能的,像这样的东西2次或需要多少次才能获得48字节。我知道这只会在屏幕上回显我当然会存储的值,以便在下一次迭代中使用。echo -n "value“| openssl dgst -sha1 -hmac "key”
我是不是偏离了我对RFC的解释,或者像这样的事情是可能的?如果我的解释是正确的,我是否遗漏了任何步骤?关于David B
发布于 2018-08-26 00:14:58
你的问题我不清楚。(英语不是我的母语。)但是我自己实现了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)是通过对以前生成的A进行散列生成的。代码不是抽象的,而是一个具体的例子。
我希望你能在这段代码中得到你需要的信息。
https://stackoverflow.com/questions/51380688
复制相似问题