使用RSA加密(模数/指数):RSA块的数据太多

时间:2015-01-21 15:17:03

标签: java encryption rsa

我有一个modulus key和一个exponent key,我创建一个RSA public key来加密data,但我得到了这个例外

java.lang.ArrayIndexOutOfBoundsException: too much data for RSA block

以下是详细信息:

模数值:

B390F7412F2554387597814A25BC11BFFD95DB2D1456F1B66CDF52BCC1D20C7FF24F3CCE7B2D66E143213F64247454782A377C79C74477A28AF6C317BE68BC6E8FF001D375F9363B5A7161C2DFBC2ED0850697A54421552C6288996AC61AF5A9F7DE218ABBC75A145F891266615EB81D11A22B7260F7608083B373BA4BC0756B
size: 256

指数值:

010001

要加密的数据:

1A0498EA0DF19B45043DA4688AE3A7B3D592D61CC0EBB82FB100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
size: 256

这是代码:

public static String encryptData(String data, BigInteger modulus, BigInteger exponent) throws Exception {
    RSAPublicKeySpec spec = new RSAPublicKeySpec(modulus, exponent);
    KeyFactory factory = KeyFactory.getInstance("RSA", "BC");
    PublicKey pub = factory.generatePublic(spec);
    Cipher rsa = Cipher.getInstance("RSA", "BC");
    rsa.init(Cipher.ENCRYPT_MODE, pub);

    byte[] cipherText = rsa.doFinal(data.getBytes()); // ERROR HERE
    return Hex.toString(cipherText);
}

这是生成的公钥

30819F300D06092A864886F70D010101050003818D0030818902818100B390F7412F2554387597814A25BC11BFFD95DB2D1456F1B66CDF52BCC1D20C7FF24F3CCE7B2D66E143213F64247454782A377C79C74477A28AF6C317BE68BC6E8FF001D375F9363B5A7161C2DFBC2ED0850697A54421552C6288996AC61AF5A9F7DE218ABBC75A145F891266615EB81D11A22B7260F7608083B373BA4BC0756B0203010001
size: 342

谢谢!

2 个答案:

答案 0 :(得分:1)

对大型文档使用公钥(非对称)加密的常用方法是创建随机的一次性密码短语。密码短语与基于密码的加密(对称)算法(例如,AES-256)一起使用。使用AES加密文档,然后使用公钥加密密码。

一般来说,对称加密算法往往比非对称加密算法快几个数量级。因此,RSA不仅不能直接加密大型文档,而且还需要更多的计算才能进行加密。

顺便说一句,我会提到加密很难做到。我强烈建议您以标准方式使用标准库,以确保安全实施。

答案 1 :(得分:0)

错误只是愚蠢:

byte[] cipherText = rsa.doFinal(data.getBytes()); // ERROR HERE

我加密data.getBytes(),但实际上我首先需要从其十六进制表示中解码data,然后才加密它。