Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何控制^(XOR)操作的输出在预期范围内?_Python_Xor - Fatal编程技术网

Python 如何控制^(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

我试图创建一个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))

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

输出似乎很好

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我完成了我的回答,因此您的输出在预期范围内