AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1717384
Accepted
sherrellbc
sherrellbc
Asked: 2022-04-22 08:07:34 +0800 CST2022-04-22 08:07:34 +0800 CST 2022-04-22 08:07:34 +0800 CST

Openssl 对 DES/3DES 使用 openssl 给出奇怪的结果?

  • 772

我正在实现一个包含 DES 和 3DES 功能的支持库。作为验证步骤,我使用它openssl来检查我的结果。对于一个简单的测试,我这样做了:

echo -n "AAAAAAAA" | openssl enc -e -des-ecb -nosalt -pass pass:AABBCCDD | xxd
00000000: 2976 3faf 5e27 7187 5897 c640 c38c cf8b  )v?.^'q.X..@...

即 ECB mod、plaintext AAAAAAAA、keyAABBCCDD和 no salting。但是这里有两件事让我觉得很奇怪。

(1) 对于 64 位输入和 64 位块大小,我希望输出具有与输入相同的长度

(2) 如果我将输入加倍为 128 位(所有 A,块长度的两倍),我实际上得到 24 字节的密文

$ echo -n "AAAAAAAAAAAAAAAA" | openssl enc -e -des-ecb -nosalt -pass pass:AABBCCDD | xxd
00000000: 2976 3faf 5e27 7187 2976 3faf 5e27 7187  )v?.^'q.)v?.^'q.
00000010: 5897 c640 c38c cf8b                      X..@....

在进行最后一个实验时,我注意到密文确实在块大小边界上重复(参见2976 3faf 5e27 7187重复)。但是当达到这个阈值时,我们会得到额外的 8 个字节的密文。即,使用 7 个 A 给出 8 个字节的密文,但 8 个 A 给我们 16 个字节。所以对这个边界条件似乎有一些奇怪的处理?

无论如何,我检查了一些随机的在线 DES 工具,但没有一个与 openssl 提供的相匹配——但它们都相互匹配。从这些工具中,我认为上面第一个示例的正确密文是

54 55 ab a4 a2 b0 83 38

或者他们都以同样的方式错了。这里发生了什么?

encryption openssl
  • 1 1 个回答
  • 373 Views

1 个回答

  • Voted
  1. Best Answer
    user1686
    2022-04-22T08:39:30+08:002022-04-22T08:39:30+08:00

    您要求openssl将您的密钥用作密码,这是一个需要通过 KDF 函数才能用作所需长度的加密密钥的字符串。该-nosalt选项仅禁用对 KDF 的盐输入,而不是一般 KDF 的使用。

    (OpenSSL 使用迭代的 MD5 算法作为其默认 KDF,尽管最近的版本支持标准 PBKDF2,并且通常会在未启用时警告您。)

    要AABBCCDD用作文字 64 位密钥,必须通过以下方式指定-K:

    $ echo -n "AAAAAAAAAAAAAAAA" | openssl enc -e -des-ecb -K 4141424243434444 | 高清
    00000000   54 55 ab a4 a2 b0 83 38   54 55 ab a4 a2 b0 83 38 |TU.....8TU.....8|
    00000010 55 f8 fc 5b 8f 9a 8e 8c |U..[....|
    00000018
    

    现在你有两个密文块,加上一个填充块。该openssl enc工具应用PKCS#5 填充以确保它始终具有完整数量的输入块 - 例如,如果您的输入只有 15 个字节,最后一块将是 7 个字节,无法按原样加密。它不能简单地补零,因为接收者不知道它可以安全删除多少个零字节——毕竟,输入不一定是文本;它也可以是最后带有一定数量合法零字节的二进制数据。

    此处使用的特定填充形式使用最后一个字节来指示添加了多少填充,因此在解密后要删除多少填充。例如,如果最后一个明文块只有 6 个字节,它将被填充0x02 0x02(在加密之前),以便接收者知道它需要从解密的块中删除 2 个字节。

    但是当你的明文的最后一个块已经是全尺寸时,就没有空间来表明这个事实了——你不能有零长度的填充,因为接收者仍然会查看解密后的明文的最后一个字节并且会得到因为最后一个字节是一些任意数据而感到困惑。出于这个原因,添加了一个完整的填充块,由八个0x08字节组成。

    在 ECB 模式下,您可以通过尝试将填充解密为数据来看到这一点:

    $回声“ 55 f8 fc 5b 8f 9a 8e 8c   55 f8 fc 5b 8f 9a 8e 8c”| 十六进制\
      | openssl enc -d -des-ecb -K 4141424243434444 \
      | 十六进制转储 -C
    00000000   08 08 08 08 08 08 08 08                            |........|
    00000008
    

    同样对于较短的输入:

    $回声-n“AAAAAAA AAAA ”\
      | openssl enc -e -des-ecb -K 4141424243434444 \
      | 十六进制转储 -C
    00000000 54 55 ab a4 a2 b0 83 38   07 5b 23 e5 96 4b 2f 95   |TU.....8.[#..K/.|
    00000010
    
    $回声“ 07 5b 23 e5 96 4b 2f 95   55 f8 fc 5b 8f 9a 8e 8c”| 十六进制\
      | openssl enc -d -des-ecb -K 4141424243434444 \
      | 十六进制转储 -C
    00000000 41 41 41 41 41 03 03 03                            |AAAAA...|
    00000008
    

    如果您保证输入始终是密码块大小的精确倍数,那么您可以告诉 OpenSSL 使用该-nopad选项禁用填充并仅获取 16 个字节的密文:

    $回声-n“AAAAAAAAAAAAAAAA”\
      | openssl enc -e -des-ecb -nopad -K 4141424243434444 \
      | 十六进制转储 -C
    00000000 54 55 ab a4 a2 b0 83 38 54 55 ab a4 a2 b0 83 38 |TU.....8TU.....8|
    00000010
    

    请注意,在解密时也必须指定填充的类型(或缺少填充)。

    另请注意,如果您使用 加密-nopad但最后一个块未满,OpenSSL 将简单地将其丢弃并报告错误,因为它无能为力。

    • 1

相关问题

  • LUKS 模式下 dm-crypt / cryptsetup 的默认加密密钥大小是多少?

  • 备份机密文件的最安全方法,可能没有云存储?

  • 挂载 encfs 目录后看不到文件

  • 使用 openssl 生成 JWT RS256 签名

  • 加载密钥“ec256.pem”:尝试从私钥生成公钥时抛出无效格式

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    Saaru Lindestøkke 为什么使用 Python 的 tar 库时 tar.xz 文件比 macOS tar 小 15 倍? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 为什么通过电缆(同轴电缆)的千兆位/秒 Internet 连接不能像光纤一样提供对称速度? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve