当我遇到下面的代码时,我试图制作一个带有两个十进制值并将它们放在一起的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 │
}
答案 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提供的工具来完成相同的事情 - 正确。