公钥是由(N, e)定义的,其中N是两个大素数的乘积,而e则被选择为e.d = 1 (mod phi(N)),其中phi(N)是欧拉函数。e是加密指数,d是解密指数。
假设x是被加密为c = x^e mod(N)的对称密钥。如何防止篡改这个密文c?
发布于 2022-01-10 14:00:35
正如下面的注释所指出的,RSA通常不被用作对称密钥的模幂。相反,要么使用PKCS#1 v1.5填充加密密钥,或者最好使用OAEP加密,要么使用在\big[0, N\big)范围内具有随机值的共享秘密进行模幂运算。在后一种情况下,实际的密钥是使用KDF (密钥派生函数)导出的,有时也简单地称为"PRF“(参见例如TLS 1.2)。这被称为RSA-KEM。
基本上有两种方法可以避免通过中间人(MitM)攻击篡改密钥:
如果您预先共享和信任一个静态密钥对的公钥,那么您将有一个静态密钥交换,即公钥是可信的,但是您不会提供前向安全性。这意味着,如果对方知道私钥,则可以计算每个随后的对称密钥。
公钥的信任可以通过不同的方式来建立。对于静态密钥对,可以使用PKI信任公钥。如果您需要信任一个临时公钥,则接收方可以使用私钥签名,私钥是信任密钥对的一部分。
另一种方法是事后验证已建立的会话密钥。这可以显式地或隐式地完成。
在对共享秘密进行显式验证时,解密密钥的方使用它在双方都知道的静态数据上生成MAC,并发送MAC。该方现在可以确定已经建立了正确的对称密钥。
在隐式验证中,密钥只用于来回发送经过身份验证的消息。对这些包的身份验证表明已建立了正确的密钥。
当然,只有信任公钥的一方才能进行身份验证。类似地,如果验证了任何MAC,那么这只表明持有私钥的一方已经能够解密。因此,如果您需要对剩余方进行身份验证,则需要单独处理。
在TLS中,这是通过让对方创建一个可以验证的签名来执行的。这还要求预先信任该密钥对的公钥;最后,您需要始终建立对某物的信任,然后才能对该方进行身份验证。
很少使用TLS客户端身份验证。取而代之的是身份验证框架或基于密码的身份验证。或者客户的身份从来没有确定过
请注意,使用RSA密钥建立的密钥的身份验证与使用Diffie-Hellman建立密钥没有什么不同,尽管后者有两个密钥对需要考虑。最后,同样的技术也可以使用。
https://crypto.stackexchange.com/questions/98056
复制相似问题