许多年前,我在Windows上用C#编写了一个程序,用凯撒密码“加密”文本文件。
那时候,我想要更多的角色,而不仅仅是A-Z,0-9,让它成为可能,但从未想过背后的实际理论。
查看一些文件,并将其与本网站进行比较,看起来UTF-8正在被移动。
我启动了Windows (因为我现在使用的是Linux ),并输入了以下内容:abcdefghijklmnopqrstuvwxyz
它生成了一个类似于十六进制的文本(移位15次):
70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f c280 c281 c282 c283 c284 c285 c286 c287 c288 c289我怎么才能把十六进制变成这样呢?
61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a或者有什么更简单/更好的方法来做这件事?
更新
我正在使用Python3.5.3,这是我到目前为止拥有的代码:
import sys
arguments = sys.argv[1:]
file = ""
for arg in arguments:
if arg[0] != "-":
file = arg
lines = []
with open(file) as f:
lines = f.readlines()
for line in lines:
result = 0
for value in list(line):
#value = "0x"+value
temp=value.encode('utf-8').hex()
temp+=15
if(temp>0x7a):
temp-=0x7a
elif(temp<=0):
temp+=0x7a
#result = result + temp
print (result)不幸的是,我目前还没有可用的C#源代码。我可以去找它
发布于 2019-04-22 15:34:41
假设您的输入是ASCII文本,最简单的解决方案是将其编码/解码为ASCII,并使用内置方法ord()和chr()将字符转换为字节值,反之亦然。
注意,temp值不能小于0,因此可以删除第二个if-语句。
注:这超出了问题的范围,但我也注意到你在做论点解析。我强烈建议使用argparse,因为它非常简单,并且免费为您提供了很多额外的服务(即它执行错误检查,如果您使用'-- help‘选项启动应用程序,它会打印一个很好的帮助消息)。参见下面的示例代码:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument(dest='filenames', metavar='FILE', type=str, nargs='+',
help='file(s) to encrypt')
args = parser.parse_args()
for filename in args.filenames:
with open(filename, 'rt', encoding='ascii') as file:
lines = file.readlines()
for line in lines:
result = ""
for value in line:
temp = ord(value) # character to int value
temp += 15
if temp > 0x7a:
temp -= 0x7a
result += chr(temp) # int value to character
print(result)发布于 2019-04-22 13:20:59
您可以在整数和十六进制之间使用int()和hex()来回转换十六进制。但是,hex()方法只适用于整数。因此,首先,您需要使用base=16转换为整数。
hex_int = int(hex_str, 16)
cipher = hex_int - 15
hex_cipher = hex(cipher)现在,将其应用于循环中,您可以按需要向左或向右移动结果。当然,你也可以压缩代码。
result = hex(int(hex_string, 16) - 15)
#in a loop
hexes = ['70', '71', 'c280']
ciphered = []
for n in hexes:
ciphered.append(hex(int(n, 16) - 15))发布于 2019-04-22 13:16:51
您可以使用int('somestring'.encode('utf-8').hex(),16)获取该网站上的确切值。如果要对每个字符应用相同的规则,可以在字符列表中这样做。您可以使用
import codecs
def myencode(character,diff):
temp=int(character.encode('utf-8').hex(),16)
temp+=diff
if(temp>0x7a):
temp-=0x7a
elif(temp<=0):
temp+=0x7a
result=codecs.decode(hex(temp)[2:],"hex").decode("utf-8")
return resultdiff应该是密码的移位(可以是整数)。encode('utf-8')将字符串转换为字节数组,.hex()将字节显示为十六进制。您应该一次只输入一个字符串的一个字符,这样就不会有任何问题改变一切。
在完成编码之后,需要将其解码为一个新字符,库codecs可以这样做,以将整数转换为byte (char),然后将其返回到带有decode("utf-8")的字符串中。
编辑:更新,现在它工作。
https://stackoverflow.com/questions/55794692
复制相似问题