bash - 维热内密码解密
问题描述
我试图用 vigenere cipher 进行加密和解密。
它是更大任务的一部分,而 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: $0 [-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
对键中的当前字符执行相同的操作(使用模数以避免越界)
p1
然后使用和长度之间的和或差(当设置 -d 选项时)p2
来获取字母表中的字符并附加到d
.
例子
vig.sh
string: HELLOWORLD
keyphrase: FOO
-> MSZQCKTFZI
vig.sh -d
string: MSZQCKTFZI
keyphrase: FOO
-> HELLOWORLD
推荐阅读
- html - 你能检查一个 URL 是来自 NFC 轻击还是来自在地址栏中手动输入?
- python - 如何将多个数字转换为字母?
- c - 为什么这个程序打印一个空行?
- javascript - 如何在 Angular 运行时更改提供者 useValue?
- python - 使用四边形提高积分精度
- linux - gcc linaro 链接器到库
- typescript - TypeScript 中的 useState 和 useContext
- c - 为什么玩家 1 的名字没有包含在下面的代码中?
- reactjs - Framer 运动根据其他元素偏移为 x 设置动画
- mysql - SQL 查询过滤到仅适用的行