Frage

Ich möchte die Kryptographie im verwenden Portable Class Library Contrib-Projekt auf Codeplex Ich habe aber keine Dokumentation darüber gefunden, wie ich es verwenden kann.

Ich möchte eine Wrapper-Klasse mit erstellen Encrypt Und Decrypt Methoden darin enthalten und ich möchte, dass diese Wrapper-Klasse in einer portablen Klassenbibliothek existiert.Ich habe verwiesen Portable.Runtime Und Portable.Security.Cryptography In diesem Projekt.Ist das richtig?

Ich möchte meinen Wrapper dann in einem .NET-, Windows Phone- und Metro-Projekt verwenden.In diesen Projekten verweise ich auf mein Wrapper-Projekt, Portable.Runtime, Portable.Security.Cryptography und das entsprechende Portable-Projekt, d.h. Portable.Desktop, Portable.Phone oder Portable.WindowsStore.Ist das richtig?

Ich erhalte jedoch widersprüchliche Namespace-Fehler, wenn ich versuche, meine Wrapper-Klasse zu verwenden.Dies ist der Fehler und meine Wrapper-Klasse:

Der Typ System.Security.Cryptography.AesManaged existiert in beiden C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Profile\Client\System.Core.dll Und C:\Downloads\PclContrib\bin\Debug\Portable.Security.Cryptography.dll

public sealed class SymmetricCryptography<T> where T : SymmetricAlgorithm, new()
{
    private readonly T provider = new T();
    private readonly UTF8Encoding utf8 = new UTF8Encoding();

    private byte[] key;
    private byte[] iv;

    public byte[] Key
    {
        get { return this.key; }
    }

    public byte[] IV
    {
        get { return this.iv; }
    }

    public SymmetricCryptography()
    {
        this.key = this.provider.Key;
        this.iv = this.provider.IV;
    }

    public SymmetricCryptography(byte[] key, byte[] iv)
    {
        this.key = key;
        this.iv = iv;
    }

    public SymmetricCryptography(string password, string salt)
    {
        Rfc2898DeriveBytes deriveBytes = new Rfc2898DeriveBytes(password, this.utf8.GetBytes(salt));
        this.key = deriveBytes.GetBytes(this.provider.KeySize >> 3);
        this.iv = deriveBytes.GetBytes(16);
    }

    public SymmetricCryptography(string password, string salt, int iterations)
    {
        Rfc2898DeriveBytes deriveBytes = new Rfc2898DeriveBytes(password, this.utf8.GetBytes(salt), iterations);
        this.key = deriveBytes.GetBytes(this.provider.KeySize >> 3);
        this.iv = deriveBytes.GetBytes(16);
    }

    public byte[] Encrypt(byte[] input)
    {
        return this.Encrypt(input, this.key, this.iv);
    }

    public byte[] Encrypt(byte[] input, byte[] key, byte[] iv)
    {
        return this.Transform(
            input,
            this.provider.CreateEncryptor(key, iv));
    }

    public byte[] Decrypt(byte[] input)
    {
        return this.Decrypt(input, this.key, this.iv);
    }

    public byte[] Decrypt(byte[] input, byte[] key, byte[] iv)
    {
        return this.Transform(
            input,
            this.provider.CreateDecryptor(key, iv));
    }

    public string Encrypt(string text)
    {
        return this.Encrypt(text, this.key, this.iv);
    }

    public string Encrypt(string text, byte[] key, byte[] iv)
    {
        byte[] output = this.Transform(
            this.utf8.GetBytes(text),
            this.provider.CreateEncryptor(key, iv));
        return Convert.ToBase64String(output);
    }

    public string Decrypt(string text)
    {
        return this.Decrypt(text, this.key, this.iv);
    }

    public string Decrypt(string text, byte[] key, byte[] iv)
    {
        byte[] output = this.Transform(
            Convert.FromBase64String(text),
            this.provider.CreateDecryptor(key, iv));
        return this.utf8.GetString(output, 0, output.Length);
    }

    public void Encrypt(Stream input, Stream output)
    {
        this.Encrypt(input, output, this.key, this.iv);
    }

    public void Encrypt(Stream input, Stream output, byte[] key, byte[] iv)
    {
        this.TransformStream(true, ref input, ref output, key, iv);
    }

    public void Decrypt(Stream input, Stream output)
    {
        this.Decrypt(input, output, this.key, this.iv);
    }

    public void Decrypt(Stream input, Stream output, byte[] key, byte[] iv)
    {
        this.TransformStream(false, ref input, ref output, key, iv);
    }

