Использование соли в AES в C # и переполнение стека

Я пытаюсь кодировать и декодировать строку с использованием AES. На данный момент я кодирую строку в Mono C #, используя ответ с самым высоким рейтингом Вот, так как System.Security.Crytpography.Aes недоступно в моно. Тем не менее, эта реализация использует соль, а Метод PHP Я использую, чтобы расшифровать это не берет соль, только Вектор инициализации, который я генерирую.

Моя проблема: Зашифрованные данные засолены, и я не знаю, как их засолить, даже используя известную строку соли.

  1. Должен ли я попытаться удалить соль из класса C #?
    • Достаточно ли хороша реализация с использованием только открытого текста, пароля / ключа и вектора инициализации?
  2. Или есть другая форма расшифровки, которую я могу использовать в PHP, которая будет принимать зашифрованный текст, ключ, соль и вектор инициализации?
  3. Или я должен попытаться распечатать дешифрованный текст после вызова mcrypt_decrypt в теме? Это правильный порядок вещей?
  4. Или я должен полностью переписать класс C # AES? Это на самом деле плохой пример?
  5. [править] Или кто-нибудь знает о Rfc2898DeriveBytes реализацию я могу использовать в PHP? Я не уверен, что достаточно уверен в себе, чтобы написать реализацию самостоятельно, чтобы я не смог полностью победить точку безопасности из-за какой-то ошибки.

Извините за мое невежество, это первый раз, когда я имел дело с шифрованием, и есть много информации, чтобы принять.

0

Решение

Ответ Вы отправили реализует Rfc2898DeriveBytes класс для получения байтов ключа шифрования. Это рекомендуется, но не обязательно. Вам не нужно использовать Rfc2898DeriveBytes и может просто изменить эту реализацию AES, чтобы не брать соль и просто принимать байты пароля в качестве ключа напрямую. Хотя я не рекомендую это на практике.

Я рекомендую найти более подходящую реализацию PHP AES, которая позволяет использовать пароль для получения байтов ключа — что должно быть доступно (извините, но у меня мало опыта с PHP, чтобы помочь вам в этом; вы можете обнаружить, что дополнительный метод существует в криптографических библиотеках PHP для формирования ключа на основе ввода пароля и соли, аналогичного .NET / MONO Rfc2898DeriveBytes).

2

Другие решения

№ 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
0

По вопросам рекламы [email protected]