【问题标题】:Static Asymmetric Encryption静态非对称加密
【发布时间】:2020-12-01 21:44:03
【问题描述】:

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

基本上,我希望:

  • 使用公钥加密数据并保持加密不变,只要公钥相同。

  • 能够使用私钥解密数据。

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

【问题讨论】:

    标签: python encryption cryptography public-key-encryption encryption-asymmetric


    【解决方案1】:

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

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

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


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

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

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

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


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


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

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

    【讨论】:

      猜你喜欢
      • 2011-04-05
      • 2019-07-29
      • 1970-01-01
      • 2010-10-30
      • 2017-02-22
      • 2011-03-01
      • 1970-01-01
      • 2013-04-22
      • 2021-05-30
      相关资源
      最近更新 更多