Я пытаюсь кодировать и декодировать строку с использованием AES. На данный момент я кодирую строку в Mono C #, используя ответ с самым высоким рейтингом Вот, так как System.Security.Crytpography.Aes
недоступно в моно. Тем не менее, эта реализация использует соль, а Метод PHP Я использую, чтобы расшифровать это не берет соль, только Вектор инициализации, который я генерирую.
Моя проблема: Зашифрованные данные засолены, и я не знаю, как их засолить, даже используя известную строку соли.
mcrypt_decrypt
в теме? Это правильный порядок вещей?Rfc2898DeriveBytes
реализацию я могу использовать в PHP? Я не уверен, что достаточно уверен в себе, чтобы написать реализацию самостоятельно, чтобы я не смог полностью победить точку безопасности из-за какой-то ошибки.Извините за мое невежество, это первый раз, когда я имел дело с шифрованием, и есть много информации, чтобы принять.
Ответ Вы отправили реализует Rfc2898DeriveBytes
класс для получения байтов ключа шифрования. Это рекомендуется, но не обязательно. Вам не нужно использовать Rfc2898DeriveBytes
и может просто изменить эту реализацию AES, чтобы не брать соль и просто принимать байты пароля в качестве ключа напрямую. Хотя я не рекомендую это на практике.
Я рекомендую найти более подходящую реализацию PHP AES, которая позволяет использовать пароль для получения байтов ключа — что должно быть доступно (извините, но у меня мало опыта с PHP, чтобы помочь вам в этом; вы можете обнаружить, что дополнительный метод существует в криптографических библиотеках PHP для формирования ключа на основе ввода пароля и соли, аналогичного .NET / MONO Rfc2898DeriveBytes
).
№ 1 Нет
№ 2 Да (см. Ниже)
№ 3 Нет
# 4 Нет, это выглядит хорошо для меня
# 5 Пожалуйста, попробуйте эту реализацию PHP с вашими зашифрованными данными. Я не проверял это.
<?php
function pbkdf2( $p, $s, $c, $kl, $a = 'sha1' ) {
$hl = strlen(hash($a, null, true)); # Hash length
$kb = ceil($kl / $hl); # Key blocks to compute
$dk = ''; # Derived key
# Create key
for ( $block = 1; $block <= $kb; $block ++ ) {
# Initial hash for this block
$ib = $b = hash_hmac($a, $s . pack('N', $block), $p, true);
# Perform block iterations
for ( $i = 1; $i < $c; $i ++ )
# XOR each iterate
$ib ^= ($b = hash_hmac($a, $b, $p, true));
$dk .= $ib; # Append iterated block
}
# Return derived key of correct length
return substr($dk, 0, $kl);
}
//Usage example (Decryption by PHP)
$ciphertext_b64 = "owiCMbopBmr+NvjBEUT2Hg==";
$password = "password";
$salt = "g46dzQ80"; //Please change to the salt you are using. Copied from the referenced answer code.
//This is the key derivation part. I think .net uses 1000 iterations of sha1.
$key = pbkdf2($password, $salt, 1000, 32, "sha1");
$iv = "OFRna74m*aze01xY"; //Again, I copied the IV from the .NET code in the answer you referenced.
$plaintext = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($ciphertext_b64), MCRYPT_MODE_CBC, $iv), "\0");
echo $plaintext;
// Output = hello