【问题标题】:Cipher decryption / encryption changing results密码解密/加密更改结果
【发布时间】:2019-04-07 05:41:54
【问题描述】:

我正在对一些解密数据的代码进行逆向工程,希望能够将其加密回来并获得与 reasons that would make this question too long and off-topic 开始时相同的数据。

public void Test() throws Exception {

    String pk_enc = //...

    String hashStr_64 = //...

    byte[] hashStr_encrypted = Base64.decode(hashStr_64);

    X509EncodedKeySpec e = new X509EncodedKeySpec(Base64.decode(pk_enc));
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    RSAPublicKey RSApublicKey = (RSAPublicKey) keyFactory.generatePublic(e);
    Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING");
    cipher.init(2, RSApublicKey); // '2' means decrypt
    byte[] hashStr_decrypted = cipher.doFinal(hashStr_encrypted);
    String hashStr_result = new String(hashStr_decrypted);

    // Now in reverse...
    Cipher cipher1 = Cipher.getInstance("RSA/ECB/PKCS1PADDING");
    // instantiating a new cipher or using the original one makes no difference
    cipher1.init(1, RSApublicKey); // '1' means encrypt
    byte[] hashStr_encrypted_reverse = cipher1.doFinal(hashStr_decrypted);
    String hashStr_64_reverse = Base64.encode(hashStr_encrypted_reverse);
}

// Now in reverse...之前的所有代码都不能更改,但这并不意味着不能将hashStr_result转换回hashStr_64,对吧?

但是,我之后编写的代码应该可以做到这一点,但它不起作用。 hashStr_encrypted_reversehashStr_encrypted 不同。为什么会这样,我该如何解决?

另一个表明加密出了问题的迹象是,如果我再次尝试解密会发生什么...

// Decrypt again
Cipher cipher2 = Cipher.getInstance("RSA/ECB/PKCS1PADDING");
cipher2.init(2, RSApublicKey);
byte[] hashStr_decrypted_again = cipher.doFinal(hashStr_encrypted_reverse);

这会抛出:

javax.crypto.BadPaddingException

我真的不在乎,但也许它可以帮助回答这个问题。

【问题讨论】:

  • 这不是 RSA 的工作方式。一项操作使用公钥,另一项操作使用私钥。您不能使用公钥进行这两项操作。
  • 这是我想过的,但您会看到我们有一个 public 密钥,实际上是 解密 数据。我有限的理解是,使用 RSA 公钥只能加密,不能解密。所以我认为这与我所知道的 RSA 不同(或者肯定可以将其加密回来)。感谢您的提示:我会朝这个方向进行更多研究!

标签: java encryption rsa badpaddingexception


【解决方案1】:

术语会令人困惑。有 4 种 RSA 操作,最好描述为:签名、验证、加密、解密。将这些映射到较低级别并仅使用加密和解密语言,这些映射如下:

签名验证对

  • 签名 -> 用私钥加密
  • 验证 -> 使用公钥解密

加密-解密对

  • 加密 -> 用公钥加密
  • 解密 -> 用私钥解密。

如您所见,每对操作的一侧都有私钥,另一侧有公钥。

【讨论】:

    【解决方案2】:

    正如@JamesKPolk 在他的评论中所说,这不是 RSA 的工作方式。 RSA 是一种非对称加密算法:有两个密钥,公钥和私钥。对称算法(例如 AES)有一个密钥,用于加密和解密,并且该密钥必须保持安全,发送方和接收方除外。

    为什么选择非对称加密?

    • 您可以使用公钥(通常是他们与您共享的其他人的密钥)进行加密,并且他们必须使用他们的私钥对其进行解密。任何人都可以拥有公钥(这就是为什么它是public),但它不能用于读取加密的消息。这就是您遇到问题的地方。
    • 此外,您可以使用私钥(通常是您自己的)加密消息,其他任何人都可以使用您的公钥对其进行解密。这就是数字签名的实现方式:例如,您将加密文档的摘要,如果拥有您的公钥,任何人都可以验证您的签名,但没有其他人可以签名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-09
      • 2012-10-03
      • 2020-11-10
      • 1970-01-01
      • 2013-08-15
      • 2021-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多