base64解码,而忽略括号

时间:2018-11-09 23:42:10

标签: bash encryption base64 sh decoding

我正在尝试解码一个文件,该文件主要是使用base64编码的。我想做的是解码以下内容,同时仍然保持[_*_]

example.txt

wq9cXyjjg4QpXy/Crwo=
[_NOTBASE64ED_]
aGkgdGhlcmUK
[_CONSTANT_]
SGVsbG8gV29ybGQhCg==

有时会是这种形式

aGkgdGhlcmUK[_CONSTANT_]SGVsbG8gV29ybGQhCg==

所需的输出

¯\_(ツ)_/¯
[_NOTBASE64ED_]
hi there
[_CONSTANT_]
Hello World!
hi there[_CONSTANT_]Hello World!

错误输出

¯\_(ツ)_/¯
4��!:�@�H\�B�8ԓ��[��ܛBbase64: invalid input

我尝试过的

base64 -di example.txt
base64 -d example.txt
base64 --wrap=0 -d -i example.txt

我尝试使用[_*_]分别对grep -o进行base64处理。然后找到并
    通过使用数组的怪异排列来替换它们,但是我不能
    让它工作。     将所有内容都进行base64处理,然后解码。产生双base64支持的行。

文件已大大缩小! 使用base64 --wrap=0,while循环和if / else语句进行编码。 [_*_]在解码后仍需要在那里。

4 个答案:

答案 0 :(得分:0)

您需要一个循环来读取每行并测试它是base64还是非base64,并进行适当处理。

while read -r line
do
    case "$line" in
        \[*\]) echo "$line" ;;
        *) base64 -d <<< "$line" ;;
    esac
done << example.txt

答案 1 :(得分:0)

我敢肯定,有人会提供比这更聪明的解决方案。但是试试这个

#! /bin/bash

MYTMP1=""
function printInlineB64()
{
    local lines=($(echo $1 | sed -e 's/\[/\n[/g' -e 's/\]/]\n/g'))
    OUTPUT=""
    for line in "${lines[@]}"; do
        MYTMP1=$(base64 -d <<< "$line" 2>/dev/null)
        if [ "$?" != "0" ]; then
            OUTPUT="${OUTPUT}${line}"
        else
            OUTPUT="${OUTPUT}${MYTMP1}"
        fi;
    done
    echo "$OUTPUT"
}

MYTMP2=""
function printB64Line()
{
    local line=$1

    # not fully base64 line
    if [[ ! "$line" =~ ^[A-Za-z0-9+/=]+$ ]]; then 
        printInlineB64 "$line"
        return
    fi;

    # likely base64 line
    MYTMP2=$(base64 -d <<< "$line" 2>/dev/null)
    if [ "$?" != "0" ]; then
        echo $line
    else
        echo $MYTMP2
    fi;
}


FILE=$1
if [ -z "$FILE" ]; then
    echo "Please give a file name in argument" 
    exit 1;
fi;

while read line; do
    printB64Line "$line"
done < ${FILE}

这是输出

$ cat example.txt && echo "==========================" && ./base64.sh example.txt
wq9cXyjjg4QpXy/Crwo=
[_NOTBASE64ED_]
aGkgdGhlcmUK
[_CONSTANT_]
SGVsbG8gV29ybGQhCg==
==========================
¯\_(ツ)_/¯
[_NOTBASE64ED_]
hi there
[_CONSTANT_]
Hello World!

$ cat example2.txt && echo "==========================" && ./base64.sh example2.txt
aGkgdGhlcmUK[_CONSTANT_]SGVsbG8gV29ybGQhCg==
==========================
hi there[_CONSTANT_]Hello World!

答案 2 :(得分:0)

我建议使用sh以外的其他语言,但这是使用cut的解决方案。这样可以处理一行中有多个[_constant_]的情况。

#!/bin/bash

function decode() {
    local data=""
    local line=$1
    while [[ -n $line ]]; do
          data=$data$(echo $line | cut -d[ -f1 | base64 -d)
          const=$(echo $line | cut -d[ -sf2- | cut -d] -sf1)
          [[ -n $const ]] && data=$data[$const]
          line=$(echo $line | cut -d] -sf2-)
    done
    echo "$data"
}

while read -r line; do
    decode $line
done < example.txt

答案 3 :(得分:0)

如果可以选择Perl,则可以这样说:

perl -MMIME::Base64 -lpe '$_ = join("", grep {/^\[/ || chomp($_ = decode_base64($_)), 1} split(/(?=\[)|(?<=\])/))' example.txt

下面的代码与上面的代码等效,但出于说明目的分为以下步骤:

#!/bin/bash

perl -MMIME::Base64 -lpe '
    @ary = split(/(?=\[)|(?<=\])/, $_);
    foreach (@ary) {
        if (! /^\[/) {
            chomp($_ = decode_base64($_));
        }
    }
    $_ = join("", @ary);
' example.txt
  • -MMIME::Base64选项将加载base64编解码器模块。
  • -lpe选项使Perl像AWK一样循环输入行并隐式处理换行符。
  • 正则表达式(?=\[)|(?<=\])匹配base64块和由[...]包围的维护块之间的边界。
  • split函数将线在边界上划分为块,并将它们存储在数组中。
  • 然后遍历数组并解码找到的base64编码的条目。
  • 最后将子字符串块合并为一行以打印。