【问题标题】:Decrypting with openssl enc使用 openssl enc 解密
【发布时间】:2019-03-01 05:01:54
【问题描述】:

我正在使用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

...输出比test123长得多的字符串的base64编码:

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

【问题讨论】:

  • 一些旁白:key=$1; shift,最后使用"$@";这样你就可以通过所有额外的命令行参数而不破坏它们的引用。 (key= 而不是 KEY= 是按照 pubs.opengroup.org/onlinepubs/9699919799/basedefs/… ——全大写名称用于对 shell 本身有意义的变量,小写名称保留给应用程序使用,并保证不会对符合 POSIX 的行为产生副作用贝壳)。
  • 这里给出的enc.bashdenc.bash 是相同的。这是复制/粘贴错误吗?
  • @CharlesDuffy 是的,只有 2 个字母的区别,所以我复制了原件两次,忘记进行更改。现已修复。
  • 顺便说一句,我会亲自编写一个复制器,如ideone.com/2HMP9t 中给出的;不需要单独的脚本来执行函数。此外,key=iv= 输出可能是相关的,不是吗?当然表明密钥没有按照您期望的方式进行解析。
  • gist.github.com/charles-dyfis-net/… 上查看我提议的问题重写;意图是让我们更接近复制+粘贴来复制,而按照当前给定的方式遵循它需要实际创建文件。

标签: bash encryption openssl


【解决方案1】:

openssl-p 选项输出密钥和 IV,为您提供这些垃圾字节。

如果您从 enc() 函数中删除此 -p 选项,那将起作用。

使用-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

【讨论】:

  • 哇,谢谢。我想我假设在stderr 上会输出额外的信息。
猜你喜欢
  • 2019-11-19
  • 2016-09-25
  • 1970-01-01
  • 2015-10-09
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
  • 2018-12-23
  • 1970-01-01
相关资源
最近更新 更多