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


Автор: Rulevoj 16.11.2010, 06:39
Использовал код:

Код

import java.io.UnsupportedEncodingException;


import java.security.Key;
import java.security.NoSuchAlgorithmException;


import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;


public class CryptoUtil {


    /*
     * Also as parameter can be used DES, DESede, Blowfish etc
     */


    public static final String ALGORITHM_KEY = "DES";
    public static final String ALGORITHM = "DES/PCBC/PKCS5Padding";


    public static final byte[] SALT = new byte[]{
        (byte) 0xc7, (byte) 0x73, (byte) 0x21, (byte) 0x8c, (byte) 0x7e, (byte) 0xc8, (byte) 0xee, (byte) 0x99
    };


    public static byte[] encode(String clearText, Key key){
        try{
            return crypt(clearText.getBytes("UTF-8"), key, Cipher.ENCRYPT_MODE);
        }catch (UnsupportedEncodingException usee){
            usee.printStackTrace();
        }
        return null;
    }


    public static String decode(byte[] cipherText, Key key){
        return new String(crypt(cipherText, key, Cipher.DECRYPT_MODE));
    }


    private static SecretKey generateKey(){
        try{
            return KeyGenerator.getInstance(ALGORITHM_KEY).generateKey();
        }catch (NoSuchAlgorithmException nsae){
            nsae.printStackTrace();
        }
        return null;
    }


    private static byte[] crypt(byte[] input, Key key, int mode){
        IvParameterSpec iv = new IvParameterSpec(SALT);
        Cipher c;
        try{
            c = Cipher.getInstance(ALGORITHM);
            c.init(mode, key, iv);
            return c.doFinal(input);
        }catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }




    public static void main(String[] args){
        String data = "sdztjdr";
        Key key = generateKey();
        byte[] encode = CryptoUtil.encode(data, key);
        System.out.println("encode> " + encode);
        String decode = CryptoUtil.decode(encode, key);
        System.out.println("decode> " + decode);
        System.out.println(key.getFormat());


    }
}



например я шифрую слово test


Код


// :))

public static final String ALGORITHM_KEY = "DES";

private static SecretKey generateKey(){
try{
return KeyGenerator.getInstance(ALGORITHM_KEY).generateKey();
}catch (NoSuchAlgorithmException nsae){
nsae.printStackTrace();
}
return null;
}

// :)


String pass = "test";


         Key key = generateKey();
         byte[] encode = CryptoUtil.encode(pass, key);
         String decode = CryptoUtil.decode(encode, key);




в результате получаю:

Слово: test
ключ: com.sun.crypto.provider.DESKey@fffe7aea
Зашифровано как: [B@19b5393
расшифровка: test


меня это устраивает....
Только ключ постоянно меняется... как сделать Key постоянным, или это не возможно??? Или есть какойто другой метод шифрования и расшифровки с постоянным ключём...  Запарился уже... всю ночь ищю.....


Автор: Rulevoj 16.11.2010, 19:13
Ещё кажется можно применить хеширование и дэхеширование... я пробовал MD5 у меня хешировать получается а вот дэхэшировать нет.... Есть может какой другой алогоритм дэхеширования??? который хорошо кодирует переменные??? ну и естественно обратно их возвращает...

Автор: AxNe0 16.11.2010, 20:46
Rulevoj, а как ты определил, что ключ постоянно меняется? 

Автор: kkorsakoff 17.11.2010, 13:32
Так вы же при каждом запуске jmv ключ генерируете новый. Надо написать что-то вроде отдельной утилиты, которая сгенерит ключ и сохранит его, скажем, в файл. Затем считывать ключ из файла и применять.
Это если совсем по простому. Еще можно воспользоваться стандартной джавовской инфраструктурой keystore для хранения ключей.

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