1

我认为有些问题已经与我将在这里讨论的问题相似。但是,如果可以回答这个百万美元的问题,我将提供一些可能用于其他项目的代码。

我正在尝试创建一个解密机制,使用System.Security.Cryptographic.NET 来解密由 CAPICOM 库生成的密文。

首先,看看我使用 CAPICOM 库进行加密和解密的方法。

public static string DecryptString(string sValue)
{
    IEncryptedData cryptic = new EncryptedDataClass();
    cryptic.Algorithm.Name = CAPICOM_ENCRYPTION_ALGORITHM.CAPICOM_ENCRYPTION_ALGORITHM_AES;

    cryptic.SetSecret("AbCdeFgHijklMnoPqrstu", (CAPICOM_SECRET_TYPE)0);
    cryptic.Decrypt(sValue);
    return cryptic.Content;
}

public static string EncryptString(string sValue)
{
    IEncryptedData cryptic = new EncryptedDataClass();
    cryptic.Algorithm.Name = CAPICOM_ENCRYPTION_ALGORITHM.CAPICOM_ENCRYPTION_ALGORITHM_AES;

    cryptic.SetSecret("AbCdeFgHijklMnoPqrstu", (CAPICOM_SECRET_TYPE)0);
    cryptic.Content = sValue;
    return cryptic.Encrypt(CAPICOM_ENCODING_TYPE.CAPICOM_ENCODE_BASE64);

}

使用刚刚简单调用的方法ClassName.EncryptString("Your plain text here");现在这里是魔鬼的一面。很多帖子都在谈论同样的事情,不知何故你无法解密由 CAPICOM 创建的东西,直到这一刻我觉得这个概念有点正确。

这是我到目前为止所做的。

public static string SimpleDecrypt(string Text)
{
    byte[] keyBytes = UTF8Encoding.UTF8.GetBytes("AbCdeFgHijklMnoPqrstu"); // 21 characters key is a must !!!
    byte[] ivBytes = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
    AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
    aes.KeySize = 256;
    //aes.IV = ivBytes;
    aes.Key = keyBytes;
    aes.Mode = CipherMode.ECB;
    aes.Padding = PaddingMode.None;
    byte[] src = Convert.FromBase64String(Text);
    using (ICryptoTransform decrypt = aes.CreateDecryptor())
    {
        byte[] dest = decrypt.TransformFinalBlock(src, 0, src.Length);
        return Encoding.Default.GetString(dest);
    }
}

我们都知道在使用 CAPICOM 的 AES 时初始化向量 (IV) 是隐藏的(请参阅此处的帖子并且无法检索,尽管如此我们还是试试吧。另一个有趣的是,我们只假设 CAPICOM 使用的是最大长度密钥大小,所以我使用aes.KeySize = 256;. 最后,CAPICOM 神奇地使用填充,只有微软的人知道这一点,所以我使用aes.Padding = Padding.None;.

不幸的是,来自 CAPICOM 的每个输出(密文)都无法使用我的 .NET 方法使用所有可能的组合进行解密。

现在问题来了。在花了超过 2 x 24 小时试图解决这个难题之后,我离解决它还差得很远。谁能帮我解决这个问题?

4

0 回答 0