将C#代码转换为php进行加密和解密
将C#代码转换为php进行加密和解密,c#,php,encryption,C#,Php,Encryption,我试图将这段代码转换为php,但我不能,而且总是在C#和php中得到不同的结果 这是我加密和解密的C#代码: private static readonly byte[] initVectorBytes = Encoding.ASCII.GetBytes("1234567812345678"); private const int keysize = 256; private string pass = "sample"; public static string Encrypt(string
我试图将这段代码转换为php,但我不能,而且总是在C#和php中得到不同的结果 这是我加密和解密的C#代码:
private static readonly byte[] initVectorBytes = Encoding.ASCII.GetBytes("1234567812345678");
private const int keysize = 256;
private string pass = "sample";
public static string Encrypt(string plainText, string passPhrase)
{
byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, null);
byte[] keyBytes = password.GetBytes(keysize / 8);
RijndaelManaged symmetricKey = new RijndaelManaged();
symmetricKey.Mode = CipherMode.CBC;
ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes);
MemoryStream memoryStream = new MemoryStream();
CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write);
cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
cryptoStream.FlushFinalBlock();
byte[] cipherTextBytes = memoryStream.ToArray();
return Convert.ToBase64String(cipherTextBytes);
}
public static string Decrypt(string cipherText, string passPhrase)
{
byte[] cipherTextBytes = Convert.FromBase64String(cipherText);
PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, null);
byte[] keyBytes = password.GetBytes(keysize / 8);
RijndaelManaged symmetricKey = new RijndaelManaged();
symmetricKey.Mode = CipherMode.CBC;
ICryptoTransform decryptor = symmetricKey.CreateDecryptor(keyBytes, initVectorBytes);
MemoryStream memoryStream = new MemoryStream(cipherTextBytes);
CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read);
byte[] plainTextBytes = new byte[cipherTextBytes.Length];
int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount);
}
这是我的php代码:
$iv = "1234567812345678";
$out = null;
$key = "sample";
foreach ($iv as $i) { $out .= chr(ord(substr($i,0,1))); }
$res = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $string, MCRYPT_MODE_CBC, implode($out));
您的PHP代码不会在PHP5.6上运行,因为密钥大小错误,它必须是32字节 说的是,在以前的版本中,PHP用\0填充密钥以达到正确的密钥长度,但在C#中,您创建的是派生字节(实际上是正确的)以获得足够的密钥字节,这些字节以C#和PHP上使用的不同密钥结束 作为证明,在PHP和C#中,创建一个包含32个字节(32个字符)的密钥,并直接使用这32个字节作为密钥,这样它就可以工作了
但最后,您需要一种在PHP和C上导出字节的通用方法。要最终获得一致的键控代码,可以使用SHA-256哈希生成键。您的PHP代码不会在PHP5.6上运行,因为键大小错误,它必须是32字节 说的是,在以前的版本中,PHP用\0填充密钥以达到正确的密钥长度,但在C#中,您创建的是派生字节(实际上是正确的)以获得足够的密钥字节,这些字节以C#和PHP上使用的不同密钥结束 作为证明,在PHP和C#中,创建一个包含32个字节(32个字符)的密钥,并直接使用这32个字节作为密钥,这样它就可以工作了 但最后,您需要一种在PHP和C#上导出字节的通用方法,为了最终获得一致的键控代码,可以使用SHA-256哈希生成键
PasswordDeriveBytes
扩展密钥,这是一种很好的方法。PHP mcrypt正在使用null扩展它们的键。您需要扩展(256位)密钥相同PasswordDeriveBytes
扩展密钥,这是一种很好的方法。PHP mcrypt正在使用null扩展它们的键。您需要扩展(256位)密钥相同谢谢你的信息和帮助,但是经过我的尝试到现在我不能得到正确的结果,你能给我样本代码吗?你有可能吗?我没有可用的C#,但是应该有很多这样的例子。谢谢你的信息和帮助,但是在我尝试到现在为止,我无法得到正确的结果。你能给我示例代码吗?你有可能吗?我没有可用的C#,但应该有很多这样的例子。请注意,mcrypt是弃置软件,多年来没有更新过,最好不要使用它。不要使用固定的IV。每次加密都应该随机选择它,以便实现语义安全。它不必是秘密的,所以你可以把它和密文一起发送。一种常见的方法是将其预先添加到密文中。请注意,mcrypt是弃置软件,多年未更新,最好不要使用它。不要使用固定的IV。每次加密都应随机选择它,以便实现语义安全。它不必是秘密的,所以你可以把它和密文一起发送。一种常见的方法是在密文前加上前缀。