亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 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條經驗 獲得超7個贊

假設您的輸入是 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條經驗 獲得超13個贊

您可以使用和在整數和十六進制之間來回轉換十六進制。但是,該方法僅適用于整數。因此,首先您需要使用 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條經驗 獲得超8個贊

您可以使用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 關注
  • 229 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號