如何控制 ^ (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 进入范围
我正在尝试创建一个 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 进入范围