0

我已经使用 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);
    }

公钥基础结构

4

1 回答 1

1

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

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

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


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

  • 使用发件人的私钥对 AES 密钥进行签名,但将结果分开

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

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

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

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

于 2012-11-22T11:15:30.623 回答