在使用Laravel中的Crypt::Encrypt('secret')
时,我需要在C#中创建相同的结果。
我找到了这个帖子Rijndael 256 Encrypt/decrypt between c# and php?
它似乎是我需要的,但我在第三个参数,初始化矢量:(。
Laravel使用Rijndael AES加密数据。所有用户必须输入的是一个秘密密钥,在config文件夹中,它是完全随机的,长度为32个字符。
encyrption方法如下所示:
public function encrypt($value)
{
$iv = mcrypt_create_iv($this->getIvSize(), $this->getRandomizer());
$value = base64_encode($this->padAndMcrypt($value, $iv));
// Once we have the encrypted value we will go ahead base64_encode the input
// vector and create the MAC for the encrypted value so we can verify its
// authenticity. Then, we'll JSON encode the data in a "payload" array.
$mac = $this->hash($iv = base64_encode($iv), $value);
return base64_encode(json_encode(compact('iv', 'value', 'mac')));
}
可以在此处找到完整的Encryptor.php:http://pastebin.com/yfWLPxGn
有什么想法,我必须输入以获得相同的结果? :)
答案 0 :(得分:6)
初始化向量是一种通常是随机的输入。因此,算法总是使用相同的输入,密钥和不同的IV创建不同的值。如果您想使用PHP和C#代码生成相同的结果,则需要使用相同的IV值。
Laravel的encrypt()
不会仅返回加密值。值encrypt()
生成base64编码的字符串,其中包含iv,mac和加密值的json编码值。
所以您需要在C#encode()
方法中应用的步骤:
base64_encode()
加密值。我们将在后续步骤中使用此值。sha256
作为算法,创建MAC(消息认证码)。看看this one value
,mac
和iv
。像这样创建一个json字符串:
{
iv: iv value (base64 encoded),
value: encrypted value (base64 encoded),
mac: mac value created in 3rd step
}
base64编码你的这个json字符串。
答案 1 :(得分:0)
您可能不想应用填充而不应用任何特定的操作模式。有一种称为ECB的伪模式,它基本上将裸密码应用于许多块并且不应用填充。它需要使用完整的块。
如果您没有完整的加密块,则需要确定使用的填充模式。
如果这不起作用,那么你需要弄清楚使用什么模式和初始化向量。初始化向量通常作为每个消息不同的唯一值预先添加到消息中,作为防止对多个块应用的裸密码进行某些数学攻击的方法。