bash - 使用 openssl enc 解密
问题描述
我正在加密数据,openssl enc
但是当我以默认二进制模式执行此操作时会收到很多垃圾数据;但在 ascii 模式下一切正常。
给定以下定义:
iv=1968879c2ae5b6e4bdd2823b5e9fa54a
enc() { key=$1; shift; openssl enc -K "$key" -iv "$iv" -aes-256-ctr -p -nosalt "$@"; }
dec() { key=$1; shift; openssl enc -d -K "$key" -iv "$iv" -aes-256-ctr -p -nosalt "$@"; }
...跑步
enc 33 -a <<<test123 | dec 33 -a | hexdump -C
...正确发出:
00000000 6b 65 79 3d 33 33 30 30 30 30 30 30 30 30 30 30 |key=330000000000|
00000010 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 |0000000000000000|
*
00000040 30 30 30 30 0a 69 76 20 3d 31 39 36 38 38 37 39 |0000.iv =1968879|
00000050 43 32 41 45 35 42 36 45 34 42 44 44 32 38 32 33 |C2AE5B6E4BDD2823|
00000060 42 35 45 39 46 41 35 34 41 0a 74 65 73 74 31 32 |B5E9FA54A.test12|
00000070 33 0a |3.|
00000072
而在不-a
发出二进制垃圾的情况下做同样的事情;用于base64
使该输出可打印,
enc 33 <<<test123 | dec 33 | hexdump -C
...输出一个比 : 长得多的字符串的 base64 编码test123
:
00000000 6b 65 79 3d 33 33 30 30 30 30 30 30 30 30 30 30 |key=330000000000|
00000010 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 |0000000000000000|
*
00000040 30 30 30 30 0a 69 76 20 3d 31 39 36 38 38 37 39 |0000.iv =1968879|
00000050 43 32 41 45 35 42 36 45 34 42 44 44 32 38 32 33 |C2AE5B6E4BDD2823|
00000060 42 35 45 39 46 41 35 34 41 0a 2f 5a 77 fb 7a 37 |B5E9FA54A./Zw.z7|
00000070 ca 60 43 f6 17 ce 13 da d8 40 f9 78 30 6f 44 60 |.`C......@.x0oD`|
00000080 fc b4 63 05 69 38 45 b3 19 8c 04 bc 79 0e 0e de |..c.i8E.....y...|
00000090 10 3f d3 9e 19 d6 8c 93 67 3b 20 5a 9f cd c2 3f |.?......g; Z...?|
000000a0 76 36 2a 71 31 c0 a0 49 fc 4a c0 aa b0 b1 c7 e2 |v6*q1..I.J......|
000000b0 1c c5 0a 54 b7 d9 e4 b4 8a 2e 05 4a f4 3b 9c 01 |...T.......J.;..|
000000c0 37 fc 0e 69 a8 86 f7 cd 21 a3 2e 94 0a 1f fa b3 |7..i....!.......|
000000d0 07 61 26 d9 b4 e0 b6 6f 3a e6 72 e8 |.a&....o:.r.|
000000dc
解决方案
输出密钥和 IV的-p
选项openssl
为您提供这些垃圾字节。
如果您-p
从函数中删除此选项enc()
,那将起作用。
使用-a
选项,openssl
从输入中跳过非 base64 字符串(即密钥和 IV 信息),这就是它起作用的原因。
例子:
echo test123 | openssl enc -K 33 -iv 0 -aes-256-ctr -p -nosalt | openssl enc -d -K 33 -iv 0 -aes-256-ctr -p -nosalt
# -> fail
echo test123 | openssl enc -K 33 -iv 0 -aes-256-ctr -p -nosalt -a | openssl enc -d -K 33 -iv 0 -aes-256-ctr -p -nosalt -a
# -> OK
echo test123 | openssl enc -K 33 -iv 0 -aes-256-ctr -nosalt | openssl enc -d -K 33 -iv 0 -aes-256-ctr -p -nosalt
# -> OK
推荐阅读
- swift - sequence() 上的 compactMap 不懒惰?
- html - 为什么我的文本是连接的,发生这种情况时它叫什么?
- c - 我的程序无法正确调整图像大小时遇到问题
- python - 如何从列表中的列表中删除项目?
- javascript - UPNG.js - 我如何处理透明图像?
- python - 为什么 p[:] 在这两种情况下的工作方式不同?
- java - 使用 KeyCloak 的多租户 Quarkus?
- javascript - 将 0 值自动填充到未定义的 xAxes
- c# - 如何在没有身份验证和授权方法的情况下保护公共端点
- powershell - 如何通过 powershell 解析最新的 DNS CName 结果