    private byte[] Transform(
        byte[] input,
        ICryptoTransform cryptoTransform)
    {
        byte[] result;

        using (MemoryStream memoryStream = new MemoryStream())
        {
            using (CryptoStream cryptStream = new CryptoStream(
                memoryStream,
                cryptoTransform,
                CryptoStreamMode.Write))
            {
                cryptStream.Write(input, 0, input.Length);
                cryptStream.FlushFinalBlock();
                memoryStream.Position = 0;
                result = memoryStream.ToArray();
            }
        }

        return result;
    }

    private void TransformStream(bool encrypt, ref Stream input, ref Stream output, byte[] key, byte[] iv)
    {
        // defensive argument checking
        if (input == null)
        {
            throw new ArgumentNullException("input");
        }

        if (output == null)
        {
            throw new ArgumentNullException("output");
        }

        if (!input.CanRead)
        {
            throw new ArgumentException("Unable to read from the input Stream.", "input");
        }

        if (!output.CanWrite)
        {
            throw new ArgumentException("Unable to write to the output Stream.", "output");
        }

        // make the buffer just large enough for 
        // the portion of the stream to be processed
        byte[] inputBuffer = new byte[input.Length - input.Position];
        // read the stream into the buffer
        input.Read(inputBuffer, 0, inputBuffer.Length);
        // transform the buffer
        byte[] outputBuffer = encrypt ? Encrypt(inputBuffer, key, iv)
                                        : Decrypt(inputBuffer, key, iv);
        // write the transformed buffer to our output stream 
        output.Write(outputBuffer, 0, outputBuffer.Length);
    }
}
War es hilfreich?

Lösung 3

Es stellte sich heraus, dass mein generischer Wrapper für die Kryptographiealgorithmen ein Problem verursachte.PCL Contrib enthält eine Klasse namens SymmetricAlgorithm, die selbst ein Wrapper für den echten SymmetricAlgorithm ist.Wenn ich meine Wrapper-Klasse nicht generisch mache, funktioniert es so:

public sealed class AesManagedSymmetricCryptography : SymmetricCryptography<AesManaged>
{
    #region Constructors

    public AesManagedSymmetricCryptography()
    {
    }

    public AesManagedSymmetricCryptography(byte[] key, byte[] iv)
        : base(key, iv)
    {
    }

    public AesManagedSymmetricCryptography(string password, string salt)
        : base(password, salt)
    {
    }

    public AesManagedSymmetricCryptography(string password, string salt, int iterations)
        : base(password, salt, iterations)
    {
    }

    #endregion
}

Andere Tipps

Die Dokumente fehlen ein wenig, aber ich weise darauf hin FAQ:

Kann ich die Typen von PclContrib mit meinen plattformspezifischen Projekten teilen? Nein, derzeit nicht.Während die Typen in Pcontrib wie ihre plattformspezifischen Gegenstücke aussehen und sich anfühlen, sehen die Laufzeit und der Compiler sie als völlig unterschiedliche Typen.Während wir einige Ideen haben, wie wir diese Arbeit machen können, ist dies eine Funktion, die wir kurzfristig nicht sehen werden.

Der folgende .net-Code funktioniert bei der Desktop-Implementierung.Fügen Sie zunächst Verweise auf Portable.Desktop und Portable.Security.Cryptography.ProtectedData hinzu

   private void button2_Click(object sender, EventArgs e)
    {
        String encrypted = PCL.CentralClass.Encrypt("yo");
        String decreypted = PCL.CentralClass.Decrypt(encrypted);
        //PCL.CentralClass.
    }
    //https://pclcontrib.codeplex.com/documentation?FocusElement=Comment
    //\Source\Portable.Security.Cryptography.ProtectedData\Security\Cryptography\ProtectedData.cs

    static byte[] GetBytes(string str)
    {
        byte[] bytes = new byte[str.Length * sizeof(char)];
        System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
        return bytes;
    }

    static string GetString(byte[] bytes)
    {
        char[] chars = new char[bytes.Length / sizeof(char)];
        System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
        return new string(chars);
    }

    public static String Encrypt(String strEncrypt)
    {
        byte[] userData = GetBytes(strEncrypt);
        byte[] optionalEntropy = null;
        byte[] x = System.Security.Cryptography.ProtectedData.Protect(userData, optionalEntropy);
        return GetString(x);
    }
    public static String Decrypt(String strDecrypt)
    {
        byte[] encryptedData = GetBytes(strDecrypt);
        byte[] optionalEntropy = null;
        byte[] x = System.Security.Cryptography.ProtectedData.Unprotect(encryptedData, optionalEntropy);
        return GetString(x); ;
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top