2015-11-16 6 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.phpbrauchen Sie Hilfe Konvertieren Laravel Crypt zu C#

ich den Code oben verwenden, es funktioniert, wenn ich etwas von Laravel entschlüsseln. Problem ist, wenn ich eine Zeichenkette von C# verschlüssle, kann ich es in PHP nicht entschlüsseln.

manchmal gibt es "Werte" nach dem entschlüsselten Text. Verschlüsselung der Ausgabe und Entschlüsselung in PHP funktioniert.

C# screenshot

Antwort

2

die Polsterung zu PaddingMode.PKCS7 Werke zu ändern! falls andere Leute diesen noch benötigen, wird der vollständige Code unten veröffentlicht.

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

Denken Sie daran, Laravel tut HMAC Validierung in [ 'BaseEncrypter :: getJSONpayload()'] (https://github.com/laravel/framework/blob/c9a031f81b79ee8342200b3b2f0d34c5290705ae/src/Illuminate/Encryption/Base Encrypter.php # L37- L53) –

0

Seit Laravel verwendet base64: im APP_KEY, der Code die Laravel Verschlüsselung in C zu erreichen # etwas geändert hat:

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))); 
    } 

mit $ key die APP_KEY ohne die "base64:" -Teil und

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

für die Serialisierung (nur für Strings, aber es gibt komplette Bibliotheken, dies zu erreichen)

Und schließlich die ByteToString Funktion:

private string ByteToString(byte[] buff) 
    { 
     string sbinary = ""; 
     for (int i = 0; i < buff.Length; i++) 
      sbinary += buff[i].ToString("x2"); /* hex format */ 
     return sbinary; 
    } 
Verwandte Themen