Вы пытаетесь расшифровать с помощью случайно сгенерированного ключа (добавление начального числа к SecureRandom
только дополняет случайное состояние).Это обязательно даст сбой.
Если "MARTIN_123_MARTIN_123".getBytes()
является вашим ключом (или, точнее, его первыми 16 байтами), вы просто должны передать его непосредственно в ваш метод дешифрования:
byte[] decryptedData = decrypt(keyStart,b);
Хорошо, из вашего комментария видно, что вы шифруете с помощью PHP: mcrypt с использованием AES-256 / ECB / ZeroBytePadding (нулевое байтовое заполнение неявно подразумевается с mcrypt).
Прежде всего: ECB не является безопасным режимом - , особенно для изображений (хотя JPG, вероятно, не так плохи, как BMP).Если вы решите перейти на CBC, помните, что вам нужно передать IV, fx, добавив его к зашифрованным данным.Но если вы хотите расшифровать CBC, вам нужно указать это в Cipher.getInstance()
-колл (вы в настоящее время используете AES/CBC/PKCS5Padding
).
Заполнение нулями не может быть удалено, если вы не знаете длинуданные.Поэтому перед шифрованием данных вы должны либо передать длину, либо добавить заполнение PKCS # 7.
Наконец: вы шифруете, используя AES-256.Это использует 32-байтовый ключ.Согласно документации mcrypt он добавляет \ 0s, если ключ слишком короткий, поэтому вам придется либо использовать фактический 32-байтовый ключ, либо добавить \ 0s на стороне Android.
Измените свой код на Android:
byte[] key = "MARTIN_123456789".getBytes("UTF-8");
byte[] iv = "1234567890123456".getBytes("UTF-8");
byte[] decryptedData = decrypt(key, iv, b);
private byte[] decrypt(byte[] raw, byte[] iv, byte[] encrypted) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec ivspec = new IvParameterSpec(iv);
cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivspec);
byte[] decrypted = cipher.doFinal(encrypted);
return decrypted;
}
И на PHP:
function addpadding($string, $blocksize = 16){
$len = strlen($string);
$pad = $blocksize - ($len % $blocksize);
$string .= str_repeat(chr($pad), $pad);
return $string;
}
$key = "MARTIN_123456789";
$iv = "1234567890123456"
$crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, addpadding($text), MCRYPT_MODE_CBC, $iv);