Ошибка дешифрования J2ME AES (org.bouncycastle.crypto.InvalidCipherTextException: блок панели поврежден) - PullRequest
5 голосов
/ 01 декабря 2010

Я делаю шифрование и дешифрование с использованием алгоритма AES с надувным замком

Мое шифрование и дешифрование работает нормально, но выдает ошибку, когда мой обычный текст больше

даже иногда он дает не дешифрованные данные

public static boolean setEncryptionKey(String keyText)
{
    byte[] keyBytes = keyText.getBytes();

    key = new KeyParameter(keyBytes);
    engine = new AESFastEngine();
    cipher = new PaddedBufferedBlockCipher(engine);

    return true;
}

Шифрование:

public static String encryptString(String plainText)
{

        byte[] plainArray = plainText.getBytes();

        cipher.init(true, key);
        byte[] cipherBytes = new byte[cipher.getOutputSize(plainArray.length)];
        int cipherLength = cipher.processBytes(plainArray, 0, plainArray.length, cipherBytes, 0);
        cipher.doFinal(cipherBytes, cipherLength);
        String cipherString = new String(cipherBytes);
        return cipherString;
    }

дешифрование:

public static String decryptString(String encryptedText)
{

        byte[] cipherBytes = encryptedText.getBytes();
        cipher.init(false, key);
        byte[] decryptedBytes = new byte[cipher.getOutputSize(cipherBytes.length)];
        int decryptedLength = cipher.processBytes(cipherBytes, 0, cipherBytes.length, decryptedBytes, 0);
        cipher.doFinal(decryptedBytes, decryptedLength);
        String decryptedString = new String(decryptedBytes);

        int index = decryptedString.indexOf("\u0000");
        if (index >= 0)
        {
            decryptedString = decryptedString.substring(0, index);
        }
        return decryptedString;
    }

Эта расшифровка дает мне следующую ошибку

org.bouncycastle.crypto.InvalidCipherTextException: pad block corrupted
        at org.bouncycastle.crypto.paddings.PKCS7Padding.padCount(+30)
        at org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher.doFinal(+190)
        at com.NewCrypto.decryptString(NewCrypto.java:103)
        at com.New_Midlet.startApp(New_Midlet.java:23)
        at javax.microedition.midlet.MIDletProxy.startApp(MIDletProxy.java:44)
        at com.sun.midp.midlet.Scheduler.schedule(Scheduler.java:375)
        at com.sun.midp.main.Main.runLocalClass(Main.java:477)
        at com.sun.midp.main.Main.main(+80)

в чем может быть проблема?

1 Ответ

2 голосов
/ 05 декабря 2010

Линия

String cipherString = new String(cipherBytes);

это ошибка. cipherBytes является байтовым массивом с произвольными значениями и не может быть преобразован в строку с помощью любого из строковых декодеров Java. Вы должны просто отправить / сохранить шифр как байтовый массив. Если вы должны сделать это строкой, то вам придется использовать кодировщик. Часто используются кодеры Base64, как и Base16 (шестнадцатеричный). Вы можете использовать кодек Apache Commons или мой любимый кодек Hardder Base64 .

...