RSA-шифрование на Java - PullRequest
5 голосов
/ 19 мая 2011

Я пытаюсь написать алгоритм шифрования с использованием RSA в Java, я получаю "javax.crypto.BadPaddingException: данные должны начинаться с нуля"; Я не знаю, для чего это исключение. Это пример, который я использовал здесь

и вот мой код; пожалуйста, помогите.

public byte[] getEncryptedValue(byte[] bytes, PublicKey key) {
    try {
        cipher.init(Cipher.ENCRYPT_MODE, key);
        return blockCipher(bytes, Cipher.ENCRYPT_MODE);
    } catch (Exception ex) {
        Logger.getLogger(SecurityUtil.class.getName()).log(Level.SEVERE, null, ex);
    }
    return null;
}

public byte[] getDecryptedValue(byte[] bytes, PrivateKey key) {
    try {
        cipher.init(Cipher.DECRYPT_MODE, key);
        return blockCipher(bytes, Cipher.DECRYPT_MODE);
    } catch (Exception ex) {
        Logger.getLogger(SecurityUtil.class.getName()).log(Level.SEVERE, null, ex);
    }
    return null;
}

private byte[] append(byte[] prefix, byte[] suffix) {
    byte[] toReturn = new byte[prefix.length + suffix.length];
    System.arraycopy(prefix, 0, toReturn, 0, prefix.length);
    System.arraycopy(suffix, 0, toReturn, prefix.length, suffix.length);
    return toReturn;
}

private byte[] blockCipher(byte[] bytes, int mode) throws IllegalBlockSizeException, BadPaddingException {
    byte[] scrambled = new byte[0];
    byte[] toReturn = new byte[0];blocks (because of RSA)
    int length = (mode == Cipher.ENCRYPT_MODE) ? 100 : 128;
    int n = 0;
    byte[] buffer = new byte[length];

    for (int i = 0; i < bytes.length; i++) {
        if ((i > 0) && (i % length == 0)) {
            n = 0;
            scrambled = cipher.doFinal(buffer);
            toReturn = append(toReturn, scrambled);
        }
        buffer[i % length] = bytes[i];
        n++;
    }
    ***scrambled = cipher.doFinal(buffer, 0, n);*** <-- the exception is caught here
    toReturn = append(toReturn, scrambled);
    return toReturn;
}

Ответы [ 2 ]

2 голосов
/ 23 мая 2011

Проблема может быть в том, что данные, передаваемые по сети с использованием сокетов, могут быть повреждены из-за некоторых проблем с кодированием.У меня была такая же проблема при разработке простой клиент-серверной программы чата, которая шифрует / дешифрует с помощью асимметричного ключа сообщения между сервером и клиентом, и наоборот, вместо того, чтобы отправлять сообщение в виде строки, я отправлял его как байтовый массивзашифрованное сообщение.

0 голосов
/ 10 июля 2011
  • проверить, совпадают ли ключи
  • проверить, совпадают ли данные, возвращаемые getEncryptedValue, которые вы передаете getDecryptedValue
  • проверить степень цикла в методе blockCipher
...