AES128-ECB under UWP
本文关键字:UWP under AES128-ECB | 更新日期: 2023-09-27 17:55:51
我需要帮助在通用Windows应用程序下检索AES128-EBC加密字符串。
我有一个用作密钥的字符串密码。凭借其 32 位长度的 MD5 哈希值,我想使用 AES128-EBC 加密文本。现在我用它来创建 MD5Hash:
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)
方法时处理它,加密实际上失败了。