【问题标题】:Encrypt the encrypted message by using RSA in java [closed]在java中使用RSA加密加密消息[关闭]
【发布时间】:2012-11-10 18:23:03
【问题描述】:

我已经使用 AES 加密了一个字符串。我已经为 AES 提供了这样做的密钥。现在,我正在尝试用 RSA 加密给定的密钥(直到这里一切顺利),现在我需要再次用 RSA 加密这个加密的密钥。我收到一个错误“数据不得超过 117 个字节”。

public String encrypt(String DATA,String key_string) throws Exception {
    String separator = "//msit//";
    byte[] data = key_string.getBytes();
    MessageDigest sha = MessageDigest.getInstance("SHA-1");
    data = sha.digest(data);
    data = Arrays.copyOf(data, 16); // use only first 128 bit
    SecretKey key = new SecretKeySpec(data, "AES");
    String final_matter = DATA + separator;
    System.out.println(final_matter);
    ecipher = Cipher.getInstance("AES");
    ecipher.init(Cipher.ENCRYPT_MODE, key);
    byte[] utf8 = final_matter.getBytes("UTF8");
    byte[] enc = ecipher.doFinal(utf8);
    return new sun.misc.BASE64Encoder().encode(enc);
    }

【问题讨论】:

  • 您是否试图要求多人在场才能解密密钥?
  • 不,我实际上是在实现 PKI,在此我需要使用发送方的私钥加密密钥(用于加密数据的 AES 密钥),然后使用接收方的公钥加密。这里的问题是使用公钥加密会出现错误“数据不得超过 117 字节”
  • "用发件人的私钥加密密钥" 你为什么要这样做?私钥用于解密和签名,从不用于加密。见crypto.stackexchange.com/questions/4041/…
  • 那你就读废话了。您永远不会使用 RSA 私钥进行加密。您使用接收者公钥加密会话密钥。并且可以选择使用自己的私钥对消息进行签名。
  • @MaheshVemuri:在我看来,这个主题太大而无法在一个答案中涵盖,并且可能不是 stackoverflow 的主题。也许在crypto stackexchange,但不是在这里。

标签: java encryption rsa pki


【解决方案1】:

RSA 密钥可以加密的最大数据量等于其模数长度。所以一个 1024 位的 RSA 密钥只能加密 128 个字节。您可能正在使用 PKCS #1 填充,这进一步将可能的大小减少到 117 字节。

您的 AES 密钥应该比最大值小得多。最大可能的 AES 密钥大小为 256 位,即 32 字节。

请检查您的代码并确保您只尝试加密密钥数据而不是其他任何内容。


根据您上面的评论,您似乎加密了太多数据。请尝试以下操作:

  • 使用发件人的私钥签署 AES 密钥,但保留结果单独

  • 用收件人的公钥加密 AES 密钥。

  • 将这两部分都发送给收件人。

使用私钥签名的结果是一条大小等于密钥模数的数据。因此,您不能使用相同长度的公钥对其进行加密。您的方案已损坏,应按照我上面的建议进行更改。

我强烈建议您寻找现有的 PKI 系统来代替任何自制的系统。也许EJBCA

【讨论】:

  • 有趣的是,您撤回了 cmets 并回答接受。您是否遇到了其他问题?
  • 是的,我尝试了长度为 16 字节的 AES 密钥。即使那样它也不起作用
  • @MaheshVemuri:显然您的代码并没有按照您声称的那样做。如果您发布它,也许我们可以找到错误,如果您不发布,那么您能期待什么?
  • 附带说明:不应使用 PKCS#1v1.5 填充进行加密。它非常破碎。请改用 OAEP。
  • @DuncanJones 甚至取决于,例如如果您提供相同的数据,RSA PKCS1.5 会一遍又一遍地创建相同的签名。因此,如果您两次签署“是”,您可以轻松地将其与“是”和“否”的签名区分开来。如果您不加密签名,并且您确实希望获得数据的机密性,这可能是一个问题。
猜你喜欢
  • 2011-02-08
  • 2017-02-16
  • 2011-03-01
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多