UWP下的AES128-ECB

问题描述:

我需要帮助检索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

我的问题是:我的代码是否创建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)方法,实际上加密失败了。