На SO уже есть несколько полезных вопросов:
Однако у меня все еще есть трудности с моим конкретным случаем.
Я пробовал различные методы, но в итоге получил ошибку "The IV parameter must be as long as the blocksize"
или текст, который не соответствует полученному хешу.
Я недостаточно разбираюсь в шифровании, чтобы понять, что я делаю неправильно.
Вот версия php:
$pass = 'hello';
$salt = 'application-salt';
echo Encrypt('hello', 'application-salt');
function Encrypt($pass, $salt)
{
$derived = PBKDF1($pass, $salt, 100, 16);
$key = bin2hex(substr($derived, 0, 8));
$iv = bin2hex(substr($derived, 8, 8));
return mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $pass, MCRYPT_MODE_CBC, $iv);
}
function PBKDF1($pass, $salt, $count, $dklen)
{
$t = $pass.$salt;
$t = sha1($t, true);
for($i=2; $i <= $count; $i++)
{
$t = sha1($t, true);
}
$t = substr($t,0,$dklen-1);
return $t;
}
И версия C #:
Console.WriteLine(Encrypt("hello", "application-salt"));
// output: "Hk4he+qKGsO5BcL2HDtbkA=="
public static string Encrypt(string clearText, string Password)
{
byte[] clearData = System.Text.Encoding.Unicode.GetBytes(clearText);
PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password,
new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
MemoryStream ms = new MemoryStream();
Rijndael alg = Rijndael.Create();
alg.Key = pdb.GetBytes(32);
alg.IV = pdb.GetBytes(16);
CryptoStream cs = new CryptoStream(ms, alg.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(clearData, 0, clearData.Length);
cs.Close();
byte[] encryptedData = ms.ToArray();
return Convert.ToBase64String(encryptedData);
}
Я хочу иметь возможность проверять логины пользователей в новом приложении на основе php, которое будет взаимодействовать с той же базой данных MySQL, что и существующее приложение C #. Я намерен зашифровать пароль и сравнить полученный хеш с тем, который хранится в базе данных для аутентификации.
Любые указатели будут наиболее цениться.
Edit:
Я понимаю, что в функции C # вызывается PasswordDeriveBytes
и передается байтовый массив в качестве аргумента, для которого у меня нет аналога в версии PHP. Я обнаружил, что это происходит из примера Codeproject и что массив байтов в ASCII записывает «Иван Медведев», которого я предполагаю в качестве автора примера. К сожалению, я не могу это изменить.