Преобразуйте расшифрованный код в PHP в C#
Мне нужно конвертировать код BlowFish Descrypt в PHP в C#.
Код PHP (X-Cart),
function mdecrypt($data, $key) {
$td = mcrypt_module_open(MCRYPT_BLOWFISH, '', MCRYPT_MODE_ECB, '');
$decrypted_data = mdecrypt_generic($td, func_hex2str($data));
return $decrypted_data;
}
#
# Convert hex to string
#
function func_hex2str($str) {
$ret = "";
$l = strlen($str);
for ($i = 0; $i < $l; $i += 2) {
$ret .= chr(hexdec(substr($str, $i, 2)));
}
echo $ret;
return $ret;
}
и я пытался,
BlowFish algo = new BlowFish("0cb12a77dbb5ee7128ad3aea6154614f");
string details = "138b5a7e2c0e453a";
int dLen = details.Length;
string ret = "";
for (int i = 0; i < dLen; i += 2)
{
ret += (char) Convert.ToInt64(details.Substring(i, 2), 16);
}
details = algo.Decrypt_ECB(ret);
Console.WriteLine(details);
но он печатает разные результаты между PHP и C#. (PHP: Привет, C#:??q???_^)
Кто-то дал мне подсказку, он сказал, что это может быть "Паддинг".
но все же я не понимаю.
Кто-нибудь знает, что я делаю не так? пожалуйста, посоветуй мне.
Благодарю.
1 ответ
Решение
BCrypt.Net - это реализация алгоритма шифрования Blowfish с открытым исходным кодом. Вы можете использовать этот исходный код, чтобы увидеть, как это делается, я предполагал.
Если вам это нужно только для работы и для начала работы, использовать BCrypt очень просто:
string salt = BCryptHelper.GenerateSalt(6);
var hashedPassword = BCryptHelper.HashPassword("password", salt);
Console.WriteLine(BCryptHelper.CheckPassword("password", hashedPassword));
Вы можете найти код соуса здесь:
/// <summary>Hash a password using the OpenBSD bcrypt scheme.</summary>
/// <exception cref="ArgumentException">Thrown when one or more arguments have unsupported or
/// illegal values.</exception>
/// <param name="input">The password to hash.</param>
/// <param name="salt"> the salt to hash with (perhaps generated using BCrypt.gensalt).</param>
/// <returns>The hashed password</returns>
public static string HashPassword(string input, string salt)
{
if (input == null)
throw new ArgumentNullException("input");
if (string.IsNullOrEmpty(salt))
throw new ArgumentException("Invalid salt", "salt");
// Determinthe starting offset and validate the salt
int startingOffset;
char minor = (char)0;
if (salt[0] != '$' || salt[1] != '2')
throw new SaltParseException("Invalid salt version");
if (salt[2] == '$')
startingOffset = 3;
else
{
minor = salt[2];
if (minor != 'a' || salt[3] != '$')
throw new SaltParseException("Invalid salt revision");
startingOffset = 4;
}
// Extract number of rounds
if (salt[startingOffset + 2] > '$')
throw new SaltParseException("Missing salt rounds");
// Extract details from salt
int logRounds = Convert.ToInt32(salt.Substring(startingOffset, 2));
string extractedSalt = salt.Substring(startingOffset + 3, 22);
byte[] inputBytes = Encoding.UTF8.GetBytes((input + (minor >= 'a' ? "\0" : "")));
byte[] saltBytes = DecodeBase64(extractedSalt, BCRYPT_SALT_LEN);
BCrypt bCrypt = new BCrypt();
byte[] hashed = bCrypt.CryptRaw(inputBytes, saltBytes, logRounds);
// Generate result string
StringBuilder result = new StringBuilder();
result.Append("$2");
if (minor >= 'a')
result.Append(minor);
result.AppendFormat("${0:00}$", logRounds);
result.Append(EncodeBase64(saltBytes, saltBytes.Length));
result.Append(EncodeBase64(hashed, (_BfCryptCiphertext.Length * 4) - 1));
return result.ToString();
}