RSA加密的chiper文本以字符串和解密方式抛出javax.crypto.IllegalBlockSizeException:数据不得超过117个字节

时间:2014-03-06 21:24:49

标签: java

private static String decrypt(String cipherString, PrivateKey key) {
    byte[] dectyptedText = null;
    byte[] stringText = null;
    try {
        // get an RSA cipher object and print the provider
        final Cipher cipher = Cipher.getInstance(ALGORITHM);
        //chiper init in encrypt mode
        cipher.init(Cipher.ENCRYPT_MODE, key);
        //tried to get bytes out of encrypted string
        stringText = cipher.doFinal(cipherString.getBytes());
        // decrypt the text using the private key
        cipher.init(Cipher.DECRYPT_MODE, key);

        dectyptedText = cipher.doFinal(stringText);

    } catch (Exception ex) {
        ex.printStackTrace();
    }

    return new String(dectyptedText);
}

我想将密码文本转换为加密器生成的字节到字符串并存储在数据库中。然后获取字符串并在需要时解密它。有没有人可以帮我解决我遇到的问题?

2 个答案:

答案 0 :(得分:0)

将byte-Array转换为String是没有意义的。 您必须直接保存字节(这需要数据库中的相应列,例如BLOB),或者您可以编码字节数组,例如using Base64(我建议使用后者)。

(如果您的问题与“public-crypto thingy”有关,您可能希望使用公钥加密,但要使用私钥进行解密。如果您不知道这意味着什么,请查看一些有关公共关系的文献 - 请加密密码。)

答案 1 :(得分:0)

由于问题似乎与您的密钥有关,因此您可能需要公钥和私钥,而不仅仅是私钥。

看看这个简单的RSA演示:

encryptionAlgorithm = "RSA/ECB/PKCS1Padding";
algorithm = "RSA";

try {
    SecureRandom random = SecRandom.getDefault();

    // Since you are working with asymmetric crypto, you need a keypair:

    KeyPairGenerator kpg = KeyPairGenerator.getInstance(algorithm);
    kpg.initialize(2048, random);
    KeyPair kp = kpg.generateKeyPair();

    // encrypting something with asymmetric crypto needs a public key:

    Cipher cipher1 = Cipher.getInstance(encryptionAlgorithm);
    cipher1.init(Cipher.ENCRYPT_MODE, kp.getPublic());

    byte[] text = "This is a test".getBytes("ASCII");

    System.out.println("text = " +(new String(text)));

    byte[] ciphertext = cipher1.doFinal(text);

    // here you could store & load your sipertext

    System.out.println("ciphertext = " + ciphertext);

    // decrypting something with asymmetric crypto needs a private key:

    Cipher cipher2 = Cipher.getInstance(encryptionAlgorithm);
    cipher2.init(Cipher.DECRYPT_MODE, kp.getPrivate());

    byte[] cleartext = cipher2.doFinal(ciphertext);

    System.out.println("cleartext = " +(new String(cleartext)));

} catch (Exception e) {
    e.printStackTrace();
}