当前位置: 首页 > 知识库问答 >
问题:

Java RSA加密不断生成无法解密的输出?

赵浩邈
2023-03-14

我正在尽我最大的努力创建一个程序,它将生成一个私有/公共RSA密钥集,并使用它发送消息,从端到端是安全的。我正在使用RSA私钥/公钥对来安全地传输AES密钥,该密钥将用于发送消息。

当我使用1024位密钥对时,加密的会话密钥是128字节。但在试图用RSA私钥解密时,它抱怨说只能解密117字节或更少的字节。

当我使用2048位的密钥对时,加密的会话密钥是256字节(但必须是245或更少),等等。

结果总是一样的:我不能来回传递一个有效的密码短语。:(

    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
    keyPairGenerator.initialize(1024);
    KeyPair keyPair = keyPairGenerator.generateKeyPair();

    KeyGenerator keyGen = KeyGenerator.getInstance("AES");
    SecretKey sessionKey = keyGen.generateKey();

    // Encrypt the session key with the RSA public key
    Cipher rsaCipher = Cipher.getInstance("RSA");
    rsaCipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());
    byte[] encryptedSessionKey = rsaCipher.doFinal(sessionKey.getEncoded());

    // Simulating other end user: Receive encrypted session key,
    // decrypt it using your private key.
    Cipher rsaDecryptCipher = Cipher.getInstance("RSA");
    rsaDecryptCipher.init(Cipher.DECRYPT_MODE, keyPair.getPrivate());
    byte[] decryptedSessionKeyBytes = rsaCipher.doFinal(encryptedSessionKey);
    System.out.println("Decrypted session key bytes");
    System.out.println(decryptedSessionKeyBytes);

编辑:它看起来像是生成的密钥在某个时候或另一个被填充,但我不知道如何停止或颠覆它。我在加密方面很笨...到目前为止,我一直依赖于openssl_seal。

共有1个答案

祁鸿晖
2023-03-14

您正在使用rsadecryptcipher它进行除实际解密之外的所有操作。

最好总是指定操作模式和填充模式,例如,为密码实例指定“RSA/ECB/OAEPWITHSHA1ANDMGF1PADDING”

 类似资料:
  • 我在C#程序(我在下面提到)中使用了RSA非对称密钥加密算法,我必须通过java程序加密数据。我希望我的java程序生成与C#程序相同的加密密钥。 公钥: C#加密程序: Java加密方案: 我尝试了上述java程序,但结果如下: O+gw 7+X hY x A 9 ltD V 5 zE RsF 4 Dy Xg MTc/gx 82 wR tT 1 x fR 3 su Y 0 XB JLa dp 7

  • 在Java代码中,我应该解密一个加密的单词,如下所示: 我是加密新手,但是我发现了一些如何用Java加密/解密一些AES/CBC的示例。但是它需要盐、密钥和Iv。我发现OpenSsl正在从“密码”中导出这些值,但我没有发现如何Java解密加密值。 有人知道它是怎么工作的吗?盐、钥匙和/或Iv是否存储在加密值中?谢谢你的回答。

  • 使用Python-GnuPG我想 null 不幸的是,加密返回错误: 但它仍然生成加密ASCII铠甲消息,如果解密结果为对象,则bool值为属性,并包含以下属性: 不确定错误发生的确切位置以及如何处理

  • 6)当我尝试解密消息时,我得到两个“gpg:[不知道]:无效数据包”消息,解密失败:

  • 我在网络上看到了大量使用System.Security.Cryptography.RSacryptoServiceProvider的C#加密/解密教程和示例,但我希望能够做到的是: null 谁能给我指出一个有用的资源吗?

  • 我不明白为什么它说“输出无效的ASCII文本”! 为了让你理解问题的背景,我发布了描述要做的事情。从这里开始! 在替换密码中,我们通过用另一个字母替换每个字母来“加密”(即以可逆的方式隐藏)消息。为此,我们使用一个密钥:在本例中,是字母表中每个字母到加密时对应的字母的映射。为了“解密”消息,消息的接收者需要知道密钥,这样他们就可以逆转这个过程:将加密文本(通常称为密文)转换回原始消息(通常称为明文