我认为有些问题已经与我将在这里讨论的问题相似。但是,如果可以回答这个百万美元的问题,我将提供一些可能用于其他项目的代码。
我正在尝试创建一个解密机制,使用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 小时试图解决这个难题之后,我离解决它还差得很远。谁能帮我解决这个问题?