实现One Time Pad时XOR操作报错:operand expected问题排查
一次性密码本(One Time Pad)Bash实现报错修复
我尝试用Bash实现密码学中的一次性密码本(One Time Pad),步骤如下:
- 生成8位数字明文
- 生成8位数字密钥
- 将明文和密钥从ASCII转换为二进制字符串
- 对二进制字符串逐位执行XOR操作生成密文
但运行代码后出现错误:syntax error: operand expected (error token is "^ ")
原代码:
#!/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"
错误原因
Bash中${var[$i]}是数组元素访问语法,但plaintext_bin和key_bin是字符串而非数组,直接用这种写法会返回空值,导致XOR操作^没有有效操作数,触发语法错误。
修复后的代码
#!/bin/bash # 生成8位数字明文 plaintext=$(cat /dev/urandom | tr -dc 0-9 | head -c8) # 生成8位数字密钥(一次性密码本要求密钥长度与明文一致) key=$(cat /dev/urandom | tr -dc 0-9 | head -c8) # ASCII转二进制字符串 key_bin=$(echo "$key" | perl -lpe '$_=unpack"B*"') plaintext_bin=$(echo "$plaintext" | perl -lpe '$_=unpack"B*"') plaintext_bin_size=${#plaintext_bin} cipher="" # 逐位执行XOR操作 for ((i=0; i < $plaintext_bin_size; i++)); do # 用${str:i:1}取字符串第i位(从0开始计数) pt_bit=${plaintext_bin:i:1} key_bit=${key_bin:i:1} # 执行XOR运算并拼接结果 cipher+=$(( pt_bit ^ key_bit )) done echo "明文: $plaintext" echo "明文二进制: $plaintext_bin" echo "密钥: $key" echo "密钥二进制: $key_bin" echo "密文二进制: $cipher"
额外说明
- 一次性密码本的核心要求是密钥长度必须与明文完全一致且密钥仅能使用一次,这里生成的密钥与明文都是8位数字,满足长度要求。
- 移除了不必要的
sleep 1,/dev/urandom生成随机数无需等待。 - 优化了密文拼接逻辑,用
cipher+=$((...))替代冗余的字符串拼接写法,更简洁高效。
内容的提问来源于stack exchange,提问作者texonec238
相关产品推荐
相关产品推荐

