首页 > 解决方案 > 我们可以加密必须用任何私钥和服务器生成位解密的数据吗?

问题描述

我想出了一个制作安全数据的方案。假设我有一个任何人都可以下载的公共加密文件。但是,每当有人想要解密该数据时,他们都需要从服务器获取密钥

使密钥无法共享。来自服务器的密钥将无法直接解密数据。但是数据必须在之后用客户端的私钥解密,服务器不知道这些客户端的私钥

我希望下图可以清楚地解释它

在此处输入图像描述

可能吗?可以做到这一点的算法是什么?

标签: securityencryptionprivate-key

解决方案


我想出了一个制作安全数据的方案。假设我有一个任何人都可以下载的公共加密文件。但是,每当有人想要解密该数据时,他们都需要从服务器获取密钥

使密钥无法共享。来自服务器的密钥将无法直接解密数据。但是数据必须在之后用客户端的私钥解密,服务器不知道这些客户端的私钥

使它每次下载文件时,都会附加一个随机字符串然后使用用户的公钥对文件进行加密,并使用由该相同字符串生成的适当散列对称地进行加密。例如,受密码保护的 ZIP 文件中的 GPG 文件。

所以 Alice 下载Financial_Report_201809_d8a1b2e6.pdf.zip,而 Bob 下载Financial_Report_201809_ff2a91c3.pdf.zip

如果他们想解密文件,他们需要将随机字符串发回服务器,服务器将为他们提供外部 ZIP 的密码。然后他们会留下一个只有他们的私钥才能解码的加密文件。

请注意,一旦他们解密了文件,没有什么能阻止他们将文件明文转发给其他人。另一方面,共享加密的 PDF 对他们没有任何帮助,因为他们还需要共享他们的私钥。

另请注意,由于他们需要在线才能获取外部密码,并且最后会留下一个明文文件,因此(几乎)在功能上等同于在建立用户身份后以明文形式下载的文件

主要区别在于:

  • 加密文件(上例中的 PDF)可能根本没有被服务器加密。它可能是由用户提供的,然后用户对只有他可以读回文件感到满意(但其他人下载它几乎没有意义)。
  • 传输的文件非常安全地传输。对数据流具有完全访问权限的攻击者将无法解码文件(但这仅通过使用用户的公钥加密即可获得 - 不需要额外的 ZIP 阶段)。

更新

您只想对整个文件加密一次(针对所有用户),然后将同一个文件发送给 Alice 和 Bob,并让他们在解密时需要两个不同的密钥。这里的问题是 Alice 的密钥也适用于 Bob 的文件,因为它是同一个文件。除非您可以隐藏解密过程的某些细节(例如,使用您可以控制且无法调试且始终连接到您的服务器的程序),否则这里没有任何魔法可以发挥作用:这一命题一直显示会输)。

如果您想限制加密成本,您可以发送带有对称加密数据有效负载(始终相同)和非常短的非对称加密密钥有效负载(始终不同)的海量文件,但您仍然容易受到解密的攻击被捕获的密钥:

[ RSA(ALICE.PUB, "SQUEAMISH OSSIFRAGE" ][ RIJNDAEL("SQUEAMISH OSSIFRAGE", LARGE FILE) ]

在上述场景中,某些程序必须读取加密标头并解密“Squeamish Ossifrage”密码,然后继续解密(例如播放)额外的有效负载,而密码不会被截获。这意味着您需要自己提供程序。

这在功能上等同于程序连接到服务器并下载“是”或“否”的问题(适当加密、签名和保护)“我是 Alice 的播放器。我可以解密并播放“Never Wanna Give You Up”。 avi'?” ,除了 Alice 的播放器和服务器共享的秘密之外,没有任何密码或公钥是已知的或交换的。

更新二

如果目标是节省加密资源,则可以在客户端进行加密,如注释中所示:

  • 该文件使用专门生成的私钥加密一次。
  • 私钥存储在二进制文件中(我们必须假设它是不可破解的)。
  • 用户必须提供他的公钥才能进行解密
  • 该程序可以验证存储库中的公钥(或者,用户可以将公钥提供给服务器,服务器将生成并发送二进制文件以供下载)
  • 然后程序运行解密和重新加密
  • 用户留下了一个用他的公钥加密的文件,他一个人可以解密。

更新三

为了永远不会暴露明文文件(即,算法是否泄露并不重要),您可以设计以下方案。请记住,我不是密码学家,可能会有各种各样的侧通道未被发现。

  • 您准备一个将每个 16 位字映射到另一个 16 位字的转换表。这是一种对称加密,即使您使用两个倒数矩阵进行编码和解码。每个矩阵包含所有可能的 16 位字,这意味着 65536 个值,因此大小为 128 Kb。
  • 您使用加密矩阵对文件进行一次加密。没有解密矩阵,文件就无法使用。
  • 用户必须向您发送他的公钥。
  • 您通过使用该密钥加密每个单词来准备一个变形矩阵,并将解密值用作索引。

因此,例如,假设明文文件的第一个单词是 A18B。在加密矩阵中,加扰后,第 A18B 位置将包含 701C,因此,在第 701C 位置,解密矩阵将包含 a18b。

用户有一个以 701c 开头的文件...没有用。

用户向您发送他的公钥,您对从 0000 到 ffff 的所有单词运行 65536 次加密。然后您确定 a18b 的加密是 791c。您准备一个在第 701c 位置具有 791c 的重新编码矩阵。

然后向用户发送这个矩阵,它有 128K 字节,其中第 701c 个位置是 791c。

用户运行变形,速度非常快,并留下一个以 791c 开头的文件(因为 701c 变成了 791c - 我在示例中错误地选择了两个相似的值,这没有意义)。这个值,一旦用他的私钥解密,将产生 a18b,它是“可读”的值。

用户现在有一个文件,该文件已被他的公钥加密。a18b 值从未出现在任何地方。

剩下的就是用户使用他的私钥和 16 位的代码块大小来解密文件。这个操作会由客户端运行,速度很慢,这也是为什么通常大的随机快速对称密钥是RSA编码的,用于对称快速加密大文件,私钥有后可以快速解密解锁对称密钥。

用户不能将 128K 发送给任何人,因为没有私钥他们将毫无用处。

(这里的问题仍然是用户现在可以用他的私钥解密文件,然后发送它,即使它是一个非常大的文件,很笨拙)。


推荐阅读