0

我需要帮助在通用 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 加密?因为我不确定它确实如此。因为等待该加密数据的软件无法识别它,所以它无法解密它。

4

1 回答 1

0

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

于 2016-07-07T10:04:22.543 回答