2015-11-16 35 views
7
public static string Encrypt(this string plainText) 
{ 
    RijndaelManaged aes = new RijndaelManaged(); 
    aes.KeySize = 256; 
    aes.BlockSize = 128; 
    aes.Padding = PaddingMode.Zeros; 
    aes.Mode = CipherMode.CBC; 

    aes.Key = Encoding.Default.GetBytes(key); 
    aes.GenerateIV(); 

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

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

    String mac = ""; 
    using (var hmacsha256 = new HMACSHA256(Encoding.Default.GetBytes(key))) 
    { 
     hmacsha256.ComputeHash(Encoding.Default.GetBytes(Convert.ToBase64String(aes.IV) + encryptedText)); 

     mac = ByteArrToString(hmacsha256.Hash); 
    } 

    var keyValues = new Dictionary<string, object> 
    { 
     { "iv", Convert.ToBase64String(aes.IV) }, 
     { "value", encryptedText }, 
     { "mac", mac }, 
    }; 
    JavaScriptSerializer serializer = new JavaScriptSerializer(); 
    //return serializer.Serialize(keyValues); 
    return Convert.ToBase64String(Encoding.ASCII.GetBytes(serializer.Serialize(keyValues))); 
} 



public static string Decrypt(this string cipherText) 
{ 
    RijndaelManaged aes = new RijndaelManaged(); 
    aes.KeySize = 256; 
    aes.BlockSize = 128; 
    aes.Padding = PaddingMode.Zeros; 
    aes.Mode = CipherMode.CBC; 

    aes.Key = Encoding.Default.GetBytes(key); 

    dynamic payload = GetJsonPayload(cipherText); 

    //return Encoding.Default.GetString(Convert.FromBase64String(cipherText)); 

    //cipherText = Convert.ToBase64String(Encoding.Default.GetBytes(payload["value"])); 
    aes.IV = Convert.FromBase64String(payload["iv"]); 

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

    return (Encoding.Default.GetString(AESDecrypt.TransformFinalBlock(buffer, 0, buffer.Length))).ToString(); 
} 

https://github.com/laravel/framework/blob/5.1/src/Illuminate/Encryption/Encrypter.phpCần giúp đỡ chuyển đổi laravel Crypt C#

tôi đang sử dụng đoạn mã trên, nó hoạt động khi tôi giải mã bất cứ điều gì từ Laravel. vấn đề là khi tôi mã hóa một chuỗi từ C#, tôi không thể giải mã nó trong php.

đôi khi có "giá trị" sau văn bản được giải mã. mã hóa đầu ra và giải mã nó trong các tác phẩm php.

C# screenshot

Trả lời

2

thay đổi đệm để PaddingMode.PKCS7 công trình! trong trường hợp người khác vẫn cần mã này, mã đầy đủ được đăng bên dưới.

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

    aes.Key = Encoding.Default.GetBytes(key); 
    aes.GenerateIV(); 

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

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

    String mac = ""; 
    using (var hmacsha256 = new HMACSHA256(Encoding.Default.GetBytes(key))) 
    { 
     hmacsha256.ComputeHash(Encoding.Default.GetBytes(Convert.ToBase64String(aes.IV) + encryptedText)); 

     mac = ByteArrToString(hmacsha256.Hash); 
    } 

    var keyValues = new Dictionary<string, object> 
    { 
     { "iv", Convert.ToBase64String(aes.IV) }, 
     { "value", encryptedText }, 
     { "mac", mac }, 
    }; 
    JavaScriptSerializer serializer = new JavaScriptSerializer(); 
    //return serializer.Serialize(keyValues); 
    return Convert.ToBase64String(Encoding.ASCII.GetBytes(serializer.Serialize(keyValues))); 
} 



public static string Decrypt(this string cipherText) 
{ 
    RijndaelManaged aes = new RijndaelManaged(); 
    aes.KeySize = 256; 
    aes.BlockSize = 128; 
    aes.Padding = PaddingMode.PKCS7; 
    aes.Mode = CipherMode.CBC; 

    aes.Key = Encoding.Default.GetBytes(key); 

    dynamic payload = GetJsonPayload(cipherText); 

    //return Encoding.Default.GetString(Convert.FromBase64String(cipherText)); 

    //cipherText = Convert.ToBase64String(Encoding.Default.GetBytes(payload["value"])); 
    aes.IV = Convert.FromBase64String(payload["iv"]); 

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

    return (Encoding.Default.GetString(AESDecrypt.TransformFinalBlock(buffer, 0, buffer.Length))).ToString(); 
} 
+0

Hãy ghi nhớ, Laravel không xác nhận HMAC trong [ 'BaseEncrypter :: getJSONpayload()'] (https://github.com/laravel/framework/blob/c9a031f81b79ee8342200b3b2f0d34c5290705ae/src /Illuminate/Encryption/BaseEncrypter.php#L37-L53) –

0

Kể từ Laravel sử dụng base64: trong APP_KEY, mã để đạt được mã hóa laravel trong C# đã hơi thay đổi:

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

     aes.Key = Convert.FromBase64String(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 = ""; 
     using (var hmacsha256 = new HMACSHA256(Convert.FromBase64String(key))) 
     { 
      hmacsha256.ComputeHash(Encoding.Default.GetBytes(Convert.ToBase64String(aes.IV) + encryptedText)); 

      mac = ByteToString(hmacsha256.Hash); 
     } 

     var keyValues = new Dictionary<string, object> 
     { 
      { "iv", Convert.ToBase64String(aes.IV) }, 
      { "value", encryptedText }, 
      { "mac", mac }, 
     }; 
     JavaScriptSerializer serializer = new JavaScriptSerializer(); 
     //return serializer.Serialize(keyValues); 
     return Convert.ToBase64String(Encoding.ASCII.GetBytes(serializer.Serialize(keyValues))); 
    } 

với $ key các APP_KEY mà không có sự "base64:" phần và

private string phpSerialize(String value) 
    { 
     return "s:" + value.Length + ":" + "\"" + value + "\";"; 
    } 

cho serialization (chỉ dành cho các chuỗi, nhưng có hoàn thư viện để đạt được điều này)

Và cuối cùng là chức năng ByteToString:

private string ByteToString(byte[] buff) 
    { 
     string sbinary = ""; 
     for (int i = 0; i < buff.Length; i++) 
      sbinary += buff[i].ToString("x2"); /* hex format */ 
     return sbinary; 
    } 
Các vấn đề liên quan