Mcrypt - AES

polt

Новичок
Mcrypt - AES

нужно кодировать строку с помочью AES, поискал примеры, чет они не подходят.
Тестирую на винде.

насмотревшись всяких примеров, все свелось к вот этому:
(ключ 128)
PHP:
function aes_128_encrypt($text,$password) {
    $td = mcrypt_module_open('rijndael-128', '', MCRYPT_MODE_CBC, '');
    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
    $ks = mcrypt_enc_get_key_size($td);
    return bin2hex(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $password, $text, MCRYPT_MODE_ECB, $iv));
}
по началу были ошибки при открытие метода и IV, потом исправил, что дальше ума не приложу.
пробовал менять моды по разному, что же не получается.
Есть проверочные данные, так по ним моя шифровка и рядом не стоит. длинна строки в итоге раза в 2 меньше чем у проверочной.
видать это совсем не то и не так....(((

Ни разу не приходилось шифровать, полный профан в этом деле... помогите.
 

vovanium

Новичок
2 меньше чем у проверочной.
Ну так то наверное AES 256, просто длина кратна длине ключа, если ты закодишь 1 символ в AES 256, то в итоге получишь 256 бит, т.е. 32 байта, а с учетом перевода в hex строка 64 символа.
Вот для примера
PHP:
define ("CRYPT_ALG", MCRYPT_RIJNDAEL_192); // Алгоритм по умолчанию
define ("CRYPT_KEY", 'ключ для кодирования');

function encrypt($encrypt, $base64 = true, $crypt_alg = '') {
	$crypt_alg = $crypt_alg ? $crypt_alg : CRYPT_ALG;
	$iv = mcrypt_create_iv(mcrypt_get_iv_size($crypt_alg, MCRYPT_MODE_ECB), MCRYPT_RAND);
	$passcrypt = mcrypt_encrypt($crypt_alg, CRYPT_KEY, $encrypt, MCRYPT_MODE_ECB, $iv);
	return $base64 ? base64_encode($passcrypt) : $passcrypt;
}

function decrypt($decrypt, $base64 = true, $crypt_alg = '') {
	$crypt_alg = $crypt_alg ? $crypt_alg : CRYPT_ALG;
	$decoded = $base64 ? base64_decode($decrypt) :$decrypt;
	$iv = mcrypt_create_iv(mcrypt_get_iv_size($crypt_alg, MCRYPT_MODE_ECB), MCRYPT_RAND);
	$decrypted = mcrypt_decrypt($crypt_alg, CRYPT_KEY, $decoded, MCRYPT_MODE_ECB, $iv);
	return $decrypted;
}
$a = encrypt('Текст');
echo $a . ' > ' . decrypt($a);
по умолчанию кодит в AES 192 и потом base64

-~{}~ 18.03.09 14:26:

Да, и еще учитывай что после декодирования AES может добавляться мусор, поэтому trim нужно делать.
 

polt

Новичок
вообще ничего не понимаю, у меня ключ - написано 128бит, а сам он 32 символа.
длинна тестовых закодированных данных = 4128. (strlen) столько выдает

разве ключ может быть 32 символа.
PHP:
#128bit
$key = '6455E308F0D4018B976EC530130C8EC2';
-~{}~ 18.03.09 16:22:

vovanium
в твоем варианте, в закодированный строке, появляются символы "/", а в моем проверочном ниодного нету, это нормально, что есть "/" ?
 

dimagolov

Новичок
polt, сколько бит в одной 16-ричной цифре?

-~{}~ 18.03.09 10:05:

или по другому, какой длины двоичное число нужно для выражения одной 16-ричной цифры?
 

vovanium

Новичок
polt
У меня в base64 выдает, так как на выходе получается меньше строка. Если тебе нужно в hex, то замени base64_encode на bin2hex
 

polt

Новичок
Имеется Java шифрующий код:
Код:
...
private static final String RIJNDAEL = "Rijndael";
private static final String PROVIDER_CRYPTIX = "Cryptix";

...
m_alg = Cipher.getInstance(RIJNDAEL, PROVIDER_CRYPTIX);
m_key = new RawSecretKey(RIJNDAEL, Hex.fromString(secretKey));

... encode:
byte[] ect = null;
str = convert(str);
m_alg.initEncrypt(m_key);
ect = m_alg.crypt(str.getBytes());
return Hex.toString(ect);
потребовалось реализовать шифрование еще и на php, что бы Java мог расшифровать потом.
Результат php должен быть, как у J скрипта.
В PHP функция есть [algorithm и mode] может с ними что не так.. пробывал менять по разному, никак и ничего не получается. Результат всегда разный. Даже длинна строк крайне разная.
 

vovanium

Новичок
AES вообще-то стандарт, и различных вариаций там нет, отличаются только длиной ключа, иначе смысл от стандартизации пропадает. Так что скорее всего у тебя неправильный ключ. В коде насколько видно, ключ предварительно в Hex переводится, соответственно, тоже нужно сделать и в php
 

polt

Новичок
наверное!!!
RawSecretKey - что за фишка то? во что она ключ преобразует, чет я в нете толком не нашел, тип возвращаемых данных
 

vovanium

Новичок
ну так посмотрим в Java, что она возвращает, какие проблемы? Это же программирование, а не гадание.
 
Сверху