2016-07-06 62 views
0

我需要幫助檢索Universal Windows Application下的AES128-EBC加密字符串。
我有一個用作密鑰的字符串密碼。使用32位長度的MD5散列值,我想用AES128-EBC對文本進行加密。 現在我用這來創建MD5Hash:UWP下的AES128-ECB

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進行迭代大約持續100ms(鹽需要與散列一起保存)。使用諸如password_hash,PBKDF2,Bcrypt和類似函數的函數。關鍵是要讓攻擊者花費大量時間通過強力查找密碼。 – zaph

+0

@zaph不幸的是,根據ECB或其他UWP缺失部分,甚至有IETF標準。你不能總是使用另一個。 –

+0

@LexLi當然,除了開發者運行的一些相同的代碼之外,沒有任何理由的使用很多。 IOW,需要明確理由使用ECB模式。在這裏,我們也有用於密碼密鑰推導的MD5哈希值,所以我假設可能錯誤地認爲ECB模式沒有很好的理由或理解。 – zaph

回答

0

我的問題是:我的代碼是否創建AES128-ECB加密?因爲我不確定它確實如此。因爲等待加密數據的軟件不能識別它,所以它不能解密它。

是的,您的代碼使用ECB密碼模式和PKCS7填充創建AES加密。如果我正確理解你的問題,你說這與AesEcbPkcs7一起工作,但使用AesEcb失敗,你的解密軟件不適用於此。

AesEcbPkcs7AesEcb之間的區別是,AesEcbPkcs7使用PKCS#7塊中的填充模式,和PKCS#7的算法自動焊盤該消息到合適的長度,所以就不需要對墊密碼到的多您正在使用的算法的塊大小。因此,如果您堅持使用AesEcb加密,我推薦使用`AesEcbPkcs7,否則是一個例外:提供的用戶緩衝區對於請求的操作無效。

所以我猜想,在你的解密軟件中有一種可能性,它可能有使用AesEcbPkcs7的能力,但它沒有實現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)方法,實際上加密失敗了。