维吉尼亚密码解密

Vigenére cipher decryption

我正在尝试使用 vigenere 密码进行加密和解密。

它是更大任务的一部分,而 vigenere 扮演的角色很小。我从 bash 得到了这个加密脚本来工作。问题是我如何反向使用相同的代码来解密代码

Vigenère cipher in pure bash
#!/usr/local/bin/bash
# vigenere.sh
# http://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher

a="ABCDEFGHIJKLMNOPQRSTUVWXYZ"

[[ "${*/-d/}" != "" ]] &&
echo "Usage: [=10=] [-d]" && exit 1
m=${1:+-}

printf "string: ";read t
printf "keyphrase: ";read -s k
printf "\n"
for ((i=0;i<${#t};i++)); do
p1=${a%%${t:$i:1}*}
p2=${a%%${k:$((i%${#k})):1}*}
d="${d}${a:$(((${#p1}${m:-+}${#p2})%${#a})):1}"
done
echo "$d"

要查看它的作用,只需使用 bash -x 选项集启动它,例如,如果脚本保存在 vig.sh:

bash -x vig.sh

基本上,a 存储大写字母

-d,是一个可选参数,当设置m将被设置为-

时解密

这从输入 t 读取以存储源字符串,k

printf "string: ";read t
printf "keyphrase: ";read -s k

下面对变量 t

的字符索引进行循环
for ((i=0;i<${#t};i++)); do

p1 包含后缀以 t 中的当前字符开头的字母表已删除

p1=${a%%${t:$i:1}*}

p2 对键中的当前字符执行相同操作(使用模数以避免越界)

然后 p1p2 长度之间的和或差(当设置了 -d 选项时)用于获取字母表中的字符并附加到 d

例子

vig.sh
string: HELLOWORLD
keyphrase: FOO
-> MSZQCKTFZI

vig.sh -d
string: MSZQCKTFZI
keyphrase: FOO
-> HELLOWORLD

到运行加密,在命令中输入./vig.sh -d。应该这样做,因为您已经在代码中声明了 [[ "${*/-d/}" != "" ]]。