Как я использую обертку OpenSSL.Net C# для шифрования строки с AES?

Я пытаюсь отправить некоторые зашифрованные данные от своего сайта SharePoint до сайта PeopleSoft моей компании. Люди PeopleSoft настаивают, чтобы я пользовался библиотекой OpenSSL для своего шифрования. Я загрузил и установил проект OpenSSL.Net из SourceForge.

В моих целях я должен просто зашифровать строку с AES. Я знаю, как сделать это с Системой. Безопасность. Библиотека Cryptography, но очень переношу трудности переводить это в сторону OpenSSL.Net. Очень печальный, так как я вижу все, что я думаю, что мне нужно в Intellisense!

У кого-либо есть пример работающего строкового шифрования/дешифрования с AES с помощью обертки OpenSSL.Net?

Спасибо!

- Nick

6
задан user266382 4 February 2010 в 17:08
поделиться

1 ответ

Вот пример, который мне подходит. Я упростил его, используя копипаст, но это не имеет значения.

Я использую текстовый пароль из-за совместимости с библиотекой JS, но сам открытый SSL поддерживает прямое использование ключа byte [] и IV, так что вам решать, что использовать.

Чтобы преобразовать двоичные данные в строку, просто используйте

Encoding.UTF8.GetBytes() and Encoding.UTF8.GetString()

для преобразования туда и обратно.

    public Byte[] Encrypt(Byte[] data, String password)
    {
        //Just random 8 bytes for salt
        var salt = new Byte[] {1, 2, 3, 4, 5, 6, 7, 8};

        using (var cc = new CipherContext(Cipher.AES_256_CBC))
        {
            //Constructing key and init vector from string password
            byte[] passwordBytes = Encoding.UTF8.GetBytes(password);
            byte[] iv;
            byte[] key = cc.BytesToKey(MessageDigest.MD5, salt, passwordBytes, 1, out iv);

            var memoryStream = new MemoryStream();

            //Performing encryption thru unmanaged wrapper
            var aesData = cc.Crypt(data, key, iv, true);

            //Append salt so final data will look Salted___SALT|RESTOFTHEDATA
            memoryStream.Write(Encoding.UTF8.GetBytes("Salted__"), 0, 8);
            memoryStream.Write(salt, 0, 8);
            memoryStream.Write(aesData, 0, aesData.Length);

            return memoryStream.ToArray();
        }
    }

    public Byte[] Decrypt(String password, Byte[] encryptedData)
    {
        byte[] salt = null;
        //extracting salt if presented
        if (encryptedData.Length > 16)
        {
            if (Encoding.UTF8.GetString(encryptedData).StartsWith("Salted__"))
            {
                salt = new Byte[8];
                Buffer.BlockCopy(encryptedData, 8, salt, 0, 8);
            }
        }

        //Removing salt from the original array
        int aesDataLength = encryptedData.Length - 16;
        byte[] aesData = new byte[aesDataLength];
        Buffer.BlockCopy(encryptedData, 16, aesData, 0, aesDataLength);


        using (var cc = new CipherContext(Cipher.AES_256_CBC))
        {
            //Constructing key and init vector from string password and salt
            byte[] passwordBytes = Encoding.UTF8.GetBytes(password);
            byte[] iv;
            byte[] key = cc.BytesToKey(MessageDigest.MD5, salt, passwordBytes, 1, out iv);

            //Decrypting
            return cc.Decrypt(aesData, key, iv, 0);

        }


    }
4
ответ дан 17 December 2019 в 07:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: