AES256 decryption from URL

138
27 марта 2018, 00:58

Я пытаюсь расшифровать файл *.ovpn который зашифрованный с помощью команды openssl enc -in infile.txt -out encrypted.dat -e -aes256 -k key_firebase

Файл скачиваеться по ссылке, но я скачиваю его с помощью следующего кода.

       private String enctyptionKey = "63efc5743d9927c5993a05bdc5220b9eca8e38b5df829ca587a57f8ae423676b5fd79f641e375d0a0b3e2e03e7a079ea97cdah26bb2e15213daabb468760f425";
  void main(){
      URL url = new URL("https://encryptedfile.url");
        InputStream inputStream = url.openStream())
         byte[] b = new byte[1024];
                ByteArrayOutputStream os = new ByteArrayOutputStream();
                int c;
                while ((c = inputStream.read(b)) != -1) {
                    os.write(b, 0, c);
                }
           String result = De.decryptMsg(os.toByteArray());
    }
    class De {
        public static byte[] hex2byte(byte[] b) {
            if ((b.length % 2) != 0)
                throw new IllegalArgumentException("hello");
            byte[] b2 = new byte[b.length / 2];
            for (int n = 0; n < b.length; n += 2) {
                String item = new String(b, n, 2);
                b2[n / 2] = (byte) Integer.parseInt(item, 16);
            }
            return b2;
        }
        public static byte[] decryptMsg(String secretKeyString, byte[] encryptedMsg)
                throws Exception {
    //        String algorithm = "AES/ECB/PKCS5Padding";
            String algorithm = "AES";
            // generate AES secret key from the user input secret key
            Key key = new SecretKeySpec(secretKeyString.getBytes(), algorithm);
            // get the cipher algorithm for AES
            Cipher c = Cipher.getInstance(algorithm);
            // specify the decryption mode
            c.init(Cipher.DECRYPT_MODE, key);
            // decrypt the message
            return c.doFinal(encryptedMsg);
        }
    }

И я получаю ошибку. InvalidKeyException: Invalid AES key length: 128 bytes

Но данные нормально расшифровываеться командой

openssl enc -in encrypted.rtf -out decrypted.rtf -d -aes256 -k 63efc5743d9927c5993a05bdc5220b9eca8e38b5df829ca587a57f8ae423676b5fd79f641e375d0a0b3e2e03e7a079ea97cdah26bb2e15213daabb468760f425

Если кто может указать направление куда смотреть, буду благодарен.

Answer 1

Когда вы выполняете команду openssl enc -in infile.txt -out encrypted.dat -e -aes256 -k key_firebase, key_firebase - это не ключ, это текст, из которого openssl генерирует ключ:

The password is used to derive the actual key which is used to encrypt your data.

Что бы посмотреть какой ключ был сгенерирован, вы можете добавить параметр -P (вывести ключи, но не шифровать) или -p (вывести ключи и зашифровать):

openssl enc -in infile.txt -out encrypted.dat -e -aes256 -k key_firebase -P

8 байт соли, которые использовались для генерации ключа, потом добавляются в начало зашифрованного файла.

Java выдает правильное исключение, для AES256 нужен ключ длиной 32 байта.

READ ALSO
Как вручную проставить точку в числе?

Как вручную проставить точку в числе?

Есть 10000 копеек, которые нужно привести к виду 10000 рублей

121
Android Volley Post Request Обновить

Android Volley Post Request Обновить

Как обновить запрос ? Если я сделаю запрос paramsput("text", "Четверг"); А потом поменяю на params

132
Как определить номер недели если неделя начинается с определенного дня?

Как определить номер недели если неделя начинается с определенного дня?

При автоматизации отчета в excel, застрял с одной формулойФормула позволяет проставить номер недели исходя из даты

158
Serializable vs Externalizable

Serializable vs Externalizable

В чем разница между этими этими видами сериализациямиИ в Serialilzable я могу определить методы (private void writeObject(ObjectOutputStream in) и private void readObject(ObjectInputStream...

127