как записать IvParameterSpec в файл?

Я записал свой SecretKey в файл, используя следующий код. Точно так же я должен записать свой ivParameterSpec в другой файл. Как я могу это сделать?

SecretKey key = KeyGenerator.getInstance("AES").generateKey();
ObjectOutputStream secretkeyOS = new ObjectOutputStream(new FileOutputStream("publicKeyFile"));
secretkeyOS.writeObject(key);
secretkeyOS.close();

AlgorithmParameterSpec paramSpec1 = new IvParameterSpec(iv);
session.setAttribute("secParam", paramSpec1);
ObjectOutputStream paramOS = new ObjectOutputStream(new FileOutputStream("paramFile"));
paramOS.writeObject(paramSpec1);
paramOS.close();

person user2756703    schedule 08.10.2013    source источник
comment
iv - 16-битный массив байтов   -  person user2756703    schedule 08.10.2013
comment
Я думаю, этот ответ на запись массива байтов в файл должен вам помочь. stackoverflow.com/questions/4350084/byte-to-file-in-java   -  person LostAvatar    schedule 08.10.2013
comment
нет, это невозможно. paramspec1 не является массивом байтов   -  person user2756703    schedule 08.10.2013
comment
Почему вы хотите сохранить объект? Сохраните iv и создайте из него новую спецификацию, когда она вам понадобится для расшифровки или около того.   -  person LostAvatar    schedule 08.10.2013
comment
мне нужно такое же значение на другой странице. Является ли это возможным   -  person user2756703    schedule 08.10.2013
comment
IV — это часть, определяющая IvParameterSpec. Если вы сохраните внутривенно и загрузите его снова. new IvParameterSpec(loaded_iv) эта новая спецификация параметра РАВНА другому. Ваш код не работает, потому что IvParameterSpec не сериализуем, потому что он не предназначен для хранения   -  person LostAvatar    schedule 08.10.2013
comment
не могли бы вы предоставить код   -  person user2756703    schedule 08.10.2013
comment
@LostAvatar Может быть, превратить этот комментарий в ответ?   -  person Duncan Jones    schedule 08.10.2013


Ответы (1)


Не пытайтесь сохранить объект IvParameterSpec. Его нельзя сериализовать, потому что он не предназначен для хранения. IV является важной частью. Сохраните это и создайте новый IvSpec из IV. Я изменил пример кода из здесь для шифрования AES для хранения IV и используйте загруженный IV для расшифровки зашифрованного текста, чтобы вы могли увидеть возможный рабочий процесс.

Имейте в виду, что это минимальный пример. В реальном случае вы также должны хранить и загружать ключ, и обработка исключений также должна быть пересмотрена :-D

public class Test {
    public static void main(String[] args) throws Exception {
        String message = "This string contains a secret message.";

        // generate a key
        KeyGenerator keygen = KeyGenerator.getInstance("AES");
        keygen.init(128);
        byte[] key = keygen.generateKey().getEncoded();
        SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");

        byte[] iv = { 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8 };
        IvParameterSpec ivspec = new IvParameterSpec(iv);

        // initialize the cipher for encrypt mode
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivspec);

        // encrypt the message
        byte[] encrypted = cipher.doFinal(message.getBytes());
        System.out.println("Ciphertext: " + hexEncode(encrypted) + "\n");

        // Write IV
        FileOutputStream fs = new FileOutputStream(new File("paramFile"));
        BufferedOutputStream bos = new BufferedOutputStream(fs);
        bos.write(iv);
        bos.close();

        // Read IV
        byte[] fileData = new byte[16];
        DataInputStream dis = null;

        dis = new DataInputStream(new FileInputStream(new File("paramFile")));
        dis.readFully(fileData);
        if (dis != null) {
            dis.close();
        }

        // reinitialize the cipher for decryption
        cipher.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec(fileData));

        // decrypt the message
        byte[] decrypted = cipher.doFinal(encrypted);
        System.out.println("Plaintext: " + new String(decrypted) + "\n");
    }

    [...]
}
person LostAvatar    schedule 08.10.2013