c# - C# 加密库如何处理小于加密算法所需 key 大小的 key ?

标签 c# node.js

让我们以需要 192 位 key 的 TripesDES 算法为例。 C# 如何处理较小的 key ?假设 128 位 key (参见下面的示例)

在 nodejs 中尝试使用较小的 key 将抛出“无效 key 大小”错误。 C# 继续并输出加密。我想内部使用了某种类型的填充?如果是这样,哪个填充?我认为 PKCS7 仅用于填充每个加密 block ,对吗?它与加密 key 本身无关。

    var cryptoProvider = new TripleDESCryptoServiceProvider
    {
        Key = new byte[]
        {
            0xAA,
            0xAA,
            0xAA,
            0xAA,
            0xAA,
            0xAA,
            0xAA,
            0xAA,
            0xAA,
            0xAA,
            0xAA,
            0xAA,
            0xAA,
            0xAA,
            0xAA,
            0xAA
        },
        Mode = CipherMode.ECB,
        Padding = PaddingMode.PKCS7
    };
    var encryptor = cryptoProvider.CreateEncryptor();
    var token = encryptor.TransformFinalBlock(bytes, 0, bytes.Length);

最佳答案

Let's use as an example the TripesDES algorithm which requires a 192bit key

这不完全正确。 TripleDES 基本上使用 3 个 key 应用 DES 3 次。这 3 个键可以是:

  • 人人平等。那是普通的 DES。我们可以忽略该选项
  • 完全不同。这就是您所期望的,192 位 key (3 个 key 组合)
  • 2 个键相同,第 3 个不同。比所有 key 都不同时更弱,但仍比常规 DES 强。这给了我们 128 位 key (2 个 key 组合)。

.NET 实现支持最​​后两个选项,因此当您使用 128 位 key 时(就像您在问题中所做的那样)- 它会将其拆分为 2 个 key 并使用其中一个(第一个)作为第三个 key ,因此结果您将第 1 和第 3 个键相同。

请注意,.NET 将验证您的 key 不是“弱”三重 DES key ,因此对于您问题中的示例,它将抛出异常,因为您的 key 的左半部分和右半部分是相同的,给定以上,将导致使用 3 个相同的 key 进行加密,因此整个过程将简化为常规 DES。

一般来说,.NET 会验证您传递的 key 是否具有给定算法的合法大小。

您可以先用一些 16 字节的 key 加密来验证以上内容:

var key = new byte[] {
    0xAA,
    0xAA,
    0xAA,
    0xAA,
    0xAA,
    0xAA,
    0xAA,
    0xAA,
    0xAA,
    0xAA,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00
};

然后手动将前 8 个字节附加到末尾以获得 24 字节的 key :

var fullKey = key.Concat(key.Take(8)).ToArray()

并用它解密(它会很好地解密,因为 16 字节和 24 字节的 key 与上述相同)。

关于c# - C# 加密库如何处理小于加密算法所需 key 大小的 key ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49752394/

相关文章:

c# - 该类型不能用作泛型类型或方法中的类型 'T'。没有从到的隐式引用转换

c# - WPF DataGridComboBoxColumn 不工作

node.js - Nodejs 给我下载而不是 html 响应

javascript - Node VM - 隐式返回一个对象

javascript - 通过 Hapi.js 创建 cookie

mysql - 如何在 Node JS 中编写长 MySQL 查询

c# - Windows 的 .Net 检查器

c# - Paint.net 文件类型插件

c# - 从 OWIN 中的 OAuth Bearer Token 获取 IPrincipal

javascript - 如何使用 Node 检查器,Windows 7 调试带有断点的 Gruntfile?