Для серверной части используем классы javax.crypto.*. Код примерно такой:
- public class DesCrypter {
 - Cipher ecipher;
 - Cipher dcipher;
 - /**
 - * Конструктор
 - * @param key секретный ключ алгоритма DES
 - * @throws NoSuchAlgorithmException
 - * @throws NoSuchPaddingException
 - * @throws InvalidKeyException
 - */
 - public DesCrypter(String keystr) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidKeySpecException {
 - DESKeySpec desKeySpec = new DESKeySpec(keystr.getBytes());
 - SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
 - SecretKey key = keyFactory.generateSecret(desKeySpec);
 - ecipher = Cipher.getInstance("DES");
 - dcipher = Cipher.getInstance("DES");
 - ecipher.init(Cipher.ENCRYPT_MODE, key);
 - dcipher.init(Cipher.DECRYPT_MODE, key);
 - }
 - /**
 - * Функция шифровнаия
 - * @param str строка открытого текста
 - * @return зашифрованная строка в формате Base64
 - */
 - public String encrypt(String str) throws UnsupportedEncodingException, IllegalBlockSizeException, BadPaddingException {
 - byte[] utf8 = str.getBytes("UTF8");
 - byte[] enc = ecipher.doFinal(utf8);
 - return new sun.misc.BASE64Encoder().encode(enc);
 - }
 - /**
 - * Функция расшифрования
 - * @param str зашифрованная строка в формате Base64
 - * @return расшифрованная строка
 - */
 - public String decrypt(String str) throws IOException, IllegalBlockSizeException, BadPaddingException {
 - byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(str);
 - byte[] utf8 = dcipher.doFinal(dec);
 - return new String(utf8, "UTF8");
 - }
 - }
 
На клиентской стороне используем библиотеку as3crypto. С её помощью делаем реализацию шифрования на ActionScript 3.5:
- /**
 - * @param string Cтрока для зашифровки
 - * @param passString Пароль
 - */
 - public static function encryptString(string:String, passString:String):String {
 - var key:ByteArray = Hex.toArray(Hex.fromString(passString+postfix));
 - var plainText:ByteArray = Hex.toArray(Hex.fromString(string));
 - var cipher:ICipher = Crypto.getCipher("simple-des-ecb", key);
 - cipher.encrypt(plainText);
 - return Base64.encodeByteArray(plainText);
 - }
 - /**
 - * @param string Cтрока для расшифровки
 - * @param passString Пароль
 - */
 - public static function decryptString(string:String, passString:String):String {
 - var key:ByteArray = Hex.toArray(Hex.fromString(passString+postfix));
 - var plainText:ByteArray = Hex.toArray(string);
 - var cipher:ICipher = Crypto.getCipher("simple-des-ecb", key);
 - cipher.decrypt(plainText);
 - return(Hex.toString(Hex.fromArray(plainText)));
 - }
 
Никаких неожиданностей не было, всё заработало сразу. Единственная особенность: функции шифрования работают с битовыми массивами, а передаём мы строки. При создании строки играет роль (часто губительную) кодировка. Чтобы избежать неприятностей с ней, везде используем Base64-кодирование результата.
Комментариев нет:
Отправить комментарий