首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >静态非对称加密

静态非对称加密
EN

Stack Overflow用户
提问于 2020-08-12 07:04:43
回答 1查看 172关注 0票数 1

我是密码学新手,所以请容忍我!我想用Python做一些不对称的加密。我尝试使用不对称地穴库,但注意到每次加密字符串时都会得到不同的加密。我想知道是否有一种方法可以使加密保持静态(类似于您使用sha512、md5等散列时)。

将其放入代码中,基本上是在我运行以下代码时:

代码语言:javascript
复制
print(encryptData('hello world'))
print(encryptData('hello world'))

我得到以下输出:

代码语言:javascript
复制
b'\xcf\x93"\x97(\x91\xbd;"\...
b'2\x86L\x0c3\x92W\xec\xaa/...

不过,理想情况下,我想要的是:

代码语言:javascript
复制
b'\xcf\x93"\x97(\x91\xbd;"\...
b'\xcf\x93"\x97(\x91\xbd;"\...

基本上,我希望:

  • 使用公钥加密数据,并在公钥相同的情况下保持该加密不变。
  • 能够用私钥解密数据。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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密钥问题,所以这也没有多大帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63371497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档