Расшифровка данных DES/CBC/ZeroBytePadding
У меня есть токен и секрет, необходимый для расшифровки токена. Я не уверен, что я делаю неправильно, потому что я получаю "неправильный размер ключа". Мой размер ключа составляет 44 байта. Я добавляю BouncyCastleProvider в статический блок. Ниже приведен небольшой фрагмент того, что я пытаюсь сделать.
SecretKeySpec skeySpec = new SecretKeySpec(keyText.getBytes(), "DES");
Cipher des = Cipher.getInstance("DES/CBC/ZeroBytePadding", "BC");
des.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec(new byte[8]));
byte[] tokenData = des.doFinal(Base64.decodeBase64(token));
2 ответа
DES имеет размер ключа 56 бит в 8 байтах, lsb каждого байта зарезервирован для контроля четности, но обычно игнорируется.
Поэтому "Мой размер ключа составляет 44 байта" неверно.
Далее IV, используемый для дешифрования, должен быть таким же, как был использован для шифрования. DES имеет размер блока 8 байтов, поэтому IV должен быть 8 байтов. Один из общих способов обработки IV состоит в том, что префикс зашифрованных данных с ним, IV не должен быть секретным.
Наконец, заполнение нулями обычно не является хорошим решением, оно не поддерживает двоичные данные, которые могут заканчиваться нулевым байтом. PKCS#5 является обычно используемым заполнением.
Я предполагаю, что ваш keyText закодирован в Base64. Вы, вероятно, должны декодировать его, чтобы получить байт [] из 32 байтов. В Java 8 вы можете сделать что-то вроде этого:
byte[] key = java.util.Base64.getDecoder().decode(keyText.getBytes());
SecretKeySpec skeySpec = new SecretKeySpec(key, "DES");
Cipher des = Cipher.getInstance("DES/CBC/ZeroBytePadding", "BC");
des.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec(new byte[8]));
byte[] tokenData = des.doFinal(Base64.decodeBase64(token));
Этот другой вопрос имеет больше информации о Base64. Преобразование секретного ключа в строку и наоборот
Я все еще думаю, что вы получите неправильные ошибки размера ключа, хотя. Разве ключ DES не 56 бит (плюс 8 бит четности)? Так что это будет всего 8 байт, а не 44 или 32, я думаю, вы получите, когда будете декодировать Base64.