Xor Cipher解释

时间:2018-01-21 12:57:37

标签: bash encryption posix xor

当我遇到下面的代码时,我试图制作一个带有两个十进制值并将它们放在一起的XOR密码,我需要帮助理解它实际上在做什么以及如何使用它来制作我自己的密码

到目前为止,我已经接受了键和字符串的输入,然后我尝试使用xxd -bi将该字符串转换为二进制,但答案看起来很奇怪,所以我转移到bc,一旦我得到答案我可以简单地做binary(String) ^ key

如果不是正确的方法?

xor() {                                                                                                 
    key=$1                                                                                               │
    length=${#key}                                                                                       │
    while read -r -N1 byte                                                                               │
    do                                                                                                   │
        char=${key:$((i % length)):1}                                                                    │
        ((i++))                                                                                          │
        echo $((byte ^ char))                                                                            │
    done                                                                                                 │
}                                

1 个答案:

答案 0 :(得分:0)

可能有更简洁的方法来处理字符转换,但在xor函数中,您需要将每个xor'ed字符编码为2位十六进制值。这样你就可以读入编码的字符串并解码每个2位十六进制值。例如:

## endcode string on stdin to 2-digit hex using key
xor() {
    local key="$1"
    local length=${#key}
    while read -r -N1 byte
    do
        char=${key:$((i % length)):1}
        ((i++))
        printf -v byteval "%d" "'$byte"
        printf -v charval "%d" "'$char"
        printf "%02x" $((byteval ^ charval))
    done
    echo""
}

注意: "'$byte"之前的单引号前缀和"'$char"强制进行文字字符值转换)

解码更复杂一些。要执行反向xor以获取原始字符串,必须准备一个变量,其中包含xor结果的格式化十六进制或八进制文字表示(例如\0num表示八进制或{ {1}}为十六进制)。然后,您可以使用此 Unquoted 变量作为\xnum格式字符串来获取原始字符。解码示例:

printf

(注意:我需要检查零值,因为空间被解码为## decode 2-digit hex string to text using key decode() { local key="$1" local length=${#key} local res= local out= while read -r -N2 byte do char=${key:$((i % length)):1} ((i++)) printf -v byteval "%d" "0x$byte" printf -v charval "%d" "'$char" res=$((byteval ^ charval)) printf -v out "\\\x%02x" $((byteval ^ charval)) if [ "$res" -gt '0' ]; then printf $out else printf " " fi done echo"" } 而不是0。原因是二进制20(空格)为{{1注意第6位是字符串中唯一的' '。第6位也恰好对应于小写位 - 意味着任何00100000如果您设置第6位,则会获得1。因此,如果您A-Z a-z具有任何小写字符(例如您的xor键),则您将无法获得空间回来)

使用bash可以使用 herestring 将字符串值提供给每个space"xyz"。将各个部分放在一起,你可以做到:

xor

注意:我确定有更优雅的方式来处理这个问题)

示例使用/输出

decode

仔细看看,如果您有其他问题,请告诉我。单独使用Bash不是执行低级编码/解码的理想平台。如果这不是一个学习练习,那么请看看使用openssl提供的工具来完成相同的事情 - 正确。