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加密?因为我不确定它确实如此。因为等待加密数据的软件不能识别它,所以它不能解密它。
我的问题是:我的代码是否创建AES128-ECB加密?因为我不确定它确实如此。因为等待加密数据的软件不能识别它,所以它不能解密它。
是的,您的代码使用ECB密码模式和PKCS7填充创建AES加密。如果我正确理解你的问题,你说这与AesEcbPkcs7
一起工作,但使用AesEcb
失败,你的解密软件不适用于此。
AesEcbPkcs7
和AesEcb
之间的区别是,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)
方法,实际上加密失败了。
如果您需要安全性: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
@zaph不幸的是,根据ECB或其他UWP缺失部分,甚至有IETF标准。你不能总是使用另一个。 –
@LexLi当然,除了开发者运行的一些相同的代码之外,没有任何理由的使用很多。 IOW,需要明确理由使用ECB模式。在这里,我们也有用于密码密钥推导的MD5哈希值,所以我假设可能错误地认为ECB模式没有很好的理由或理解。 – zaph