Xor

16 字節變數的 XOR 給出大小不等於 16 的結果

  • January 29, 2020

我正在嘗試編寫一個 XOR 程式碼來從頭開始實現 CBC 操作模式,但我似乎有一些問題。該函式需要兩個 16 字節的字節變數,預期輸出應該是 16 字節,我們從main的第一行得到它但是當該字元串轉換為字節時,大小會增加。感覺我誤會了什麼

from binascii import unhexlify
import os

def xor(string1,string2):
   list1=[]
   for i in range(len(string1)):
       list1.append(chr(string1[i]^string2[i]))
   return (("".join(list1)))

if __name__ == "__main__":
   print(len((xor(os.urandom(16),os.urandom(16))))) #always comes out 16 #type string
   print(len((xor(os.urandom(16),os.urandom(16))).encode("utf-8"))) #never equal to 16 #type byte

在實現加密時,必須將(字元的)字元串與字節向量(也稱為字節串或字節數組)區分開來。

在大多數電腦語言中,字元串儲存的是字元,而不是字節,並且對於(未編碼的)中間值、密文、密鑰、初始化向量來說是不夠的。即使對於純文字來說也是如此。在 C 中,字元可以有符號,0 結束一個字元串。在 Java 中,字元串包含 2 個字節的字元。在許多現代語言中,字元串包含抽象的 Unicode 點或其中的一個子集,或者它們以每個 UTF-8 的字節表示(每個字元 1 到 4 個字節)。

字元串加密的第一個計算步驟是將其轉換為字節向量。在現代 Python 實踐中,這可以是

myString = 'Per Pythagoras: x²+y²=z²'
myByteVector = bytes(myString, 'utf-8')

這裡將 24 個字元的字元串轉換為 27 字節的向量。碰巧的是,在使用 UTF-8 編碼的情況下,美國人認為正常字元佔用一個字節,除非它不是(這是自上一個逗號以來的兩個範例!)。

然後可以處理字節向量,XORed..(通常比字元串更自然)並且不會意外改變長度。

解密時,需要將字節結果改回¹為字元,可能是字元串。在現代 Python 中,成語可以是

myString = str(myByteVector, 'utf-8')  # can cause exception!

注意:當需要將密文、密鑰、初始化向量..表示為字元串時,應該按照一些二進製到文本的編碼對其進行編碼,例如流行的 Base64。


¹ 請注意,這並不總是可能的,例如當密文被更改或解密密鑰錯誤時。在這種情況下,最好的結果是例外;其他包括垃圾文本、顯示時的嗶聲、破壞性安全漏洞、HCF指令的執行、電傳打字機上撕毀的紙張 。

引用自:https://crypto.stackexchange.com/questions/77283