将Laravel的AES 256加密器转换为C#

时间:2014-01-28 19:01:43

标签: c# php encryption laravel

在使用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

有什么想法,我必须输入以获得相同的结果? :)

2 个答案:

答案 0 :(得分:6)

初始化向量是一种通常是随机的输入。因此,算法总是使用相同的输入,密钥和不同的IV创建不同的值。如果您想使用PHP和C#代码生成相同的结果,则需要使用相同的IV值。

Laravel的encrypt()不会仅返回加密值。值encrypt()生成base64编码的字符串,其中包含iv,mac和加密值的json编码值。

所以您需要在C#encode()方法中应用的步骤:

  1. 使用您提供的link中的代码对字符串进行编码。
  2. base64_encode()加密值。我们将在后续步骤中使用此值。
  3. 使用base64_encoded IV作为值,加密值作为密钥,sha256作为算法,创建MAC(消息认证码)。看看this one
  4. 现在我们已加密valuemaciv
  5. 像这样创建一个json字符串:

    { 
        iv: iv value (base64 encoded),
        value: encrypted value (base64 encoded), 
        mac: mac value created in 3rd step 
    }
    
  6. base64编码你的这个json字符串。

  7. 你们都准备好了。

答案 1 :(得分:0)

您可能不想应用填充而不应用任何特定的操作模式。有一种称为ECB的伪模式,它基本上将裸密码应用于许多块并且不应用填充。它需要使用完整的块。

如果您没有完整的加密块,则需要确定使用的填充模式。

如果这不起作用,那么你需要弄清楚使用什么模式和初始化向量。初始化向量通常作为每个消息不同的唯一值预先添加到消息中,作为防止对多个块应用的裸密码进行某些数学攻击的方法。