Шифрование / дешифрование - от iphone до java - BadPaddingException: данный последний блок заполнен неправильно - PullRequest
1 голос
/ 09 августа 2011

Моя цель - зашифровать данные в Iphone и расшифровать их на Java-сервере.

Я использую симметричное шифрование.

Я сгенерировал ключ, используя KeyGenerator на стороне Java.

код для генерации ключа выглядит следующим образом:

// Java-код для генерации ключа

File keyFile = new File("F:/key","mykey.key");
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);
SecretKey skey = kgen.generateKey();
byte[] enc= skey.getEncoded();
FileUtils.writeStringToFile(keyFile ,Base64.encodeBase64String(enc),"UTF-8");   

Ниже приведен код Java для расшифровки:

//получить ключ из файла

File file = new File("F:/key", "mykey.key");
    SecretKeySpec keySpec= null;
try {
    byte[] keyBytes = Base64.decodeBase64(FileUtils.readFileToString(file,"UTF-8"));
     keySpec= new SecretKeySpec(keyBytes, 0, 16, "AES");
     byte[] raw = keySpec.getEncoded();

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

// Расшифровать строку encryptedString (из Iphone)

byte[] tempByte = Base64.decodeBase64(encryptedString);

Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, keySpec);
byte[] cipherData = cipher.doFinal(tempByte);

String ttt = new String(cipherData ,"UTF-8");
System.out.println(ttt);

И код iphone аналогичен коду, указанному в следующей ссылке: Шифрование данныхс Objective-C и расшифровывать его с помощью Java. Проблема

Я получаю следующее исключение при расшифровке в Java.*

Пожалуйста, помогите ...

1 Ответ

2 голосов
/ 09 августа 2011

Хорошо, отступы и режим должны совпадать. Если вы скопировали код Objective-C, то зашифрованный текст на стороне Objective-C имеет режим ECB и заполнение PKCS7.

По умолчанию Java-шифр AES имеет режим CBC и заполнение PKCS5 (хотя я не уверен, и AFAIK PKCS5 и PKCS7 несколько совместимы). Я думаю, вы должны указать это явно. Эти настройки должны совпадать, иначе что-то пойдет не так. Таким образом, вы должны создать такой шифр:

Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");

Btw. если вы можете выбрать режим шифрования, вы должны использовать CBC (но затем с обеих сторон).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...