Преобразовал SecretKey в байты, как преобразовать его обратно в SecretKey?

Я конвертирую секретный ключ в байты со следующим кодом

SecretKey key = KeyGenerator.getInstance("DES").generateKey();
byte[] bkey=key.getEncoded();

Теперь, как мне получить ключ от bkey? Я старался:

SecretKeySpec secretkey = new SecretKeySpec(bkey,"DES");   
SecretKeyFactory sfkey = SecretKeyFactory.getInstance("DES");
SecretKey skey = sfkey.generateSecret(secretkey);

Я получаю следующую ошибку:

Error during Exception java.security.spec.InvalidKeySpecException: Inappropriate key specification

person Princeyesuraj    schedule 19.03.2011    source источник
comment
Зачем вам это нужно? Просто передайте key вашему шифру.   -  person user634618    schedule 19.03.2011
comment
почему за это проголосовали? мне кажется резонным вопросом.   -  person MeBigFatGuy    schedule 19.03.2011
comment
@ user634618: я действительно использую этот формат байтов, чтобы сохранить его в базе данных и использовать для расшифровки.   -  person Princeyesuraj    schedule 19.03.2011
comment
Используете DES в 2011 году? Не беспокойтесь и используйте открытый текст, это не менее безопасно...   -  person Bruno Rohée    schedule 31.03.2011
comment
@Bruno Ya Но я только что узнал, как работает DES   -  person Princeyesuraj    schedule 04.04.2011
comment
@BrunoRohée: Некоторые люди просто хотят получить ответы на свои вопросы без снисходительного, элитарного ответа. Подобные комментарии заставляют неопытных пользователей бояться задавать свои вопросы; Я бы знал, потому что сам был (и до сих пор нахожусь) в такой ситуации...   -  person araisbec    schedule 11.11.2012
comment
@araisbec Это был не ответ, а комментарий, и некоторые люди действительно ценят, когда их останавливают раньше, когда их блуждание приводит их прямо в пропасть. На этом самом сайте есть множество примеров людей, использующих крайне небезопасную криптографию, потому что никто не предупредил их об этом достаточно рано.   -  person Bruno Rohée    schedule 12.11.2012
comment
@BrunoRohée, я предполагаю, что вы говорите о контейнере PKCS, когда говорите в открытом виде. Ключ, сохраненный в открытом виде, меньше, чем его размер в байтовом формате?   -  person AaA    schedule 16.08.2017


Ответы (2)


Это должно работать

    SecretKey key = KeyGenerator.getInstance("DES").generateKey();
    byte[] data = key.getEncoded();
    SecretKey key2 = new SecretKeySpec(data, 0, data.length, "DES");
person MeBigFatGuy    schedule 19.03.2011

Попробуйте что-нибудь из этого кода...

import javax.crypto.Cipher;
import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
import java.security.InvalidKeyException;

public class DESede {
    private static String algorithm = "DESede";
    private static Key key = null;
    private static SecretKey secretKey = null;
    private static Cipher cipher = null;
    private static DESede obj = new DESede();

    private DESede() {
        try {
            key = KeyGenerator.getInstance(algorithm).generateKey();
            KeyGenerator.getInstance(algorithm).getProvider();
            byte[] keyBytes = key.getEncoded();
            String keyFormat = key.getFormat();
            String keyAlgorithm = key.getAlgorithm();
            String keyString = new String(keyBytes);
            System.out.println("Key Format::" + keyFormat);
            System.out.println("Key Algorithm::" + keyAlgorithm);
            System.out.println("Key String::" + keyString);
            keyString.getBytes();
            secretKey = new SecretKeySpec(keyBytes, 0, keyBytes.length, "DESede");
            byte[] secretKeyBytes = key.getEncoded();
            String secretKeyFormat = key.getFormat();
            String secretKeyAlgorithm = key.getAlgorithm();
            String secretKeyString = new String(secretKeyBytes);
            System.out.println("Secret Key Format::" + secretKeyFormat);
            System.out.println("Secret Key Algorithm::" + secretKeyAlgorithm);
            System.out.println("Secret Key String::" + secretKeyString);
            String keyNewString = "bXŒ*êÂÕê›æOÄ’Îý‘ãô|8¶Ë1­";
            byte[] keyNewBytes = keyString.getBytes();
            secretKey = new SecretKeySpec(keyBytes, 0, keyBytes.length, "DESede");
            cipher = Cipher.getInstance(algorithm);
        } catch (Exception e) {
        }
    }

    public static DESede getInstance() {
        return obj;
    }

    public static byte[] encrypt(String input) throws InvalidKeyException,
            BadPaddingException, IllegalBlockSizeException {
        System.out.println("Inside encrypt()");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] inputBytes = input.getBytes();
        System.out.println("Exit encrypt()");
        return cipher.doFinal(inputBytes);
    }

    public static String decrypt(byte[] encryptionBytes)
            throws InvalidKeyException, BadPaddingException,
            IllegalBlockSizeException {
        System.out.println("Inside decrypt()");
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        byte[] recoveredBytes = cipher.doFinal(encryptionBytes);
        String recovered = new String(recoveredBytes);
        System.out.println("Exiting decrypt()");
        return recovered;
    }

    public static void main(String args[]) throws InvalidKeyException,
            BadPaddingException, IllegalBlockSizeException {
        byte[] encryptedValue = DESede.encrypt("plz try encrypt and decrypt me");
        System.out.println("encryptedValue::" + encryptedValue);
        String decryptedValue = DESede.decrypt(encryptedValue);
        System.out.println("decryptedValue::" + decryptedValue);
    }
}
person Manoj    schedule 08.02.2012