在没有证书的两个对等点之间保护 link?

Secure link between two peers without certificates?

我正在 Java 中编写软件,它将 运行 在 Android、Windows、Linux 和 OSX 上使用并需要这些设备让所有人都能安全地相互交谈。

我最初的想法是使用非对称算法(例如 RSA)并手动共享 public 密钥。然后会话将仅使用 RSA 加密。由于缓冲区大小,我遇到了这个问题,然后我阅读了 CBC 等以及如果未执行某种形式的数据异或的数据泄漏问题。

所以...我查看了使用 AES/CBC/{padding}。最初这听起来不错:只需共享密钥、IV 就可以了。

但是这些应用程序在任何时候都可以双向通信,因此保持 IV 同步似乎是不可能的,导致每条消息都会发送一个新的 IV。没什么大不了的,但 AES 相对于 RSA 的优势之一是数据大小,现在我将向每条消息添加 32 个字节。虽然我想保留 'receiver' 和 'sender' 密码可能会起作用。

现在我又开始考虑替代方案,并尽量避免自己动手。

是否有充分理由不使用手动完成的 RSA 和 CBC(或类似)? IE。将数据分成块,根据需要填充,并使用 RSA 加密,执行任何看起来最可靠的 XOR 策略。

在不创建 SSL CA 的情况下保持对等点之间的安全和可信通信是否更好?或者,有没有一种方法可以连接到证书验证程序,以便我可以使用我的预共享 public 密钥来验证对等连接?

任何其他 suggestions/examples 用于 best/simple 多平台点对点安全通信?

您应该考虑实施 hybrid cryptosystem。如果我能正确猜出你对这个主题的了解,你应该真的使用一个预先存在的协议,比如 TLS 或 DTLS,因为你不会设计一个加密安全协议蓝色。

请注意,创建 PKI 需要证书,当然非对称加密也随之而来。但是,您应该只需要在 握手 期间使用非对称加密,其中包括初始身份验证和会话密钥协商。