静态非对称加密

Static Asymmetric Encryption

我是密码学新手,请多多包涵!我想在 Python 中进行一些非对称加密。我尝试使用 asymcrypt 库,但发现每次加密字符串时我都会得到不同的加密。我想知道是否有办法保持加密静态(类似于使用 sha512、md5 等进行哈希处理时)。

把这个写成代码,基本上当我运行:

print(encryptData('hello world'))
print(encryptData('hello world'))

我得到以下输出:

b'\xcf\x93"\x97(\x91\xbd;"\...
b'2\x86L\x0c3\x92W\xec\xaa/...

理想情况下我想要的是:

b'\xcf\x93"\x97(\x91\xbd;"\...
b'\xcf\x93"\x97(\x91\xbd;"\...

基本上,我正在寻找:

我希望使用静态加密,因为我想使用这些加密来查询数据库。在此先感谢您的帮助!

通常密码会产生随机输出。这是因为您可以重复消息,如果对手看到相同的密文,他们可以从中提取信息。

例如,如果您的消息仅包含一个位,0 或 1,并且攻击者知道第一次加密的明文位(比如 1),那么可以从给定的密文中直接看到所有明文.换句话说,该方案对于 已知明文 是不安全的。推而广之,这些方案并不 IND-CCA 安全。

使方案针对已知明文安全的方法是随机化方案。对于基于对称(块)密码的方案,这是通过提供 IV 或 nonce(唯一数字)来实现的,它在与密钥密码组合时随机化密文。对于 RSA,它是通过使用 随机填充 来实现的。在您的情况下,它使用 OAEP 填充。


但是,您表示此 确定性 明确是您所需要的,而不是通常的 随机化 。确实有确定性方案可以做到这一点。当然有“原始RSA”,这意味着只是模幂运算。但是,该方案 非常 不安全,因此帮助不大。

另一种方法是使用确定性 OAEP 或 DOAEP。然而,事实上我指的是一篇论文(由 OAEP 计划的作者之一 Bellare 撰写)应该表明您正在安全路径之外穿线。更高级别的加密库 - 例如您指向的 asymcrypt - 不会提供它。但是,如果您已经拥有 OAEP 的源代码,那么实施它应该相对容易(即相当困难,但不如实施 OAEP 难)。

当然,使用确定性加密不会使方案对已知明文无懈可击;只有随机化可以做到这一点。

顺便说一句,您的要求也与 同态加密 的主题有关,它也经常使用确定性加密。不过,这通常被认为是一门专业学科。


一个丑陋的技巧是加密(包装)一次 AES 密钥,然后使用该 AES 密钥和静态 IV 来加密数据。这是非常丑陋的,因为您需要保留 AES 密钥来加密任何其他消息。用 public 密钥包裹后,您需要私钥来检索对称 AES 密钥,这只有在解密时才有可能。


当然你也可以使用散列函数,但要注意可能会泄露明文信息。暴力破解单个位的哈希值,如前例所示,毕竟非常容易,因此它甚至比确定性加密更不安全。

如果您使用带散列的对称密钥(例如使用 HMAC),那么您又回到了之前 AES 密钥的问题,所以这也没有太大帮助。