【发布时间】:2016-12-05 18:20:03
【问题描述】:
我正在尝试将用 C# 编写的加密代码移植到 PHP。下面的代码使用Rijndael-128 加密。 PHP 代码给出的结果与 C# 代码略有不同。我受到不使用Salt 和随机IV 并且不更改C# 代码的限制。在浏览了有关此问题的许多关于 stackoverflow 的答案并对代码进行了一些更改后,代码仍然没有产生正确的结果。
C#代码(类的成员函数)
public static string Encrypt(string plainText, string passPhrase)
{
byte[] initVectorBytes = Encoding.UTF8.GetBytes(initVector);
byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
var password = new Rfc2898DeriveBytes(passPhrase, new byte[8], 10000);
byte [] keyBytes= password.GetBytes(keysize / 8); //256/8
var symmetricKey = new RijndaelManaged();
symmetricKey.Mode = CipherMode.CBC;
ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes);
var memoryStream = new MemoryStream();
var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write);
cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
cryptoStream.FlushFinalBlock();
byte[] cipherTextBytes = memoryStream.ToArray();
memoryStream.Close();
cryptoStream.Close();
return Convert.ToBase64String(cipherTextBytes);
}
PHP代码(类的成员函数)
public function encrypt(){
$plainText="Same_input_as_above";
$plainText=mb_convert_encoding($plainText,'UTF-8');
$passPhrase=mb_convert_encoding($this->secret,'UTF-8');
$salt=str_pad("",8,"\0");
$key= hash_pbkdf2 ( 'sha1' , $passPhrase, $salt , 10000 ,self::KEYSIZE/8, true);
$initVector=mb_convert_encoding(self::INITVECTOR,'UTF-8');
$tempCipher= mcrypt_encrypt (MCRYPT_RIJNDAEL_128 , $key , $plainText , MCRYPT_MODE_CBC,$initVector);
return base64_encode($tempCipher);
}
C# 输出
O/Fi4tfdS5APen6YAboRnr%2B2bSrHSG71OHhX7YZbbhJYr8mt3HxfYza4bjkV8gtq
PHP 输出
O/Fi4tfdS5APen6YAboRnr%2B2bSrHSG71OHhX7YZbbhIpdOLx9oscZnlAdyTMgeGX
C# 的解密功能与自己创建的密码一起工作正常,但在解码 PHP 生成的密码时会出现Padding is invalid and cannot be removed. 错误。
【问题讨论】:
-
@ArtjomB。谢谢。首先,我认为是在应用空填充盐后出现问题的空盐我忘记取消注释之后的纯文本填充行。
标签: c# php .net encryption