我正在尝试将创建加密密钥的以下代码转换为 c# 结果我需要$key ** 和 ** $iv$passphrase = 'asdfghjkl';$salt = '123456789' // for test purposes I fixed the value but it should be openssl_random_pseudo_bytes(8); $salted = ''; $dx = ''; while (strlen($salted) < 48) { $dx = md5($dx . $passphrase . $salt, true); $salted .= $dx; } $key = substr($salted, 0, 32); $iv = substr($salted, 32, 16);到目前为止我能做什么string passphrase = "asdfghjkl";string salt = "123456789";string key, iv;byte[] salted = new byte[0];byte[] dx = new byte[0];while (salted.Length < 48) { string a = passphrase + salt; byte[] b = Encoding.UTF8.GetBytes(a); byte[] rv = new byte[dx.Length + b.Length]; System.Buffer.BlockCopy(dx, 0, rv, 0, dx.Length); System.Buffer.BlockCopy(b, 0, rv, dx.Length, b.Length); //dx = MD5CryptoServiceProvider.Create().ComputeHash(rv); using (MD5 md5 = MD5.Create()) { dx = md5.ComputeHash(rv); } byte[] rx = new byte[salted.Length + dx.Length]; System.Buffer.BlockCopy(salted, 0, rx, 0, salted.Length); System.Buffer.BlockCopy(dx, 0, rx, salted.Length, dx.Length); salted = rx; }string utfString1 = Encoding.UTF8.GetString(salted);key = utfString1.Substring( 0, 32);iv = utfString1.Substring(32, 16);但我没有得到相同的结果
1 回答
慕雪6442864
TA贡献1812条经验 获得超5个赞
被调用的 PHPmd5
函数将以原始二进制格式(16 字节)返回 md5 哈希值。
这是 .NET 中的等效项。
...
var passphrase = Encoding.UTF8.GetBytes("asdfghjkl");
var salt = Encoding.UTF8.GetBytes("123456789");
var salted = new List<byte>();
var dx = new byte[0];
using (var md5 = MD5.Create())
{
do
{
var bytesToHash = dx.Concat(passphrase).Concat(salt);
dx = md5.ComputeHash(bytesToHash.ToArray());
salted.AddRange(dx);
} while (salted.Count < 48);
}
var key = salted.Take(32).ToArray();
var iv = salted.Skip(32).Take(16).ToArray();
...
如果要检查输出,请使用 PHP base64_encode函数和 .NET Convert.ToBase64String,然后比较 base64 字符串。
- 1 回答
- 0 关注
- 94 浏览
添加回答
举报
0/150
提交
取消