OpenSSL可以解码不包含换行符的base64数据吗?


9

我在bash变量中有两个base64数据块。base64数据中通常的换行符已由空格代替,并且该变量基本上是一个非常长的单行字符串。

我可以解码变量中包含的base64数据的两个块,但是在尝试执行此操作时遇到了一些细微差别。我想了解我是否正确处理此问题,或者是否有更好的方法来解码不包含换行符的base64数据。这是我所拥有的:

第一个块是350个字符,我可以像这样成功解码它:

echo ${DATA::350} | openssl base64 -d | wc -c
256

第二个块是5745个字符,但以上命令未产生预期的结果。即:

$ echo {DATA:350} | openssl base64 -d | wc -c
432

但是,如果我把换行符重新插入,它会起作用:

$ echo ${DATA:350} | tr ' ' "\n" | openssl base64 -d | wc -c
4240

我预计会有一些行长问题,第一个块足够小以避免发生,并且这似乎是所使用的base64解码器的功能(两个常用的解码器base64和的openssl base64行为不同)。

base64解码器(代替openssl base64)停止在第一无效字符(空格),并因此只是解码而输出的OpenSSL 432个字符(9“线”)的第一个“行”(48个字节的输出数据)。该base64命令具有忽略垃圾的选项,因此可以正常工作:

$ echo ${DATA:350} | base64 -d -i | wc -c
4240

OpenSSL解码器似乎没有这种选择。

此外,删除空格全部工程base64,但不是openssl base64

$ echo ${DATA:350} | tr -d ' ' | openssl base64 -d | wc -c
400

$ echo ${DATA:350} | tr -d ' ' | base64 -d | wc -c
4240

因此,最后,我替换了换行符并使用了OpenSSL解码器,因为无论如何我都需要进一步处理解码后的数据:

$ openssl enc -d -a -in <(echo ${DATA:350} | /usr/bin/tr ' ' "\n") -aes-256-cbc -pass file:<(echo $skey) | ...

但是我想了解OpenSSL可以解码不包含换行符的base64数据吗?


FWIW bash可以在不tr使用的情况下,使用${var//old[/new}- 来更改或删除字符本身,但不能与子字符串同时使用。
dave_thompson_085 '17

Answers:


17

如果您不需要空格,则openssl可以使用以下-A选项进行处理:

所以:

$ ls -l sp2.bmp
-rw-r--r-- 1 sweh sweh 3000054 Apr 21 20:13 sp2.bmp
$ x=$(openssl base64 -A < sp2.bmp)                
$ echo "$x" | wc
      1       1 4000073
$ echo "$x" | openssl base64 -d -A > res
$ ls -l res
-rw-r--r-- 1 sweh sweh 3000054 Jul 30 10:00 res
$ cmp res sp2.bmp 
$ 

我们可以看到base64数据全部在一行上,并且可以被解码。

man enc说明-A选项。

如果需要保留空格,则需要将其删除(通过转换为'\n'或删除并使用-A)。


-A选项是我首先尝试的操作之一,但是在尝试删除空格然后在不起作用时“继续”操作之前,我这样做了!手册页没有提及有关空格是问题的任何内容。无论如何,我只是尝试了一下,删除了空格,它确实起作用了。它仍然很讨厌,但至少它只是一个tr -d ' '。可惜它无法处理它并忽略空白(就像base64可以)。
starfry '16

2
RFC 4648表示,严格地说,空格(第3.3节)和换行符(第3.1节)在base64中被禁止。3.3节还说,在这种情况下,实现必须拒绝数据。因此openssl base64 -A,更接近于严格的解释,这是安全加密工具所期望的。我想coreutils base64比较宽大。
史蒂芬·哈里斯

2
OpenSSL在1990年代(在4648甚至3548之前)实现了base64,主要用于读取和写入“ PEM”(确实类似于PEM)和S / MIME文件,这两者都需要换行符。-A基本上是“我们有这些EVP_{En,De}codeBlock因素,不妨让人们使用它们”。
dave_thompson_085
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.