如何在python中将UTF-8加密到A-Z之外?

问题描述 投票:3回答:3

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

那时候我想要的不仅仅是A-Z,0-9这些角色,并且让它成为可能,但从未想过它背后的实际理论。

查看一些文件,并将其与this website进行比较,看起来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

或者有更简单/更好的方法吗?


UPDATE

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

python encryption utf-8 hex
3个回答
2
投票

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

1
投票

你可以使用integershexint()hex()之间来回转换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))

0
投票

您可以使用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将其从整数转换为bytechar),然后将其返回到带有decode("utf-8")的字符串

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

© www.soinside.com 2019 - 2024. All rights reserved.