Python 如何控制^(XOR)操作的输出在预期范围内?
我试图创建一个python脚本,其中包含严格包含数字或大写或小写字母的字符串<代码>650XYZ000X34是一个示例输入 现在,我想用范围a到B的字符替换输入的每个字符,用范围0到9的数字替换每个数字,以使输出看起来不相关。不一定要用字母表替换字母表,用数字替换数字,但我希望输出严格包含0到9范围内的字符,大写字母a到Z,小写字母a到Z 我发现对每个字符执行XOR操作可能会达到我的目标,因为XOR会使输出看起来非常不稳定。所以我写了下面的代码Python 如何控制^(XOR)操作的输出在预期范围内?,python,xor,Python,Xor,我试图创建一个python脚本,其中包含严格包含数字或大写或小写字母的字符串650XYZ000X34是一个示例输入 现在,我想用范围a到B的字符替换输入的每个字符,用范围0到9的数字替换每个数字,以使输出看起来不相关。不一定要用字母表替换字母表,用数字替换数字,但我希望输出严格包含0到9范围内的字符,大写字母a到Z,小写字母a到Z 我发现对每个字符执行XOR操作可能会达到我的目标,因为XOR会使输出看起来非常不稳定。所以我写了下面的代码 # Input to the script is not
# 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))
当然,您可以更改代码以适应您的特定环境。输出似乎很好
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))
当然,您可以更改代码以适应特定的环境。输出的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进入范围输出的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以进入范围将列表扩展到for语句中,然后可以添加调试打印语句…字符串ord('6')的第一个字符是什么,salt ord('S')的第一个字符是什么。现在进行算术运算并对其进行异或运算,结果是什么?还有,当盐用完(四个字符)时,
zip()
的结果是什么?很好。Salt需要是一个长字符串,这样它就不会用完字符。为简单起见,可以使用与输入相同的长度。请按原样执行xor,然后将其发送到一个函数,该函数将其发送到相关的Unicode范围,例如,如果num@trigonom你介意把它放在一个答案中吗?将列表理解扩展到for语句中,然后你可以添加调试打印语句…字符串ord('6')的第一个字符是什么,salt ord('S')的第一个字符是什么。现在进行算术运算并对其进行异或运算,结果是什么?还有,当盐用完(四个字符)时,zip()
的结果是什么?很好。Salt需要是一个长字符串,这样它就不会用完字符。为简单起见,可以使用与输入相同的长度。请按原样执行xor,然后将其发送到将其发送到相关Unicode范围的函数,例如,如果num@trigonom你介意把它写进一个答案吗?试一下这个能让我对输出有一个很好的了解。杰出的有什么方法可以将输出控制在字母数字范围内吗?我只是想消除字符的特殊性,并用一些东西来替换它们alphanumeric@AdeleGoldberg我完成了我的回答,所以你的输出在预期的范围内。尝试一下这个让我对输出有了一个很好的了解。杰出的有什么方法可以将输出控制在字母数字范围内吗?我只是想消除字符的特殊性,并用一些东西来替换它们alphanumeric@AdeleGoldberg我完成了我的回答,因此您的输出在预期范围内