Java中的非对称加密:如何避免同一短语的不同结果?

Java中的非对称加密:如何避免同一短语的不同结果?,java,encryption,encryption-asymmetric,Java,Encryption,Encryption Asymmetric,我知道非对称加密的一个特点是,如果用公钥加密文本,每次都会得到不同的结果 有没有一种方法可以始终获得相同的结果(没有RSA) 示例代码: PublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic( new RSAPublicKeySpec( new BigInteger("83087..."), new BigInteger("65537"))); PrivateKey priv

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

有没有一种方法可以始终获得相同的结果(没有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这很容易做到,例如在end@MaxSchmidt那是故意的尴尬。没过多久,我就意识到我说的是使用相同密钥加密的相同数据。您确实不希望在加密时避免不同的数据具有不同的输出。@Thor84no RSA encryption是随机的。对于给定的公钥和消息,每次尝试加密都会产生一个不同的字节序列。这是正常的,也是意料之中的;随机字节作为填充阶段的一部分被注入,不注入随机字节将导致加密系统薄弱。在解密过程中,填充字节被定位并删除,原始消息被无损地恢复。你是说不对称吗?这是关于对称性而不是时间。而且我也不知道加密(使用相同的密钥)将如何得到不同的结果。这将使解密变得不可能…@phq你是对的,抱歉@Thor84no这很容易做到,例如在end@MaxSchmidt那是故意的尴尬。没过多久,我就意识到我说的是使用相同密钥加密的相同数据。您确实不希望在加密时避免不同的数据具有不同的输出。@Thor84no RSA encryption是随机的。对于给定的公钥和消息,每次尝试加密都会产生一个不同的字节序列。这是正常的,也是意料之中的;随机字节作为填充阶段的一部分被注入,不注入随机字节将导致加密系统薄弱。在解密过程中,填充字节会被定位并删除,原始消息会被无损恢复。谢谢,但是有没有哪种算法即使不太安全也不使用初始化向量?XOR:)如果您试图避免安全性,那么使用强加密有什么意义?只是浪费资源。也许你需要完整性/作者身份检查?然后使用其他加密系统,例如签名或MAC。您能描述一下您正在解决的确切问题吗?我需要保存加密的用户密码。当然,我也可以创建密码的SHA散列,如果用户丢失了密码,他们必须创建一个新密码。但在我的特殊情况下,我需要解密它们。我想如果我使用一种非对称加密,并且应用程序只有公钥,那么它将是安全的。为了检查密码,我将其解密并与存储的密码进行比较。但是,如果每次加密都产生不同的结果,那么这就不起作用了。您必须使用SHA哈希进行身份验证。和非对称加密的存储密码。不要解密密码进行检查。此外,最好给用户一个选择是否存储密码的选项,因为这是不同级别的信息安全要求。谢谢,这是一个好主意,我现在正在存储散列和加密的密码。散列用于检查密码,并在需要时进行加密以恢复密码。谢谢,但是有没有一种算法即使不太安全也不使用初始化向量?XOR:)如果您试图避免安全性,那么使用强加密有什么意义?只是浪费资源。也许你需要完整性/作者身份检查?然后使用其他加密系统,例如签名或MAC。您能描述一下您正在解决的确切问题吗?我需要保存加密的用户密码。当然,我也可以创建密码的SHA散列,如果用户丢失了密码,他们必须创建一个新密码。但在我的特殊情况下,我需要解密它们。我想如果我使用一种非对称加密,并且应用程序只有公钥,那么它将是安全的。为了检查密码,我将其解密并与存储的密码进行比较。但是,如果每次加密都产生不同的结果,那么这就不起作用了。您必须使用SHA哈希进行身份验证。和非对称加密的存储密码。不要解密密码进行检查。此外,最好给用户一个选择是否存储密码的选项,因为这是不同级别的信息安全要求。谢谢,这是一个好主意,我现在正在存储散列和加密的密码。哈希值用于检查密码,如果需要,则使用加密值恢复密码。