Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Создание ключа по спецификации


Автор: DmTsarev 1.4.2008, 17:22
Есть ключ, с помощью метода getEncoded() получаем набор байтов. 
Как из этих байтов восстановить ключ?

        
Код

       SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");

        byte raw[] = key.getEncoded();

        DESKeySpec ks = new DESKeySpec(raw);
        
        Key k = skf.generateSecret( ks );
     

        

Так получается, но не хочется использовать для каждого алгоритма свою спецификацию. 
Есть ли какая-нибудь KeyFactory , которая сама переваривает спецификации в ключ заданного типа?

Автор: Alexandr87 3.4.2008, 06:14
Код

        byte baKey[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
        SecretKeySpec spec = new SecretKeySpec(baKey, "DES");
        SecretKey key = 
                SecretKeyFactory.getInstance("DES").generateSecret(spec)
;

Автор: DmTsarev 3.4.2008, 08:44
InvalidKeySpecException в твоем примере.
 В этом-то и проблема, что SecretKeySpec и DESKeySpec  или DESedeKeySpec отличаются по структуре.

Автор: Alexandr87 3.4.2008, 14:38
DmTsarev, в упор не вижу где вы находите проблемы

Код

        SecretKey key1 = KeyGenerator.getInstance("DES").generateKey();
        byte baKey1[] = key1.getEncoded();
        
        SecretKeySpec spec = new SecretKeySpec(baKey1, "DES");
        SecretKey key2 = SecretKeyFactory.getInstance("DES").generateSecret(spec);
        byte baKey2[] = key2.getEncoded();
        
        System.out.println("Key1: " + new String(Hex.encode(baKey1)));
        System.out.println("Key2: " + new String(Hex.encode(baKey2)));
        
        byte baMessage[] = "Message".getBytes();
        
        Cipher ciph = Cipher.getInstance("DES/ECB/PKCS5Padding");
        ciph.init(Cipher.ENCRYPT_MODE, key1);
        byte baEncrypted[] = ciph.doFinal(baMessage);
        
        ciph.init(Cipher.DECRYPT_MODE, key2);
        byte baDecrypted[] = ciph.doFinal(baEncrypted);
        
        System.out.println("Message:  " + new String(Hex.encode(baMessage)));
        System.out.println("Encrypted:" + new String(Hex.encode(baEncrypted)));
        System.out.println("Decrypted:" + new String(Hex.encode(baDecrypted)));


Лично у меня оба ключевых массива идентичны и никаких эксепшенов не лезет.

Автор: DmTsarev 3.4.2008, 18:25
        java.security.spec.InvalidKeySpecException: Inappropriate key specification
        at com.sun.crypto.provider.DESKeyFactory.engineGenerateSecret(DashoA13*..)
        at javax.crypto.SecretKeyFactory.generateSecret(DashoA13*..)

на этой строчке:
Код

SecretKey key2 = SecretKeyFactory.getInstance("DES").generateSecret(spec);


Опишите ваши средства разработки, пожайлуста.

Автор: Alexandr87 3.4.2008, 19:34
DmTsarev, хм действительно, SUN овский провайдер что-то гонит.
Сейчас стал смотреть, у меня по-умолчанию еще BouncyCastle добавлен (boucycastle.org). В нем эта фича работает, если его убрать вываливаеся такое же исключение.

Надо будет на досуге глянуть, что там в SUN овском провайдере за дела такие.

Автор: DmTsarev 4.4.2008, 09:21
В BouncyCastle действительно все без проблем. 
Спасибо за помощь.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)