【问题标题】:Asymmetric Encryption in Java: How to avoid different results of the same phrase?Java中的非对称加密:如何避免同一短语的不同结果?
【发布时间】:2012-01-17 20:38:01
【问题描述】:

我知道非对称加密的一个特点是,如果你用公钥加密文本,每次都会得到不同的结果。

有没有办法总是得到相同的结果(没有 RSA)?

示例代码:

PublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic(
    new RSAPublicKeySpec(
        new BigInteger("83087..."),
        new BigInteger("65537")));

PrivateKey privateKey = KeyFactory.getInstance("RSA").generatePrivate(
    new RSAPrivateKeySpec(
        new BigInteger("830874..."),
        new BigInteger("514268...")));


Cipher cipher = Cipher.getInstance( "RSA" ); 
cipher.init( Cipher.ENCRYPT_MODE, publicKey );        
cipher.doFinal( "test");

【问题讨论】:

  • 你的意思是不对称的吗?这是关于对称性而不是时​​间。
  • 另外,我看不出加密(使用相同的密钥)会给你带来不同的结果。那将无法解密...
  • @phq 你是对的,对不起@Thor84no 这很容易实现,例如在末尾添加一个随机数
  • @MaxSchmidt 这只是故意尴尬。很快就意识到我说的是使用 same 密钥加密的 same 数据。你真的不想想要避免不同的数据在加密时有不同的输出。
  • @Thor84no RSA 加密是随机的。对于给定的公钥和给定的消息,每次加密尝试都会产生不同的字节序列。这是正常的,也是意料之中的;随机字节是作为填充阶段的一部分注入的,不注入随机字节会导致加密系统较弱。在解密过程中,填充字节被定位并移除,原始消息被完好无损地恢复。

标签: java encryption encryption-asymmetric


【解决方案1】:

良好的加密必须提供不同的结果,因为它可以更安全地隐藏信息。它隐藏了一个事实,即两个单独的密文纯文本是相等的。它被称为语义安全

http://en.wikipedia.org/wiki/Initialization_vector实现。

是的,当然,加密是非对称的。

【讨论】:

  • 谢谢,但是有没有一种算法即使不那么安全也不使用初始化向量?
  • 异或? :) 如果您试图避免安全性,那么使用强密码学有什么意义?只是浪费资源。也许您需要完整性/作者身份检查?然后使用其他密码系统,例如签名或 MAC。你能描述一下你正在解决的具体问题吗?
  • 我需要保存加密的用户密码。当然,我也可以创建密码的 SHA-Hash,如果用户丢失了密码,他们必须创建一个新密码。但在我的特殊情况下,我需要解密它们。我想如果我使用非对称加密并且应用程序只有公钥,那将是安全的。为了检查密码,我将其解密并将其与存储的密码进行比较。但是,如果每次加密都产生不同的结果,这就行不通了。
  • 您必须使用 SHA-hash 进行身份验证。以及用于存储的非对称加密密码。不要解密密码来检查。此外,最好让用户选择是否存储密码,因为这是不同级别的信息安全要求。
  • 谢谢,这是个好主意,我现在正在存储散列和加密密码。散列用于检查密码,加密用于在需要时恢复密码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-19
相关资源
最近更新 更多