我正在创建一个服务器,人们可以来这里互相交谈。我主要是为了一个有趣的项目,这是我的问题。
我正在使用 RSA 进行加密/解密,所以只有客户端才会知道在说什么。我不希望服务器处理任何解密的文本。
我的问题是,这样做最有效的方法是什么?根据我的理解,我将不得不给每个人对方的公钥。一旦客户说了什么,就必须使用他们各自的公钥单独加密给每个人,不是吗?对我来说,这似乎效率极低。
有一个更好的方法吗?
谢谢
我正在创建一个服务器,人们可以来这里互相交谈。我主要是为了一个有趣的项目,这是我的问题。
我正在使用 RSA 进行加密/解密,所以只有客户端才会知道在说什么。我不希望服务器处理任何解密的文本。
我的问题是,这样做最有效的方法是什么?根据我的理解,我将不得不给每个人对方的公钥。一旦客户说了什么,就必须使用他们各自的公钥单独加密给每个人,不是吗?对我来说,这似乎效率极低。
有一个更好的方法吗?
谢谢
在这种情况下,公钥密码学可用于帮助建立一个安全通道,在该通道中传输对称密钥。一旦建立了安全通道,就没有必要继续使用公钥/私钥进行加密和解密。相反,生成一个对称密钥并使用它来加密流量。您只需分发一次对称密钥,并且只需使用此密钥而不是每个公钥对流量进行加密。主要挑战是何时或是否需要重新生成、撤销等对称密钥。
最有效的方法是让客户交换他们的 RSA 公钥,然后生成随机的“会话密钥”以用于相互对话。这避免了多重加密,并且不需要服务器能够解密数据。
因此,如果 Jack 要与 Jill 和 Seth 交谈,Jack 会生成一个随机加密密钥用于与 Jill 和 Seth 交谈。Jack 用 Jill 的公钥和 Seth 的公钥加密这个密钥,并将加密的密钥发送给 Jill 和 Set。服务器无法解密它们。现在 Jill 和 Set 知道 Jack 将使用的密钥。Jack 现在可以使用此密钥对消息进行一次加密,然后让服务器将它们中继给 Jill 和 Seth。Jill 和 Seth 可以使用会话密钥解密数据。服务器永远无法解密数据。
这意味着客户端必须保留会话密钥表并为他们可能希望与之交谈的任何不同的客户端组合生成新密钥。
请注意,对于所有这些方案,除非您使用证书,否则它们很容易受到攻击,服务器只是用自己的密钥替换客户端的密钥,并解密和重新加密客户端不知道的所有流量。
运行一个 jabber 服务器并告诉他们使用 pidgin 和 OTR
通常,非对称加密的聊天握手从交换公钥开始。理想情况下,您应该有一些机制将密钥与所有者绑定(想想 SSL 证书和签名)以防止 MITM 攻击。最容易使用现有系统(例如 SSL 证书或 PGP 密钥)以避免重新发明轮子。您决定信任的签名取决于您有兴趣维护的信任模型类型。一个好的起点是准确确定用户身份的构成,以及攻击者必须通过何种类型的访问来窃取该身份。
然后,当然,使用 RSA 加密用于对称加密的 ad-hoc 会话密钥,如 AES、Twofish、RC4 等。效率在于你只使用 RSA 来建立你所在方的身份沟通,然后你立即切换到更有效的东西。
另一方面,
如果您正在谈论在广播媒体中使用 RSA(想想 IRC 而不是 Jabber),那么是的,这是非常低效的。加密必然是点对点的,而不是点对多点的。每个流都单独加密。因此,给定客户端生成的加密流的数量等于消息发送到的目的地的数量。每个都独立于其他设置。这正是为什么像 IRC 这样的系统不会在不同客户端之间进行端到端加密的原因。开销太大了。他们最多加密客户端到服务器,允许每个用户拥有一个安全通道,由服务器处理消息分发。
这并不是说你正在做的事情是不可能的或不明智的。如果你想建造它,那就继续吧。