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


Автор: YuraDoc 30.3.2008, 13:36
На сервере шифруются файлы. На клиенте они дешефруются.
На сервере используется PHP и соответствующие библиотеки шифрования.
На клиенте Java апплет. Подскажите надежный метод шифрования(дешифрования), чтобы не нужно было в апплет включать какие-либо дополнительные пакеты.
Спасибо.

Автор: v2v 30.3.2008, 13:52
берёшь любой стандартный алгоритм шифрования.

Автор: YuraDoc 30.3.2008, 16:07
Я имею ввиду есть ли в Java стандартные пакеты "криптографии" наподобии библиотек PHP?

Автор: Alexandr87 30.3.2008, 17:23
а в гугле искать не пробовали?
http://java.sun.com/j2se/1.4.2/docs/guide/security/jce/JCERefGuide.html

Автор: barin_Student 31.3.2008, 09:15
bouncycastle, то же куча алгоритмов , + код открытый....
ПС:
Александр87 :Казахстан, Алматы
В одном городе живем, и я 87... smile  smile 

Автор: YuraDoc 2.4.2008, 20:02
А как не генерить ключ, а просто его задать самому?
Вроде бы нашел:
Код

                key = "[key]**********************************************************************[/key]";
                SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
                pbeKeySpec = new PBEKeySpec(key.toCharArray());
                SecretKey pbeKey = keyFactory.generateSecret(pbeKeySpec);
                desCipher.init(Cipher.DECRYPT_MODE, pbeKey);
                String dec_hello = new String(desCipher.doFinal(buf.toString().getBytes()));


Мне просто необходимо по заданному ключу расшифровать текст.

Консоль выдает:
java.security.spec.InvalidKeySpecException: Inappropriate key specification
        at com.sun.crypto.provider.DESedeKeyFactory.engineGenerateSecret(DashoA13*..)
        at javax.crypto.SecretKeyFactory.generateSecret(DashoA13*..)
        at TripleDES.main(TripleDES.java:37)
Как мне быть?

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

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


Добавлено через 9 минут и 39 секунд
А в php ключ к алгоритму шифрования задается строкой? Если да, то вам нужно узнать как php преобразуется его все таки в нормальный ключ, представленный массивом байт.

Автор: YuraDoc 3.4.2008, 12:09
Функция шифрования:
Код

$key = "[key]**********************************************************************[/key]";
$encrypted = mcrypt_ecb (MCRYPT_3DES, $key, $input, MCRYPT_ENCRYPT);


Ключ $key задается точно такой-же длины как я указал, в строчном формате.
$input - входной текст.
$encrypted - зашифрованный текст.

Цитата

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

java.security.spec.InvalidKeySpecException: Inappropriate key specification
        at com.sun.crypto.provider.DESedeKeyFactory.engineGenerateSecret(DashoA13*..)
        at javax.crypto.SecretKeyFactory.generateSecret(DashoA13*..)
        at TripleDES1.main(TripleDES1.java:38)

Автор: Alexandr87 3.4.2008, 12:56
YuraDoc, полностью TripleDES1 выложите

Автор: YuraDoc 3.4.2008, 13:39
Код

public class TripleDES {
     public static void main(String[] args){
        {
            try {
                InputStream input = null;
                String key;
                PBEKeySpec pbeKeySpec;

                Cipher desCipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
                key = "[key]**********************************************************************[/key]"
                SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
                pbeKeySpec = new PBEKeySpec(key.toCharArray());
                SecretKey pbeKey = keyFactory.generateSecret(pbeKeySpec);
                StringBuffer buf = new StringBuffer();
                String fileName = "http://...";
                URLConnection conn = new URL(fileName).openConnection();
                input = conn.getInputStream();
                
                
                int c;

                while ((c = input.read()) != -1) {
                    buf.append(c);
                }
                input.close();

                desCipher.init(Cipher.DECRYPT_MODE, pbeKey);
                String dec_hello = new String(desCipher.doFinal(buf.toString().getBytes()));
                System.out.println(dec_hello);
            } catch (InvalidKeySpecException ex) {
                Logger.getLogger(TripleDES.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(TripleDES.class.getName()).log(Level.SEVERE, null, ex);
            } catch (NoSuchPaddingException ex) {
                Logger.getLogger(TripleDES.class.getName()).log(Level.SEVERE, null, ex);
            } catch (NoSuchAlgorithmException ex) {
                Logger.getLogger(TripleDES.class.getName()).log(Level.SEVERE, null, ex);
            } catch (InvalidKeyException ex) {
                Logger.getLogger(TripleDES.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IllegalBlockSizeException ex) {
                Logger.getLogger(TripleDES.class.getName()).log(Level.SEVERE, null, ex);
            } catch (BadPaddingException ex) {
                Logger.getLogger(TripleDES.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }


Внимание: настоящий ключ не выкладываю, а также не выкладываю адрес сервера (конфиденциальная информация).

Ошибка:
ava.security.spec.InvalidKeySpecException: Inappropriate key specification
        at com.sun.crypto.provider.DESedeKeyFactory.engineGenerateSecret(DashoA13*..)
        at javax.crypto.SecretKeyFactory.generateSecret(DashoA13*..)
        at TripleDES.main(TripleDES.java:38)

Может дело в PKCS5Padding.

Автор: Alexandr87 3.4.2008, 14:14
YuraDoc
пользоваться PBE (Password Based Encryption), нужно следующим образом:

Код

       SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithSHA1AndDESede");
        pbeKeySpec = new PBEKeySpec(key.toCharArray());
        SecretKey pbeKey = keyFactory.generateSecret(pbeKeySpec);
        Cipher desCipher = Cipher.getInstance("PBEWithSHA1AndDESede");


Вообще ключ представляет собой массив байт. Для того, чтобы строку привести к виду ключа используются специальные механизмы. 
И далеко не факт, что сейчас у вас при расшифровывании будет появлятся ожидаемое сообщение. В php может использоваться другой механизм, который вам нужно будет выяснить.



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