c# - TripleDES 加密和解密给出了奇怪的结果
问题描述
我有一个有效的实现TripleDESCng
(针对一些测试向量进行了测试),但是会发生以下情况:
当我使用示例密钥加密纯文本This is a sample message
(24 个字节,因此它将是 3 个块)(十六进制为)时,我得到. 但是,当我使用相同的示例密钥对其进行解密时,我得到,当转换回 ASCII 时,它是:5468697320697320612073616D706C65206D657373616765
E81F113DD7C5D965E082F3D42EC1E2CA39BCDBCCBC0A2BD9
5468697320697320612073616D706C650000000000000000
This is a sample
.
除了我的代码之外,还有什么原因会导致这种行为?为了加密和解密,我使用 24 字节密钥(ECB 模式)。
编辑:
using (var tripleDES = new TripleDESCryptoServiceProvider())
{
byte[] data = ASCIIEncoding.ASCII.GetBytes("This is a sample message");
Console.WriteLine(BitConverter.ToString(data));
tripleDES.IV = new byte[tripleDES.BlockSize / 8];
var encryptor = tripleDES.CreateEncryptor();
byte[] result = new byte[data.Length];
encryptor.TransformBlock(data, 0, data.Length, result, 0);
var decryptor = tripleDES.CreateDecryptor();
byte[] result2 = new byte[result.Length];
decryptor.TransformBlock(result, 0, result.Length, result2, 0);
Console.WriteLine(BitConverter.ToString(result2));
}
Console.ReadLine();
解决方案
对于几乎所有模式1,您应该确保数据的最后部分被推送TransformFinalBlock
而不是TransformBlock
2,以确保它知道没有更多数据即将到来并确保最终块被刷新/写入。
一般来说,假设输出大小将与输入大小匹配是不好的形式。
模式没有问题,IV设置为0s
是的,这意味着第一个块不受您选择的模式的影响。但是所有后续块都将是,因为它们将使用链接模式和前一个块,而不是IV。因此,如果您想要ECB(您不应该3),您需要明确设置该模式。
1您的代码使用的是 CBC,而不是您在叙述中声称的 EBC。CBC 是 .NET 加密类的默认模式。
2在使用第二种方法时,请注意它的返回值,正如 mjwills 评论的那样。
3你选择了一个过时的加密算法,将它与一个过时的操作模式配对,而我上面引用的你的话意味着你不了解模式。加在一起,我建议您目前不适合编写使用加密的代码。.NET 类可以使编写加密代码看起来很容易,但您仍然必须了解如何在使用它们时做出正确的选择。最好在编写代码之前花更多时间研究这些东西。
推荐阅读
- dataset - 预言家预测的诊断问题
- azure - 无法在应用程序网关 HTTP 设置中更新请求超时
- azure - 如何获取有关失败的 Azure 部署的更多信息?
- swift - 在 Swift 中查找可编码解码器的进度
- excel - 使用 vba 从文件夹和子文件夹中复制文件
- python - Python - 如果满足条件,应用公式
- c# - 了解 hockeyapp 崩溃报告 Stacktrace
- angularjs - 如何从angularjs中的子控制器调用父控制器中的函数
- javascript - 对象显示在控制台中,但总是在开始时添加一个未定义或空数组
- android - Android Room Persistent 库更新不起作用