python - 静态非对称加密
问题描述
我是密码学新手,所以请多多包涵!我想在 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 或随机数(唯一数字)来实现的,当与密钥密码组合时,它会随机化密文。对于 RSA,它是通过使用随机填充来实现的。在您的情况下,它使用 OAEP 填充。
但是,您表明这种确定性是您明确需要的,而不是通常的randomization。确实有确定性方案可以做到这一点。当然还有“原始 RSA”,这意味着只是模幂运算。但是,该方案非常不安全,因此没有多大帮助。
另一种方法是使用确定性 OAEP 或DOAEP。但是,我指的是一篇论文(OAEP 计划的作者之一 Bellare)的事实应该表明您在安全路径之外进行线程化。更高级别的加密库(例如您指向的 asymcrypt)不会提供它。但是,如果您已经拥有 OAEP 的源代码,那么实现它应该相对容易(即相当困难,但不如实现 OAEP 难)。
当然,使用确定性加密不会使该方案对已知明文无懈可击;只有随机化可以做到这一点。
顺便说一句,您的要求也是同态加密的主题,它通常也使用确定性加密。不过,这通常被认为是专业科目。
一个丑陋的技巧是加密(包装)一次 AES 密钥,然后使用该 AES 密钥和静态 IV 来加密数据。这非常难看,因为您需要保留 AES 密钥来加密任何其他消息。使用公钥包装后,您需要私钥来检索对称 AES 密钥,而这只有在解密时才有可能。
您当然也可以使用散列函数,但请注意您可能会泄露有关明文的信息。毕竟,像之前的示例一样,暴力破解单个位的哈希将非常容易,因此它甚至比确定性加密更不安全。
如果您使用带有散列的对称密钥(例如使用 HMAC),那么您又回到了早期的 AES 密钥问题,所以这也没有多大帮助。
推荐阅读
- node.js - Vue|Nuxt - 将项目复制到生产服务器导致错误
- reactjs - 如何将边框底部放在reactjs中的react-chips?
- c# - 如何获得 Hyper-V VM 来宾操作系统
- ruby-on-rails - 如何访问哈希中的嵌套键
- julia - 使用 Julia 无法在 Atom 中打开调试器窗格
- arm - 带有 std::pair 的 API
在 ARM 上从 C++14 切换到 C++17 时中断? - json - 如何正确地将新密钥传递给 JSON 字典?
- matlab - 将面顶点网格导出到 STL
- javascript - 我想在我的代码中多次调用一个函数?
- javascript - 使用 Passport.js 和 Sequelize 引用多个模型