2017-07-28 74 views
-1

我想知道如何在C#中正確加密,Laravel(PHP)可以用它的加密解密?如何在與Laravel的加密兼容的C#中進行加密?

這是我的C#加密:

private static readonly Encoding encoding = Encoding.UTF8; 

    public static void Main(string[] args) 
    { 
     string key = "ysWZKXsnB1aS38Qzj5cza01wd3wT1234"; 
     string text = "Here is some data to encrypt!"; 

     string encrypted = encrypt(text, key); 

     // Display the original data and the encrypted data. 
     Console.WriteLine("Original: {0}", text); 
     Console.WriteLine("Key: {0}", key); 
     Console.WriteLine("Encrypted: {0}", encrypted); 
    } 

    private static string encrypt(string plainText, string key) 
    { 
     RijndaelManaged aes = new RijndaelManaged(); 
     aes.KeySize = 256; 
     aes.BlockSize = 128; 
     aes.Padding = PaddingMode.PKCS7; 
     aes.Mode = CipherMode.CBC; 

     aes.Key = encoding.GetBytes(key); 
     aes.GenerateIV(); 

     ICryptoTransform AESEncrypt = aes.CreateEncryptor(aes.Key, aes.IV); 
     byte[] buffer = Encoding.ASCII.GetBytes(phpSerialize(plainText)); 

     String encryptedText = Convert.ToBase64String(Encoding.Default.GetBytes(Encoding.Default.GetString(AESEncrypt.TransformFinalBlock(buffer, 0, buffer.Length)))); 


     String mac = ""; 

     mac = BitConverter.ToString(hmacSHA256(Convert.ToBase64String(aes.IV) + encryptedText, key)).Replace("-", "").ToLower(); 

     var keyValues = new Dictionary<string, object> 
     { 
      { "iv", Convert.ToBase64String(aes.IV) }, 
      { "value", encryptedText }, 
      { "mac", mac }, 
     }; 

     JavaScriptSerializer serializer = new JavaScriptSerializer(); 
     return Convert.ToBase64String(Encoding.ASCII.GetBytes(serializer.Serialize(keyValues))); 
    } 

代碼成功加密,BU Laravel返回 「無法解密數據。」當試圖在這裏解密代碼輸出時。

+0

