C# DESCryptoServiceProvider解密不工作。正在获取具有\0个字符且只有第一个字母的输出
我正在根据以下逻辑使用以下加密代码创建许可证:C# DESCryptoServiceProvider解密不工作。正在获取具有\0个字符且只有第一个字母的输出,c#,cryptography,memorystream,des,.net-4.5.2,C#,Cryptography,Memorystream,Des,.net 4.5.2,我正在根据以下逻辑使用以下加密代码创建许可证: private void SaveLicenseInfoWithEncryption(LicenseInfo obj) { string strLicenseString = "Kamran"; //string strLicenseString = JsonConvert.SerializeObject(obj, Formatting
private void SaveLicenseInfoWithEncryption(LicenseInfo obj)
{
string strLicenseString = "Kamran";
//string strLicenseString = JsonConvert.SerializeObject(obj, Formatting.None);
byte[] buffer = new byte[strLicenseString.Length * sizeof(char)];
Buffer.BlockCopy(strLicenseString.ToCharArray(), 0, buffer, 0, buffer.Length);
DESCryptoServiceProvider desCryptSrvckey = new DESCryptoServiceProvider
{
Key = new UTF8Encoding().GetBytes(ConfigurationManager.AppSettings["EncryptionKey"])
};
desCryptSrvckey.IV = desCryptSrvckey.Key;
using (MemoryStream stmCipherText = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(stmCipherText, desCryptSrvckey.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(buffer, 0, buffer.Length);
cs.FlushFinalBlock();
string licPath = Path.Combine(txtFolderPath.Text, @"Test.lic");
File.WriteAllBytes(licPath, stmCipherText.ToArray());
MessageBox.Show(@"License File Generated Successfully");
}
}
}
许可证生成得很好(我已经临时输入了示例文本)。问题是,我试图解密我的许可证,我得到一些无效的行为
我的代码是:
private void button1_Click(object sender, EventArgs e)
{
var fileDialog = new OpenFileDialog
{
Filter = @"License Files|*.lic",
Title = @"Select a License File"
};
if (fileDialog.ShowDialog() == DialogResult.OK)
{
byte[] buffer = File.ReadAllBytes(fileDialog.FileName);
DESCryptoServiceProvider desCryptSrvckey = new DESCryptoServiceProvider
{
Key = new UTF8Encoding().GetBytes(ConfigurationManager.AppSettings["EncryptionKey"])
};
desCryptSrvckey.IV = desCryptSrvckey.Key;
using (MemoryStream encryptedStream = new MemoryStream(buffer))
{
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(encryptedStream, desCryptSrvckey.CreateDecryptor(), CryptoStreamMode.Read))
{
using (StreamWriter sw = new StreamWriter(ms))
{
using (StreamReader sr = new StreamReader(cs))
{
sw.Write(sr.ReadToEnd());
sw.Flush();
}
ms.Position = 0;
txtContent.Text = new StreamReader(ms).ReadToEnd();
}
}
}
}
}
}
在“监视”窗口中,我得到文本
K\0a\0m\0r\0a\0n\0
,但文本框中的最终输出只是K
丢失块拷贝
,并将字符串转换为UTF-8:
buffer = Encoding.UTF8.GetBytes(strLicenseString);
或使用当前代码并告诉读者文本为UTF-16(这是内部字符串编码,是执行原始块复制时缓冲区中的结果)
您还可以简化为:
...
desCryptSrvckey.IV = desCryptSrvckey.Key;
using (MemoryStream encryptedStream = new MemoryStream(buffer))
using (CryptoStream cs = new CryptoStream(encryptedStream, desCryptSrvckey.CreateDecryptor(), CryptoStreamMode.Read))
using (StreamReader sr = new StreamReader(cs))
{
txtContent.Text = sr.ReadToEnd();
}
编码问题。ReadToEnd()以字符串形式读取文件内容。使用其中一种读取方法将字节读取到字节数组,然后使用适当的编码将数组转换为字符串。我也有这个疑问。我尝试过在生成和解密中使用密码,但没有成功。我也尝试过StreamReader(ms,Encoding.UTF8).ReadToEnd(),但也没有帮助。你能建议需要修改哪行代码吗?这个sw.Write(sr.ReadToEnd());需要替换为向数组读取字节的循环。然后您至少可以看到数据是什么。buffer=Encoding.UTF8.GetBytes(strLicenseString);做了这个把戏非常感谢Alex
...
desCryptSrvckey.IV = desCryptSrvckey.Key;
using (MemoryStream encryptedStream = new MemoryStream(buffer))
using (CryptoStream cs = new CryptoStream(encryptedStream, desCryptSrvckey.CreateDecryptor(), CryptoStreamMode.Read))
using (StreamReader sr = new StreamReader(cs))
{
txtContent.Text = sr.ReadToEnd();
}