首页 > 解决方案 > 静态非对称加密

问题描述

我是密码学新手,所以请多多包涵!我想在 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;"\...

基本上,我希望:

我正在寻找静态加密,因为我想使用这些加密查询数据库。提前感谢您的帮助!

标签: pythonencryptioncryptographypublic-key-encryptionencryption-asymmetric

解决方案


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

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

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


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

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

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

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


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


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

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


推荐阅读