【问题标题】:How to decrypt a data using rsa privatekey如何使用 rsa 私钥解密数据
【发布时间】:2023-09-04 23:35:01
【问题描述】:

我正在使用 JAVA 我的朋友使用 SYMBIAN

我和我的朋友有相同的 rsa 模数。如果我使用公钥加密数据,那么我的朋友可以解密相同的数据。但是如果我的朋友用公钥加密数据,那么我就无法解密数据。我收到一个错误,因为“数据必须从零开始”

public static byte[] encrypt(byte[] encrptdByte) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
    byte[] encryptionByte = null;
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.ENCRYPT_MODE, publicKey);
    encryptionByte = cipher.doFinal(encrptdByte);
    return encryptionByte;
}

public static void decrypt(byte[] encrptdByte) throws NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException {
    byte[] encryptionByte = null;
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.DECRYPT_MODE, publicKey);
    encryptionByte = cipher.doFinal(encrptdByte);

    System.out.println("Recovered String     :::  " + new String(encryptionByte));
}

谢谢 苏尼尔

【问题讨论】:

  • 你能发布一些你正在使用的Java代码,或者哪些库?
  • 我使用的是 RSA,没有填充没有密码模式。
  • 我发了请看一下。

标签: java encryption rsa


【解决方案1】:

decrypt 函数使用publicKey - 它来自哪里?请注意,使用公钥加密的数据必须使用相应的私钥解密,而不是使用相同的公钥。 RSA 等非对称加密具有密钥对的概念,其中每个密钥都可以解密使用另一个密钥加密的数据,而对称加密(例如 AES)则使用相同的密钥进行加密和解密。

【讨论】:

  • 是的,Symbian 使用我发送给他们的模数创建了公钥。还是出现了这个问题。谢谢
  • RSA 密钥不仅是模数 N,还有一个用于加密的指数 E 和一个用于解密的指数 D。所以公钥本质上是(E,N),私钥是(D,N)。
  • 不,我们可以使用模数创建 RSA 公钥。
【解决方案2】:

补充上一篇文章,使用非对称加密大规模加密/解密数据是不切实际的(因为它比对称加密慢得多)。非对称加密(如 RSA)最实际的用途是加密用于加密数据的对称密钥(用于 AES 或类似算法),并签署消息摘要的安全散列(SHA-256 等)。

加密的消息通常密封在一个“信封”中,其中包含加密的消息以及用于加密的密钥。密钥当然是用接收者的公钥加密的,从而确保只有私钥的持有者才能取回密钥。

最后,消息的发送者可以选择计算消息的安全散列并使用发送者的私钥对其进行加密。接收方解密加密的哈希(使用发送方的公钥)并与计算出的哈希进行比较以验证发送方的身份。

【讨论】:

  • 可以使用 RSA 加密的最大数据 = 117 字节,但我的数据只有 14 字节。
  • Sunil,我对 Java Crypto API 不是很熟悉,但是解密需要访问私钥。我假设 cipher.Init() 有某种方法可以根据传入的 publicKey 访问私钥?由于您的朋友能够解密使用您的公钥加密的数据,您是否将私钥传递给了他?