AesManaged-Entschlüsselung in Metro WinRT-Anwendung

Habe ich einige text, verschlüsselt mit C#'s AesManaged, die müssen entschlüsselt werden, die in einem WinRT-Metro-Anwendung. Ich kann nicht ändern der Verschlüsselungs-code, der code hat andere Abhängigkeiten, die nicht geändert werden.

Die Verschlüsselungs-Funktion sieht wie folgt aus:

//Note: Edited out possibly real password and salt:
Guid password = Guid.Parse("AAAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA");
Guid salt = Guid.Parse("AAAAAAAAA-BBBB-BBBB-BBBB-AAAAAAAAAAAA");

string EncryptedValue(string data)
{   
byte[] passwordBytes = password.ToByteArray();
byte[] saltBytes = salt.ToByteArray();

byte[] bKey = new byte[16];
for(int i = 0; i < 16; i++)
{
    bKey[i] = passwordBytes[i];
}

string encryptedData = String.Empty;
using (System.Security.Cryptography.AesManaged aesAlg = new System.Security.Cryptography.AesManaged())
{
    aesAlg.Key = bKey;
    aesAlg.IV = saltBytes;

    //Create a decrytor to perform the stream transform.
    System.Security.Cryptography.ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

    //Create the streams used for encryption.
    using (MemoryStream msEncrypt = new MemoryStream())
    {
        using (System.Security.Cryptography.CryptoStream csEncrypt = new System.Security.Cryptography.CryptoStream(msEncrypt, encryptor, System.Security.Cryptography.CryptoStreamMode.Write))
        {
            using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
            {

                //Write all data to the stream.
                swEncrypt.Write(data);
            }

            encryptedData = Convert.ToBase64String(msEncrypt.ToArray());
        }
    }
}

return encryptedData;
}

Beispiel Daten:

   //Decrypted value is: 2029
   var _id = EncryptedSettingsBase.Decrypt("ROSNJ1XnAozF7LC0wW8AOg==");

Las ich den folgenden Beitrag:
http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/7cfcc576-1c2c-4a50-a546-09a45d3ff41f
das sieht aus wie das gleiche Problem, allerdings habe ich noch nicht in der Lage, Ihre Anregung an die Arbeit, wie bekomme ich die exception: 'Data error (cyclic redundancy check). (Ausnahme von HRESULT: 0x80070017)'.

internal class EncryptedSettingsBase
{
    public static string Decrypt(string cipherText)
    {
        var passwordBytes = (new Guid("AAAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA")).ToByteArray();
        var salt = (new Guid("AAAAAAAAA-BBBB-AAAA-AAAA-AAAAAAAAAAAA")).ToString();

        byte[] bKey = new byte[16];
        for (int i = 0; i < 16; i++)
        {
            bKey[i] = passwordBytes[i];
        }

        IBuffer pwBuffer = CryptographicBuffer.CreateFromByteArray(bKey);
        IBuffer saltBuffer = CryptographicBuffer.ConvertStringToBinary(salt, BinaryStringEncoding.Utf16LE);
        IBuffer cipherBuffer = CryptographicBuffer.DecodeFromBase64String(cipherText);

        //Derive key material for password size 32 bytes for AES256 algorithm
        KeyDerivationAlgorithmProvider keyDerivationProvider = KeyDerivationAlgorithmProvider.OpenAlgorithm("PBKDF2_SHA1");
        //using salt and 1000 iterations
        KeyDerivationParameters pbkdf2Parms = KeyDerivationParameters.BuildForPbkdf2(saltBuffer, 1000);

        //create a key based on original key and derivation parmaters
        CryptographicKey keyOriginal = keyDerivationProvider.CreateKey(pwBuffer);
        IBuffer keyMaterial = CryptographicEngine.DeriveKeyMaterial(keyOriginal, pbkdf2Parms, 32);
        CryptographicKey derivedPwKey = keyDerivationProvider.CreateKey(pwBuffer);

        //derive buffer to be used for encryption salt from derived password key 
        IBuffer saltMaterial = CryptographicEngine.DeriveKeyMaterial(derivedPwKey, pbkdf2Parms, 16);

        //display the keys - because KeyDerivationProvider always gets cleared after each use, they are very similar unforunately
        string keyMaterialString = CryptographicBuffer.EncodeToBase64String(keyMaterial);
        string saltMaterialString = CryptographicBuffer.EncodeToBase64String(saltMaterial);

        SymmetricKeyAlgorithmProvider symProvider = SymmetricKeyAlgorithmProvider.OpenAlgorithm("AES_CBC_PKCS7");
        //create symmetric key from derived password material
        CryptographicKey symmKey = symProvider.CreateSymmetricKey(keyMaterial);

        //encrypt data buffer using symmetric key and derived salt material
        IBuffer resultBuffer = CryptographicEngine.Decrypt(symmKey, cipherBuffer, saltMaterial);
        string result = CryptographicBuffer.ConvertBinaryToString(BinaryStringEncoding.Utf16LE, resultBuffer);
        return result;
    }
}

Ich bin wohl etwas zu tun dumm, aber ich nicht ganz verstehen, dieses Zeug. Wer weiß, wo ich bin mache ich falsch?

Jede Hilfe wird sehr geschätzt.

Cheers,
Jon

  • Wenn das dein echtes Passwort und salt, posten Sie es in einem öffentlichen Ort ist nicht eine gute Idee...
  • Ich hatte ein ähnliches Problem vor einer Weile, wenn Sie versuchen, um ein paar JavaScript-AES-Algorithmus mit einem C# - AES-Algorithmus. Ich fand, dass Sie nicht alle implementiert die gleiche, so dass ich nie die Ergebnisse, die ich erwartet hatte!
  • Ich denke, dass für AES, Ihre wichtigsten Bedürfnisse zu 32 bytes, 16. Nicht sicher wenn das ist die Frage, aber ich weiß nicht, was es tun wird, wenn seine zu kurz.
  • Keine Sorge, ich habe Sie vor dem buchen 😉
  • AES unterstützt. AES-256 ist mit einem 32-byte-Schlüssel und AES-128 a 16-byte-Schlüssel.
  • Nur für die Zukunft: 1) Eine KDF ist wichtig für die Passwort-basierte Verschlüsselung 2) Eine Konstante ist nicht eine gute IV oder Salz. Sollten Sie einen neuen erstellen für jede Verschlüsselung.

InformationsquelleAutor Jon Rea | 2012-08-01
Schreibe einen Kommentar