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

Jaz*_*rix 1 php c# encryption laravel

在使用Crypt::Encrypt('secret')Laravel时,我需要在C#中创建相同的结果.我发现这个线程Rijndael 256在c#和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')));
    }
Run Code Online (Sandbox Code Playgroud)

完整的Encryptor.php可以在这里找到:http://pastebin.com/yfWLPxGn

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

Can*_*liş 6

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

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

因此,您需要在C#encode()方法中应用的步骤:

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

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

  7. 你们都准备好了.