2014-01-28 139 views
1

我需要在C#中使用Laravel的Crypt::Encrypt('secret')時創建相同的結果。 我發現這個線程Rijndael 256 Encrypt/decrypt between c# and php? ,它似乎是我所需要的,但我有一些麻煩的第三個參數,初始化向量:(。將Laravel的AES 256加密器轉換爲C#

使用Rijndael算法AES加密數據

Laravel所有用戶必須輸入一個密鑰,在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

任何想法,我將不得不輸入以獲得相同的結果? :)

回答

6

初始化矢量是通常是隨機的輸入。所以,算法總是使用相同的輸入,鍵和不同的IV創建不同的值。如果您希望使用PHP和C#代碼生成相同的結果,則需要使用相同的IV值。

Laravel的encrypt()只返回加密值。值encrypt()生成一個base64編碼的字符串,該字符串具有json編碼的iv,mac和加密值。

所以你需要的步驟,在你的C#應用​​encode()方法:

  1. 編碼在link你給使用的代碼串。
  2. base64_encode()加密值。我們將在後面的步驟中使用這個值。
  3. 使用base64_encoded IV作爲值,作爲密鑰的加密值和作爲算法的sha256,創建MAC(消息認證碼)。看看this one
  4. 現在我們已經加密value,maciv
  5. 這樣創建一個JSON字符串:

    { 
        iv: iv value (base64 encoded), 
        value: encrypted value (base64 encoded), 
        mac: mac value created in 3rd step 
    } 
    
  6. Base64編碼,您的這個JSON字符串。

  7. 你一切就緒。
0

你會想不應用填充和不應用任何特定的操作模式。有一種稱爲ECB的僞模式,它基本上將裸密碼應用於多個塊並且不應用填充。它需要使用完整的塊。

如果你沒有一個完整的塊來加密,你需要弄清楚使用什麼填充模式。

如果這不起作用,那麼你需要弄清楚什麼樣的模式和什麼初始化向量被使用。初始化向量通常作爲每條消息不同的唯一值添加到消息中,作爲防止對許多塊應用裸露密碼的數學攻擊的一種方式。

+0

函數「addPadding($ padding)」,應該是填充,對吧? – Jazerix

+0

@Jazerix看起來像。 –