为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕尼黑5688855 2022-01-18 16:44:10
许多年前,我在 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 sysarguments = sys.argv[1:]file = ""for arg in arguments:    if arg[0] != "-":        file = arglines = []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# 源代码。我可以试着找到它
查看完整描述

3 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

假设您的输入是 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)


查看完整回答
反对 回复 2022-01-18
?
萧十郎

TA贡献1815条经验 获得超12个赞

您可以使用和在整数和十六进制之间来回转换十六进制。但是,该方法仅适用于整数。因此,首先您需要使用 base=16 转换为整数。int()hex()hex()


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))


查看完整回答
反对 回复 2022-01-18
?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

您可以使用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 result

diff应该是密码的移位(可以是整数)。encode('utf-8')将字符串转换为字节数组并将.hex()字节显示为十六进制。您应该一次只为这个函数提供一个字符串的一个字符,这样就不会出现转移所有内容的问题。


完成编码后,您需要将其解码为新字符,您可以通过库codecs将其从整数转换为byte( char),然后将其返回为字符串decode("utf-8")


编辑:已更新,现在可以使用了。


查看完整回答
反对 回复 2022-01-18
  • 3 回答
  • 0 关注
  • 193 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信