在玩3DES加密和解密时,我使用了这个相当简单和标准的代码.但是,每次运行此函数时,我都会得到不同的decryptionData值作为输出.

有人能告诉我出了什么问题吗?

    private void TripleDESDecryption()
    {
        TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();

        des.Key = new byte[] { 0x26, 0x01, 0x54, 0xd0, 0xdc, 0x92, 0xf3, 0x4b, 0xbf, 0x9b, 0xfa, 0x9d, 0x43, 0x24, 0x4b, 0xa4, 0x35, 0x50, 0xde, 0x00, 0x5e, 0x75, 0xc7, 0xed };
        des.KeySize = 192;
        des.Mode = CipherMode.ECB;
        des.Padding = PaddingMode.None;

        ICryptoTransform ic = des.CreateDecryptor();

        var encryptedData = new byte[] { 0x35, 0x66, 0x45, 0xC4, 0xBD, 0xE9, 0x5F, 0x30 };

        byte[] decryptedData = ic.TransformFinalBlock(encryptedData, 0, 8);

        Console.WriteLine(BitConverter.ToString(decryptedData));
    }

PS:这些只是随机的密钥和数据,不是敏感的东西.

推荐答案

适用的TripleDESCryptoServiceProvider.KeySize property项:

更改KeySize值将重置密钥并生成新的随机密钥.无论何时调用KeySize属性设置器(包括为其分配相同的值时),都会发生这种情况.

因此,在发布的代码中,最初设置的密钥被随机生成的密钥覆盖,这就是每次生成不同结果的原因.FIX:删除显式的KeySize调用.这是不必要的,因为密钥大小是用密钥隐式设置的.


请注意,Triple DES已经过时,欧洲央行也不安全.

Csharp相关问答推荐

我无法在Ubuntu下编译使用microsoft.extension.configurationbuilder jsonapi和mono mcs的c#应用程序

如何告诉自己创建的NuGet包在应用程序中发生了变化?

安装附加的. exe与Visual Studio

`Task`只有在C#中等待时才会运行吗?

Blazor. NET 8—阶段启动配置文件不启动网站VS2022

从Blob存储中提取tar.gz文件并将提取结果上载到另一个Blob存储

如何使datagridview的列具有响应性,以便不是所有列都更改其宽度

用C#调用由缓冲区指针参数组成的C API

WinForms在Linux上的JetBrains Rider中的应用

RabbitMQ群集的MassTransit配置问题

在implementationFactory中避免循环依赖

在使用AWS SDK for.NET时,如何判断S3是否已验证我的对象的校验和?

Blazor:搜索框在第一次搜索时不搜索

如何在C#中从MongoDB IPipelineStageDefinition中获取聚合命令的字段/选项?

为什么Swashbakle/Swagger在参数中包含变量名?

无法使用直接URL通过PictureBox.ImageLocation加载图像

使用SQL Server 2022+时,我是否必须将代码从SqlConnection类对象中迁移出来?

SqlException:无法打开数据库.升级到Dotnet 8后-数据库兼容性版本-非EFCore兼容性级别

在Swagger中显示自定义属性的属性名称

如何提高C#中比较大 struct 的性能?