我们可以加密必须使用任何私钥和服务器生成位解密的数据吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我们可以加密必须使用任何私钥和服务器生成位解密的数据吗?相关的知识,希望对你有一定的参考价值。
我想出了一个制作安全数据的方案。假设我有一个任何人都可以下载的公共加密文件。但是,每当有人想要解密这些数据时,他们需要从服务器获取密钥
使密钥无法共享。来自服务器的密钥将无法直接解密数据。但是,必须使用客户端的私钥解密数据,而无需服务器知道客户端的privateKey
我希望下面的图表可以清楚地解释它
可能吗?可以做到这一点的算法是什么?
我想出了一个制作安全数据的方案。假设我有一个任何人都可以下载的公共加密文件。但是,每当有人想要解密这些数据时,他们需要从服务器获取密钥
使密钥无法共享。来自服务器的密钥将无法直接解密数据。但是,必须使用客户端的私钥解密数据,而无需服务器知道客户端的privateKey
每次下载文件时都要这样做,附加一个随机字符串。然后使用用户的公钥对文件进行加密,并使用相同的字符串生成相应的哈希对称。例如,受密码保护的ZIP文件中的GPG文件。
因此,当Bob下载Financial_Report_201809_d8a1b2e6.pdf.zip
时,Alice会下载Financial_Report_201809_ff2a91c3.pdf.zip
。
如果他们想要解密文件,他们需要将服务器发回给随机字符串,服务器将为他们提供外部ZIP的密码。然后他们留下了一个加密文件,只有他们的私钥可以解码。
请注意,一旦他们解密了文件,就没有什么能阻止他们将文件以明文形式转发给其他人。另一方面,共享加密的PDF没有任何用处,因为他们还需要共享他们的私钥。
还要注意,因为他们需要在线获取外部密码,并且最后留下了一个明文文件,这几乎在功能上等同于在建立用户身份后以明文形式下载的文件。
主要区别是:
- 加密文件(上例中的PDF)可能根本没有被服务器加密。它可能是由用户提供的,然后用户只知道他只能读回文件(尽管如此,其他任何人都没有意义下载它)。
- 传输的文件非常安全地传输。具有对数据流的完全访问权限的攻击者将无法解码该文件(但这只能通过使用用户的公钥加密而获得 - 不需要额外的ZIP阶段)。
UPDATE
您只想加密整个文件一次(对所有用户),然后将相同的文件发送给Alice和Bob,并在解密时让它们需要两个不同的密钥。这里的问题是Alice的密钥也适用于Bob的文件,因为它是同一个文件。除非你能隐藏解密过程的一些细节(例如,使用你控制的程序,无法调试并始终连接到你的服务器),这里没有任何神奇的功能可以解决这个问题:这个命题一直表明失败了)。
如果要限制加密成本,可以使用对称加密的数据有效负载(始终相同)和非常短的非对称加密密钥有效负载(始终不同)发送海量文件,但仍然容易受到解密被捕获的关键:
[ RSA(ALICE.PUB, "SQUEAMISH OSSIFRAGE" ][ RIJNDAEL("SQUEAMISH OSSIFRAGE", LARGE FILE) ]
在上面的场景中,一些程序必须读取加密头并解密'Squeamish Ossifrage'密码,然后在没有密码被截取的情况下继续解密(例如播放)额外的有效载荷。这意味着您需要自己提供程序。
这在功能上等同于连接到服务器并在问题上下载“是”或“否”的程序(适当加密,签名和保护)“我是爱丽丝的玩家。我可以解密和播放'永远不想放弃你。 AVI'?” ,除了Alice的播放器和服务器共享的秘密之外,没有密码或公钥被识别或交换。
UPDATE II
如果目标是保存加密资源,则可以在注释中暗示加密客户端:
- 该文件使用专门生成的私钥加密一次。
- 私钥存储在二进制文件中(我们必须假设它是不可攻击的)。
- 用户必须提供他的公钥才能使解密工作
- 程序可以从存储库验证公钥(或者,用户可以将公钥提供给服务器,服务器将生成并发送二进制文件以供下载)
- 然后程序运行解密和加密
- 用户留下了用他的公钥加密的文件,他可以单独解密。
UPDATE III
为了永远不暴露明文文件(即,算法是否泄露并不重要),您可以设计以下方案。请记住,我不是一个密码学家,可能会有各种各样的侧面频道被发现。
- 您准备一个转换表,将每个16位字映射到另一个16位字。即使您使用两个互易矩阵进行编码和解码,这也是一种对称加密的风格。每个矩阵保存所有可能的16位字,这意味着65536个值,因此大小为128 Kb。
- 您使用加密矩阵对文件进行一次加密。没有解密矩阵,文件就无法使用。
- 用户必须向您发送他的公钥。
- 您通过使用该密钥加密每个单词来准备变形矩阵,并使用解密值作为索引。
因此,例如,说明文件的第一个字是A18B。在加密矩阵中,在加扰之后,A18B位置将包含说701C,因此,在701Cth位置的解密矩阵将保持a18b。
用户有一个以701c开头的文件......这是没用的。
用户向您发送他的公钥,并对从0000到ffff的所有单词运行65536次加密。然后,您确定a18b的加密是791c。您准备了一个在701cth位置具有791c的重新编码矩阵。
然后,您向用户发送此矩阵,该矩阵具有128K字节,其中701cth位置为791c。
用户运行transmogrification,这是非常快的,并留下一个以791c开头的文件(因为701c变为791c - 我在我的例子中错误地选择了两个相似的值,这没有意义)。一旦用他的私钥解密,该值将产生18b,这是“可读”值。
用户现在拥有一个由其公钥加密的文件。 a18b值从未出现在任何地方。
剩下的就是用户使用他的私钥和16位的代码块大小来解密文件。这个操作将由客户端运行并且速度很慢,这就是为什么通常一个大的随机快速对称密钥是RSA编码的,并且用于对称快速加密大文件的原因,这可以在私钥之后快速解密。解锁对称密钥。
用户无法将128K发送给任何人,因为没有私钥他们就没用了。
(这里的问题仍然是用户现在可以用他的私钥解密文件,然后发送它,即使它很笨,因为它是一个非常大的文件)。
必须使用客户端的私钥解密数据,而无需服务器知道客户端的privateKey 原始文件只能由特定客户端使用自己的私钥解密,
有一个常用的密码系统叫做hybrid cryptosystem。
步骤是:
- 原始数据使用随机唯一密钥加密。
- 数据加密密钥由客户端的公钥加密(客户端的公钥需要知道服务器)。
- 客户端需要使用其私钥来解密文件加密密钥并解密文件
您可以使用任何非对称加密算法。
使用公钥和私钥对。公钥用于加密只能使用私钥解密的数据。这方面有很多资源,例如文章形式InfoSec Institute。
有几种经证实的良好的非对称算法,如RSA,DSA,椭圆曲线密码学(由以太坊区块链使用)。还有很多Python库。
以上是关于我们可以加密必须使用任何私钥和服务器生成位解密的数据吗?的主要内容,如果未能解决你的问题,请参考以下文章