如何在Python中将UTF-8加密成A-Z以外的形式?

时间:2019-04-22 12:48:10

标签: python encryption utf-8 hex

很多年前,我在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

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


更新

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

3 个答案:

答案 0 :(得分:2)

假设您输入的是ASCII文本,最简单的解决方案是将ASCII编码/解码并使用内置方法ord()chr()从字符转换为字节值,反之亦然。 / p>

请注意,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 :(得分:1)

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

hex()

现在将其循环应用,您可以根据需要向左或向右移动结果。当然,您也可以压缩代码。

hex_int = int(hex_str, 16)
cipher = hex_int - 15
hex_cipher = hex(cipher)

答案 2 :(得分: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")

将其返回到字符串

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