我是密码学新手,所以请容忍我!我想用Python做一些不对称的加密。我尝试使用不对称地穴库,但注意到每次加密字符串时都会得到不同的加密。我想知道是否有一种方法可以使加密保持静态(类似于您使用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;"\...基本上,我希望:
我希望使用静态加密,因为我希望使用这些加密来查询数据库。提前感谢您的帮助!
发布于 2020-08-12 08:35:38
一般来说,密码被期望产生随机输出。这是因为你可以重复信息,如果对手看到相同的密文,他们可以从中提取信息。
例如,如果您的消息只有一位、0或1,并且攻击者知道第一次加密的明文位(例如,1),那么所有明文都可以从给定的密文中直接看到。换句话说,该方案对已知的明文不安全。因此,这些方案并不是IND安全的.
使方案对已知明文安全的方法是随机化该方案。对于基于对称(分组)密码的方案,这是通过提供一个IV或nonce (一个唯一的数字)来实现的,当与密钥密码结合时,它将密码文本随机化。对于RSA,它是通过使用随机填充来实现的。在您的例子中,它使用OAEP填充。
但是,您正在指示此randomization.决定论是您所需的,而不是通常的。确实有一些决定性的计划可以做到这一点。当然有“原始RSA",这意味着仅仅是模幂。然而,这个计划是非常不安全的,所以这没有多大帮助。
另一种方法是使用确定性OAEP或DOAEP。然而,我所指向的一篇论文( OAEP计划的作者之一,Bellare)应该表明,您正在安全路径之外进行线程处理。一个更高级的密码库--比如你所指向的不对称密码库--不会提供它。但是,如果您已经拥有OAEP的来源(即相当难,但不像实现OAEP那样难),那么实现它应该相对容易。
当然,使用确定性加密不会使该方案对已知的明文无效;只有随机化才能做到这一点。
顺便提一下,您的需求也是关于同态加密的主题,它通常也使用确定性加密。不过,一般认为这是一门专门的学科。
一个丑陋的窍门是加密(包装)一个AES密钥一次,然后使用该AES密钥与静态IV加密数据。这是非常丑陋的,因为您需要保留AES密钥来加密任何其他消息。一旦用公钥包装,就需要私钥来检索对称的AES密钥,只有在解密时才有可能。
当然,您也可以使用散列函数,但请注意,您可能泄漏有关明文的信息。像前面的例子一样,强行强制单个位的散列毕竟是非常容易的,所以它比确定性加密更不安全。
如果您使用的是带有哈希的对称密钥(例如使用HMAC),那么您将返回到前面的AES密钥问题,所以这也没有多大帮助。
https://stackoverflow.com/questions/63371497
复制相似问题