2016-07-06 4 views
0

Мне нужна помощь в извлечении зашифрованной строки AES128-EBC под Универсальное приложение Windows.
У меня есть пароль в строке, который используется в качестве ключа. С его 32-разрядным значением MD5 хэш-значения я хотел бы зашифровать текст с помощью AES128-EBC. Теперь я использую это для создания MD5Hash:AES128-ECB под UWP

public string GetMD5Hash(String strMsg) 
{ 
    string strAlgName = HashAlgorithmNames.Md5; 
    IBuffer buffUtf8Msg = CryptographicBuffer.ConvertStringToBinary(strMsg, BinaryStringEncoding.Utf8); 

    HashAlgorithmProvider objAlgProv = HashAlgorithmProvider.OpenAlgorithm 
    string strAlgNameUsed = objAlgProv.AlgorithmName; 

    IBuffer buffHash = objAlgProv.HashData(buffUtf8Msg); 

    if (buffHash.Length != objAlgProv.HashLength) 
    { 
     throw new Exception("There was an error creating the hash"); 
    } 

    string hex = CryptographicBuffer.EncodeToHexString(buffHash); 

    return hex; 
} 

И этот код для шифрования:

public string Encrypt(string input, string pass) 
{ 
    SymmetricKeyAlgorithmProvider provider = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesEcbPkcs7); 
    CryptographicKey key; 

    string encrypted = ""; 

    byte[] keyhash = Encoding.ASCII.GetBytes(GetMD5Hash(pass)); 
    key = provider.CreateSymmetricKey(CryptographicBuffer.CreateFromByteArray(keyhash)); 

    IBuffer data = CryptographicBuffer.CreateFromByteArray(Encoding.Unicode.GetBytes(input)); 
    encrypted = CryptographicBuffer.EncodeToBase64String(CryptographicEngine.Encrypt(key, data, null)); 

    return encrypted; 
} 

Причина, почему я использую SymmetricAlgorithmNames.AesEcbPkcs7, когда я использую SymmetricAlgorithmNames.AesEcb выход строка пуста. Я не понимаю, почему. Мой вопрос: мой код создает шифрование AES128-ECB? Потому что я не уверен, что это так. Поскольку программное обеспечение, ожидающее, что эти зашифрованные данные не распознают его, поэтому он не может его расшифровать.

+0

Если вам нужна безопасность: 1. Не используйте режим ECB, он тоже небезопасен, см. [Режим ECB] (https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Electronic_Codebook_.28ECB.29), прокрутите вниз Пингвину. Используйте режим CBC со случайным iv, добавьте его к зашифрованным данным. 2. Не используйте MD5 для получения ключа шифрования. Итерации по HMAC со случайной солью в течение приблизительно 100 мс (соль должна быть сохранена с хешем). Используйте такие функции, как password_hash, PBKDF2, Bcrypt и аналогичные функции. Дело в том, чтобы заставить злоумышленника потратить много времени на поиск паролей грубой силой. – zaph

+0

@zaph, к сожалению, существуют даже стандарты IETF в зависимости от ECB или других недостающих частей UWP. Вы не всегда можете использовать другое. –

+0

@LexLi Конечно, но там много использования без каких-либо причин, кроме какого-то одного кода, с которым работает разработчик. IOW, нужно понять понятную причину использования режима ECB. Здесь у нас также есть хеш MD5 для использования для генерации пароля, поэтому я предполагаю, возможно, неправильно, что режим ECB используется без уважительной причины или понимания. – zaph

ответ

0

Мой вопрос: Мой код создает шифрование AES128-ECB? Потому что я не уверен, что это так. Поскольку программное обеспечение, ожидающее, что эти зашифрованные данные не распознают его, поэтому он не может его расшифровать.

Да, ваш код создает AES-шифрование с шифрованием ECB и дополнением PKCS7. Если я правильно понимаю вашу проблему, вы сказали, что это работает с AesEcbPkcs7, но не с помощью AesEcb, ваше программное обеспечение для дешифрования не работает для этого.

Разница между AesEcbPkcs7 и AesEcb есть AesEcbPkcs7 использовать PKCS # 7 режимов блоков отступов и PKCS # 7 алгоритмов автоматически подушечки сообщения для соответствующей длины, так что вам не нужен раздуть шифр к кратен размер блока алгоритма, который вы используете. Поэтому, если вы настаиваете на использовании AesEcb для шифрования, я рекомендую использовать `AesEcbPkcs7, иначе исключение: предоставленный пользовательский буфер недействителен для запрошенной операции.

Так что, я думаю, одна возможность здесь, в вашем дешифрованном программном обеспечении, может иметь возможность использовать AesEcbPkcs7, но она не реализует decrytion AesEcb. Здесь я тестировал дешифрование на основе кода, этот код может расшифровать AesEcb правильно:

public string Decrypt(string input, string pass) 
{ 
    var keyHash = Encoding.ASCII.GetBytes(GetMD5Hash(pass)); 

    // Create a buffer that contains the encoded message to be decrypted. 
    IBuffer toDecryptBuffer = CryptographicBuffer.DecodeFromBase64String(input); 

    // Open a symmetric algorithm provider for the specified algorithm. 
    SymmetricKeyAlgorithmProvider aes = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesEcb); 

    // Create a symmetric key. 
    var symetricKey = aes.CreateSymmetricKey(keyHash.AsBuffer()); 

    var buffDecrypted = CryptographicEngine.Decrypt(symetricKey, toDecryptBuffer, null); 

    string strDecrypted = CryptographicBuffer.ConvertBinaryToString(BinaryStringEncoding.Utf8, buffDecrypted); 

    return strDecrypted; 
} 

Другая возможность, я думаю, что вы поймать исключение при использовании AesEcb и пользовательский буфер не подходит для указанной операции и обрабатывать его, когда вам вызовите ваш метод Encrypt(string input, string pass), на самом деле шифрование завершилось неудачно.

Смежные вопросы