如何控制 ^ (XOR) 运算的输出落在预期范围内?

How to control the output of an ^ (XOR) operation to fall between expected range?

我正在尝试创建一个 python 脚本,其中包含一个严格包含数字或大写或小写字母的字符串。 650XYZ000X34 是示例输入。

现在,我想用 A 到 B 范围内的字符和 0 到 9 范围内的每个数字替换输入的每个字符,以便输出看起来不相关。不一定要用字母替换字母,用数字替换数字,但 我希望输出严格包含 0 到 9 范围内的字符,大写 A 到 Z 和小写 a 到 z

我发现对每个字符执行 XOR 运算可能会实现我的目标,因为 XOR 会从某些东西中产生一些东西,这使得输出看起来非常不相关。所以我写了下面的代码。

# Input to the script is not longer than 12 characters
import sys

def myxor(s1, s2):
    a_list = [chr(ord(a) ^ ord(b)) for a,b in zip(s1, s2)]
    return "".join(a_list)

input = str(sys.argv[1])
secret = myxor('MySaLtToTestSomething', input)
print("The secret key computed is: " + secret)

但是上面的问题是650XYZ000X34输出et|。输出很小,并且包含 我不想要的特殊字符 。有没有办法让方法 myxor 将输入的每个字符替换为 0 到 9 之间的数字或从大写字母 A 到 Z 或小写字母 a 到 z 的字母表?某种受控的异或运算?

输出似乎没问题

for a, b in zip('SaLt','650XYZ000X34'):
    print (a,b,'-->',chr(ord(a) ^ ord(b)))

S 6 --> e
a 5 --> T
L 0 --> |
t X --> ,

请记住,zip 仅匹配两个字符串中最小的字符串,其余未匹配的较长字符串将被忽略。

现在要使输出落在范围内,您可以尝试这样的操作:

for a, b in zip('SaLt','650XYZ000X34'):
    xor=ord(a) ^ ord(b)
    while True:
      if xor<65:    
         xor=xor%10  # selects a number between 48 and 57
         i=48
         break
      if xor<97:
         xor=xor%26   # selects a number between 65 and 90
         i=65
         break
      xor=xor%26      # selects a number between 97 and 122
      i=97
      break         
    print (a,b,'-->',chr(i+xor))

你的结果将是

SaLt
S 6 --> x
a 5 --> G
L 0 --> u
t X --> 4

Appalachian  
A 6 --> p
p 5 --> R
p 0 --> 4
a X --> 7
l Y --> 3
a Z --> 9
c 0 --> F
h 0 --> K
i 0 --> L
a X --> 7
n 3 --> P

当然,您可以更改代码以适应您的特定环境。

你输出的 Unicode 范围是 48-57 是 1-9,65-90 是 A-Z,97-122 是 a-z 所以

def toChar(num):
    if 100>num>0:
        if 58>num>47 or 91>num>64 or 123>num>97: # if its in desire output range, return it
            return chr(num)
        return chr(int(num/10+48)) #copy it to 48-57
    if 200>num>99:
        return chr(int(num/4+40)) #copy it to 65-90
    if 300>num>199:
        return chr(int(num/4+47)) # copy it to 97-122


我不确定 xor 的可能 return 值是多少,这只涵盖 1-300 该功能是这样工作的, 将 num 从范围 A 复制到范围 B 将 num 除以大小比 然后添加差异

例如 从 100-200 复制到 30-40 先除以 10,因为范围扩大了 10 倍 然后加 20 进入范围