如何使用RSA公钥加密java.util.Properties对象(可以是任何大小)?

ScA*_*er2 2 java security encryption rsa

这是我目前正在使用的代码.它使用BouncyCastle Provider.

static
{
   Security.addProvider(new BouncyCastleProvider());
}

protected String encrypt(byte[] keyData, byte[] data) throws Exception {
   X509EncodedKeySpec keyspec = new X509EncodedKeySpec(keyData);
   KeyFactory kf = KeyFactory.getInstance("RSA", "BC");
   PublicKey pk = kf.generatePublic(keyspec);
   Cipher rsa =  Cipher.getInstance("RSA/None/OAEPWithSHA1AndMGF1Padding", "BC");
   rsa.init(Cipher.ENCRYPT_MODE, pk);
   byte[] output = rsa.doFinal(data);
   String result = base64EncodeBytes(output);
   return result;
}
Run Code Online (Sandbox Code Playgroud)

我现在正在接受

 java.lang.ArrayIndexOutOfBoundsException: too much data for RSA block
    at org.bouncycastle.jce.provider.JCERSACipher.engineDoFinal(Unknown Source)
    at javax.crypto.Cipher.doFinal(DashoA13*..)
    at Encryption.encrypt(RSAToken.java:60)
Run Code Online (Sandbox Code Playgroud)

eri*_*son 7

使用RSA加密大量数据并不是一个好习惯.

加密协议采用的方法是生成对称密钥,使用它来加密数据,然后使用RSA加密该对称密钥.

这是PGP和S/MIME的工作原理.它还允许多个读者通过加密每个预期收件人的对称密钥来轻松地解密数据,而不是加密每个读者的整个数据.

  • 速度,兼容性和复杂性都是不这样做的好理由.我不知道当前实践中密码分析方法有任何漏洞,但是这种方法需要更多的代码才能由对密码学没有深刻理解的人编写,所以它肯定不太安全.最好使用BouncyCastle的S/MIME或PGP库; 使用广泛审查的协议和实现比发明自己的协议和实现更安全. (2认同)