首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python中,如何在A之外加密UTF-8?

在python中,如何在A之外加密UTF-8?
EN

Stack Overflow用户
提问于 2019-04-22 12:48:10
回答 3查看 494关注 0票数 3

许多年前,我在Windows上用C#编写了一个程序,用凯撒密码“加密”文本文件。

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

查看一些文件,并将其与本网站进行比较,看起来UTF-8正在被移动。

我启动了Windows (因为我现在使用的是Linux ),并输入了以下内容:abcdefghijklmnopqrstuvwxyz

它生成了一个类似于十六进制的文本(移位15次):

代码语言:javascript
复制
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

我怎么才能把十六进制变成这样呢?

代码语言:javascript
复制
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,这是我到目前为止拥有的代码:

代码语言:javascript
复制
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#源代码。我可以去找它

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-22 15:34:41

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

注意,temp值不能小于0,因此可以删除第二个if-语句。

注:这超出了问题的范围,但我也注意到你在做论点解析。我强烈建议使用argparse,因为它非常简单,并且免费为您提供了很多额外的服务(即它执行错误检查,如果您使用'-- help‘选项启动应用程序,它会打印一个很好的帮助消息)。参见下面的示例代码:

代码语言:javascript
复制
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)
票数 2
EN

Stack Overflow用户

发布于 2019-04-22 13:20:59

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

代码语言:javascript
复制
hex_int = int(hex_str, 16)
cipher = hex_int - 15
hex_cipher = hex(cipher)

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

代码语言:javascript
复制
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))
票数 1
EN

Stack Overflow用户

发布于 2019-04-22 13:16:51

您可以使用int('somestring'.encode('utf-8').hex(),16)获取该网站上的确切值。如果要对每个字符应用相同的规则,可以在字符列表中这样做。您可以使用

代码语言:javascript
复制
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")的字符串中。

编辑:更新,现在它工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55794692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档