[如何解密AES-256-CBC加密字符串](https://stackoverflow.com/questions/20297973/how-to-decrypt-an-aes-256-cbc-encrypted-string) –

+0

這個問題和答案對你來說足夠嗎?因爲在Laravel文檔中指定它使用該加密。 –

+0

共享鏈接用於解密來自Laravel的加密字符串。我想知道的是如何以適當的方式通過C#加密,以便Laravel也可以解密它。 – doncadavona

回答

0

這裏有一個gist代碼我寫的解決了這個問題:

using System; 
using System.Text; 
using System.Security.Cryptography; 
using System.Web.Script.Serialization; 
using System.Collections.Generic; 

namespace Aes256CbcEncrypterApp 
{ 
    class MainClass 
    { 
     public static void Main(string[] args) 
     { 
      Console.WriteLine("Hello, world!"); 

      // The sample encryption key. Must be 32 characters. 
      string Key = "8UHjPgXZzXCGkhxV2QCnooyJexUzvJrO"; 

      // The sample text to encrypt and decrypt. 
      string Text = "Here is some text to encrypt!"; 

      // Encrypt and decrypt the sample text via the Aes256CbcEncrypter class. 
      string Encrypted = Aes256CbcEncrypter.Encrypt(Text, Key); 
      string Decrypted = Aes256CbcEncrypter.Decrypt(Encrypted, Key); 

      // Show the encrypted and decrypted data and the key used. 
      Console.WriteLine("Original: {0}", Text); 
      Console.WriteLine("Key: {0}", Key); 
      Console.WriteLine("Encrypted: {0}", Encrypted); 
      Console.WriteLine("Decrypted: {0}", Decrypted); 
     } 
    } 

    /** 
    * A class to encrypt and decrypt strings using the cipher AES-256-CBC used in Laravel. 
    */ 
    class Aes256CbcEncrypter 
    { 
     private static readonly Encoding encoding = Encoding.UTF8; 

     public static string Encrypt(string plainText, string key) 
     { 
      try 
      { 
       RijndaelManaged aes = new RijndaelManaged(); 
       aes.KeySize = 256; 
       aes.BlockSize = 128; 
       aes.Padding = PaddingMode.PKCS7; 
       aes.Mode = CipherMode.CBC; 

       aes.Key = encoding.GetBytes(key); 
       aes.GenerateIV(); 

       ICryptoTransform AESEncrypt = aes.CreateEncryptor(aes.Key, aes.IV); 
       byte[] buffer = encoding.GetBytes(plainText); 

       string encryptedText = Convert.ToBase64String(AESEncrypt.TransformFinalBlock(buffer, 0, buffer.Length)); 

       String mac = ""; 

       mac = BitConverter.ToString(HmacSHA256(Convert.ToBase64String(aes.IV) + encryptedText, key)).Replace("-", "").ToLower(); 

       var keyValues = new Dictionary<string, object> 
       { 
        { "iv", Convert.ToBase64String(aes.IV) }, 
        { "value", encryptedText }, 
        { "mac", mac }, 
       }; 

       JavaScriptSerializer serializer = new JavaScriptSerializer(); 

       return Convert.ToBase64String(encoding.GetBytes(serializer.Serialize(keyValues))); 
      } 
      catch (Exception e) 
      { 
       throw new Exception("Error encrypting: " + e.Message); 
      } 
     } 

     public static string Decrypt(string plainText, string key) 
     { 
      try 
      { 
       RijndaelManaged aes = new RijndaelManaged(); 
       aes.KeySize = 256; 
       aes.BlockSize = 128; 
       aes.Padding = PaddingMode.PKCS7; 
       aes.Mode = CipherMode.CBC; 
       aes.Key = encoding.GetBytes(key); 

       // Base 64 decode 
       byte[] base64Decoded = Convert.FromBase64String(plainText); 
       string base64DecodedStr = encoding.GetString(base64Decoded); 

       // JSON Decode base64Str 
       JavaScriptSerializer serializer = new JavaScriptSerializer(); 
       var payload = serializer.Deserialize<Dictionary<string, string>>(base64DecodedStr); 

       aes.IV = Convert.FromBase64String(payload["iv"]); 

       ICryptoTransform AESDecrypt = aes.CreateDecryptor(aes.Key, aes.IV); 
       byte[] buffer = Convert.FromBase64String(payload["value"]); 

       return encoding.GetString(AESDecrypt.TransformFinalBlock(buffer, 0, buffer.Length)); 
      } 
      catch (Exception e) 
      { 
       throw new Exception("Error decrypting: " + e.Message); 
      } 
     } 

     static byte[] HmacSHA256(String data, String key) 
     { 
      using (HMACSHA256 hmac = new HMACSHA256(encoding.GetBytes(key))) 
      { 
       return hmac.ComputeHash(encoding.GetBytes(data)); 
      } 
     } 
    } 
} 

程序將加密使用AES-256-CBC給定文本:

Hello, world! 
Original: Here is some text to encrypt! 
Key: 8UHjPgXZzXCGkhxV2QCnooyJexUzvJrO 
Encrypted: eyJpdiI6IkNYVzRsZGprT05YemI0UmhZK0x4RFE9PSIsInZhbHVlIjoidGZieHpiV2hTbVVJKzhNZTd6aDk2WlVIbE1JUmdSYjBKMzh0VTR5dVhkWT0iLCJtYWMiOiIzMzBjYzcyOTg4Zjk1YjFlYWI4ZGY2ZTUyMjllOTkxNDExNzRjM2Q2YmIxOWI2NDk2Y2I1NGEzMDBiN2E3YmNlIn0= 
Decrypted: Here is some text to encrypt! 

我希望這可以幫助其他人說可能需要在C#中實現與Laravel完全兼容的AES-256-CBC加密。

相關問題