我正在使用Bruce Schneier和Niels Ferguson的书中借用的技术Practical Cryptography。基本上,它归结为:
pubk_A = Alice的公钥
entropy =来自加密质量PRNG的字节
encrypted_entropy = RSA_Encrypt pubk_A (熵)
hashed_entropy = SHA2-512 (熵)
encrypt_key BA = hashed_entropy [0:32]
encrypt_nonce BA = hashed_entropy [32:48]
hmac_key BA = hashed_entropy [48:64]
然后爱丽丝这样做:
privk_A = Alice的私钥
entropy = RSA_Decrypt privk_A (encrypted_entropy)
hashed_entropy = SHA2-512 (熵)
encrypt_key BA = hashed_entropy [0:32]
encrypt_nonce BA = hashed_entropy [32:48]
hmac_key BA = hashed_entropy [48:64]
这非常适合生成可用于从Bob与Alice通信的密钥。但我需要能在两个方向上使用的按键。我正在考虑以这种方式修改算法:
鲍勃用熵做到了这一点:
pubk_B = Bob的公钥
hashed_entropy BA = SHA2-512 ( SHA2-256 (pubk_A)+ entropy
encrypt_key BA = hashed_entropy [0:32]
encrypt_nonce BA = hashed_entropy [32:48]
hmac_key BA = hashed_entropy [48:64]
hashed_entropy AB = SHA2-512 ( SHA2-256 (pubk_B)+ entropy
encrypt_key AB = hashed_entropy [0:32]
encrypt_nonce AB = hashed_entropy [32:48]
hmac_key AB = hashed_entropy [48:64]
Alice通过解密encrypted_entropy获得熵后,可以做同样的事情。
如您所见,现在有两组密钥,一组用于从Bob到Alice的通信,另一组用于从Alice到Bob的通信。
这有什么问题吗?我服用的安全隐患是什么?系统的安全性是否比我只是让一方在nonce中略微调整一样?有没有更好的方法来处理这个问题而不添加往返次数?
答案 0 :(得分:1)
Alice和Bob都有一个双向通信共享密钥应该没有问题。实际上这很像SSL/TLS's shared master secret。唯一的考虑因素是您不能对任何数据包使用相同的iv+master key
组合。这也是must be random。
可以对此Schneier / Ferguson协议进行一项改进是使用cmac mode,这将消除对hmac_key
的需求。这将减少每个数据包的握手和CPU使用中使用的带宽。
就您的本协议变体而言。您仍然需要依赖传输encrypted_entropy = RSA_Encryptpubk_A(entropy)
。这是一个重要的步骤,因为您需要共享密钥。在密钥生成中使用已知值pubk_A
困扰着我。请记住,应该假设攻击者知道任何公钥。使用sha256不会使这个值更随机或更难以暴力。因此,攻击者必须进行的猜测数量相当于这三项计算:sha512(sha256(pubk_A)+entropy)
,sha512(pubk_A+entropy)
,sha512(entropy)
。这意味着这是浪费资源,因为您没有获得优于攻击者的优势。