如何在 python 中对 AZ 以外的 UTF-8 进行加密?

许多年前,我在 Windows 上用 C# 编写了一个程序,该程序使用(我认为是)caeser chiher 来“加密”文本文件。


那时我想要更多的角色,而不仅仅是 AZ,0-9 并使它成为可能,但从未考虑过它背后的实际理论。


查看一些文件,并将其与此网站进行比较,似乎 UTF-8 正在被转移。


我启动了一个 Windows VM(因为我现在使用的是 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

或者有没有更简单/更好的方法来做到这一点?


更新

我正在使用 Python 3.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# 源代码。我可以试着找到它


慕尼黑5688855
浏览 196回答 3
3回答

LEATH

假设您的输入是 ASCII 文本,最简单的解决方案是将编码/解码为 ASCII 并使用内置方法ord()并将chr()字符转换为字节值,反之亦然。请注意,该temp值不能小于 0,因此可以删除第二个 if 语句。注意:这超出了问题的范围,但我也注意到您正在自己解析参数。我强烈推荐使用argparse它,因为它非常简单并且免费为您提供了很多额外的东西(即它执行错误检查,并且如果您使用'--help' 选项启动应用程序,它会打印一个很好的帮助消息)。请参见下面的示例代码:import argparseparser = argparse.ArgumentParser()parser.add_argument(dest='filenames', metavar='FILE', type=str, nargs='+',&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; help='file(s) to encrypt')args = parser.parse_args()for filename in args.filenames:&nbsp; &nbsp; with open(filename, 'rt', encoding='ascii') as file:&nbsp; &nbsp; &nbsp; &nbsp; lines = file.readlines()&nbsp; &nbsp; for line in lines:&nbsp; &nbsp; &nbsp; &nbsp; result = ""&nbsp; &nbsp; &nbsp; &nbsp; for value in line:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; temp = ord(value)&nbsp; # character to int value&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; temp += 15&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if temp > 0x7a:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; temp -= 0x7a&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result += chr(temp)&nbsp; # int value to character&nbsp; &nbsp; &nbsp; &nbsp; print(result)

萧十郎

您可以使用和在整数和十六进制之间来回转换十六进制。但是,该方法仅适用于整数。因此,首先您需要使用 base=16 转换为整数。int()hex()hex()hex_int = int(hex_str, 16)cipher = hex_int - 15hex_cipher = hex(cipher)现在在循环中应用它,您可以根据需要向左或向右移动结果。你当然也可以压缩代码。result = hex(int(hex_string, 16) - 15)#in a loophexes = ['70', '71', 'c280']ciphered = []for n in hexes:&nbsp; &nbsp; ciphered.append(hex(int(n, 16) - 15))

慕田峪9158850

您可以使用int('somestring'.encode('utf-8').hex(),16)来获取该网站上的确切值。如果您想对每个角色应用相同的规则,您可以在角色列表中进行。您可以使用import codecsdef myencode(character,diff):&nbsp; &nbsp; temp=int(character.encode('utf-8').hex(),16)&nbsp; &nbsp; temp+=diff&nbsp; &nbsp; if(temp>0x7a):&nbsp; &nbsp; &nbsp; &nbsp; temp-=0x7a&nbsp; &nbsp; elif(temp<=0):&nbsp; &nbsp; &nbsp; &nbsp; temp+=0x7a&nbsp; &nbsp; result=codecs.decode(hex(temp)[2:],"hex").decode("utf-8")&nbsp; &nbsp; return resultdiff应该是密码的移位(可以是整数)。encode('utf-8')将字符串转换为字节数组并将.hex()字节显示为十六进制。您应该一次只为这个函数提供一个字符串的一个字符,这样就不会出现转移所有内容的问题。完成编码后,您需要将其解码为新字符,您可以通过库codecs将其从整数转换为byte( char),然后将其返回为字符串decode("utf-8")编辑:已更新,现在可以使用了。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python