如何控制^(XOR)运算的输出在预期范围之间



我正试图创建一个python脚本,该脚本引入一个严格包含数字或大写或小写字母的字符串。CCD_ 1是示例输入。

现在,我想用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替换输入的每个字符?某种受控的XOR运算?

输出似乎很好

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可能的返回值是多少,这只涵盖1-300该功能是这样工作的,将num从范围A复制到范围B用大小比除num然后添加差异

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

最新更新