洋葱路由器的一个非常简单的实现

时间:2010-01-19 23:04:03

标签: java security encryption

我想在Java中编写一个非常简单的洋葱路由器实现(但包括chaum mixes) - 很多公钥/私钥加密看起来非常简单,但很难理解最后一个路由器是如何知道最终的洋葱皮已被'剥皮'。

我正在考虑对某些校验和进行编码,以便每个路由器尝试使用其私钥进行解密,如果校验和有效,则将新去皮的洋葱转发到下一个路由器。

只有这样,(假设每次成功解密时都会剥离一些校验和),会有一种方法(查看校验和)来估计它与解密的接近程度 - 这是一个主要的漏洞?校验和方法是一种适当的简化吗?

2 个答案:

答案 0 :(得分:0)

您可以通过将校验和存储在循环数组中来隐藏校验和的数量,循环数组的初始偏移量是在构造洋葱时随机选择的。等效地,您可以在每次解密后循环移位该数组。

答案 1 :(得分:0)

无论您提到哪个问题,通常都会在加密/解密数据时包含一些完整性检查。但是,校验和并不适合这种情况。看看安全哈希算法,例如SHA-256(标准Java加密框架中内置了实现)。

现在,回到你原来的问题......对于洋葱的每个节点,你将传递一个加密的“数据包”,但该数据包不仅仅包含要传递的实际数据 - 它将包括下一个节点,您的哈希码以及其他任何内容的详细信息......包括说明下一个“节点”是洋葱路由器还是实际终端主机的任何标志/指示。实际上,最后一个节点的数据必须具有一些特殊信息,即与之通信的实际终端主机的细节。换句话说,最后一个节点知道洋葱已经去皮了,因为你在最终收到的数据中对这个事实进行了编码。

或者至少,我认为这就是我做的方式......; - )

N.B。加密本身并不复杂,我不认为,但可能有一两个细微之处要小心。例如,在正常的单个客户端 - 服务器对话中,您必须要注意的一个细微之处是永远不要使用相同的密钥对同一数据块进行两次加密(或者至少,它归结为 - 研究“块”)模式“和”初始化向量“如果你不熟悉这个概念)。在单个客户端 - 服务器对话中,客户端和服务器可以指示部分初始化向量。在洋葱路由器中,必须找到一些其他解决方案(最坏的情况是,使用由客户端单独生成的强生成的随机数,我猜)。