Для серверной части используем классы 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-кодирование результата.
Комментариев нет:
Отправить комментарий