我正在尝试创建一个用于密码学的 One Time Pad,但我遇到了一个错误
计划是
#!/bin/bash
#Create Message #1
plaintext=`cat /dev/urandom | tr -dc 0-9 | head -c8`
sleep 1
#Generate Random Sequence
key=`cat /dev/urandom | tr -dc 0-9 | head -c8`
#Ascii to Binary Convertion
key_bin=$(echo $key | perl -lpe '$_=unpack"B*"')
plaintext_bin=$(echo $plaintext | perl -lpe '$_=unpack"B*"')
plaintext_bin_size=${#plaintext_bin}
key_bin_size=${#key_bin}
for ((i=0; i < $plaintext_bin_size; i++)); do
byte=$((${plaintext_bin[$i]} ^ ${key_bin[$i % $key_bin_size]}))
cipher="$cipher($byte)"
done
echo -e "$cipher"
但是我明白了
syntax error: operand expected (error token is "^ ")
Bash 哽咽了:
byte=$((${plaintext_bin[$i]} ^ ${key_bin[$i % $key_bin_size]}))
...它解释为:
byte=$(( ^ ))
原因是
plaintext_bin
和 key_bin
不是数组,而只是字符串。要从字符串变量中提取第 N 个字符,请使用 ${var:N:1}
表示法:
byte=$(( ${plaintext_bin:$i:1} ^ ${key_bin:$i % $key_bin_size:1} ))