猿问

OutputLengthException in Rijndael impletation

我在使用BouncyCastle API for Java的Rijndael加密实现时遇到问题。


当我执行时,我得到了:OutputLengthExceptioncipher.doFinal(inputTextBytes, intOutOff);


org.bouncycastle.crypto.OutputLengthException: output buffer too short


我不完全了解如何生成该整数来执行该方法。doFinal()


这是我尝试过的:


public class RijndaelAndRFC2899Implementation {


    final static String WORD = "763059";

    final static String PASSWORD = "515t3ma5m15B4d35";

    final static byte[] SALT = new byte[]{1, 2, 3, 4, 5, 6, 7, 8};

    final static int KEY_SIZE = 256;

    final static int BLOCK_SIZE = 128;

    final static int ITERATIONS = 1000;


    public static void main(String[] args) throws Exception {

        BufferedBlockCipher cipher = getCipher(PASSWORD, true);

        byte[] inputText = WORD.getBytes("UTF-8");

        byte asd[] = new byte[cipher.getOutputSize(inputText.length)];

        int l = cipher.processBytes(inputText, 0, inputText.length, asd, 0);

        int n = cipher.doFinal(inputText, l); //<---HERE PRODUCES OutputLengthException

    }


    private static BufferedBlockCipher getCipher(String password, boolean encrypt) throws Exception {

        MessageDigest md = MessageDigest.getInstance("SHA-256");

        md.update(password.getBytes("UTF-8"));

        byte[] newPassword = md.digest();


        PKCS5S2ParametersGenerator generator = new PKCS5S2ParametersGenerator();

        generator.init(newPassword, SALT, ITERATIONS);


        ParametersWithIV iv = ((ParametersWithIV) generator.generateDerivedParameters(KEY_SIZE, BLOCK_SIZE));


        RijndaelEngine engine = new RijndaelEngine();

        BufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(engine));   

        cipher.init(encrypt, iv);


        return cipher;

    }


}

你能帮助我了解我做错了什么吗?


达令说
浏览 100回答 1
1回答

慕容708150

调用 应将输出数组作为第一个参数 - 而不是您正在处理的输入:doFinal()public static void main(String[] args) throws Exception {&nbsp; &nbsp; BufferedBlockCipher cipher = getCipher(PASSWORD, true);&nbsp; &nbsp; byte[] inputText = WORD.getBytes("UTF-8");&nbsp; &nbsp; byte asd[] = new byte[cipher.getOutputSize(inputText.length)];&nbsp; &nbsp; int l = cipher.processBytes(inputText, 0, inputText.length, asd, 0);&nbsp; &nbsp; int n = cipher.doFinal(asd, l); // <--- Change to asd}(我还没有验证实现的其余部分!
随时随地看视频慕课网APP

相关分类

Java
我要回答