為了防止有目的地嘗試修改數(shù)據(jù)的對手,我們需要比錯誤檢測/糾正CRC等代碼更強(qiáng)大的解決方案。 理想情況下,任何(計(jì)算限制的)對手都不應(yīng)該能夠說服我們非法數(shù)據(jù)來自我們的設(shè)備或在我們沒有注意到的情況下修改我們的數(shù)據(jù)。在介紹兩種可能的解決方案之前,我們將回顧一些所需的構(gòu)建塊。首先,我們需要了解對稱和非對稱密碼學(xué)之間的高級差異。
可以根據(jù)私鑰的使用方式將不同的加密解決方案分組到類中。當(dāng)所有用戶共享單個私鑰時(shí),他們對密鑰材料都有相同的知識。由于每個用戶在密鑰材料上的信息是對稱的,因此此類稱為對稱加密。在另一個類中,每個用戶都有一組兩個數(shù)學(xué)上相關(guān)的密鑰:一個只有他們知道的私鑰,以及一個他們與所有人共享的公鑰。由于私鑰只有用戶知道,因此用戶之間的信息現(xiàn)在是不對稱的。
需要注意的重要區(qū)別是,在對稱加密中,每個用戶都有同一私鑰的副本,并且相同的密鑰用于兩種類型的操作:加密和解密,以及生成和驗(yàn)證簽名。在非對稱加密中,只有用戶知道其私鑰,并且只有該私鑰可用于解密或簽名數(shù)據(jù)。
需要的另一個工具是一種創(chuàng)建任意大量數(shù)據(jù)的簡短摘要或“指紋”的方法。由于加密操作的計(jì)算成本很高,因此在表示(可能更大)數(shù)據(jù)量的簡短摘要上運(yùn)行它們會更方便。
加密哈希函數(shù)采用任意長度的輸入并生成固定長度的摘要或“哈?!?,該摘要將用作數(shù)據(jù)的摘要。由于該函數(shù)將任意大的輸入映射到固定的輸出范圍,因此肯定會發(fā)生沖突。但是,通過使哈希輸出的大小足夠大,沖突概率可以忽略不計(jì)。
哈希函數(shù)的另一個重要屬性是,即使輸入數(shù)據(jù)中非常小的變化,例如一位翻轉(zhuǎn),也會導(dǎo)致輸出哈希的實(shí)質(zhì)性變化。平均而言,輸入數(shù)據(jù)中的單個位翻轉(zhuǎn)(即使數(shù)TB)將導(dǎo)致大約50%的哈希輸出位發(fā)生變化。這意味著對原始數(shù)據(jù)的微小更改將導(dǎo)致生成截然不同的摘要或摘要作為哈希函數(shù)的輸出。再加上碰撞的可能性可以忽略不計(jì),這將作為我們要保護(hù)的數(shù)據(jù)的指紋。
我們可以只加密數(shù)據(jù)嗎?
在嘗試保護(hù)數(shù)據(jù)時(shí),我們通常會想到加密。使用密鑰加密數(shù)據(jù)可以使沒有密鑰的任何人都無法讀取加密的密文。那么,我們?yōu)槭裁床粚?shù)據(jù)進(jìn)行加密以保護(hù)它呢?
加密本身僅提供機(jī)密性,不提供真實(shí)性或完整性。讓我們研究一種常用的加密方法:計(jì)數(shù)器模式下的 AES。AES 是一種對稱分組密碼,它使用共享密鑰一次加密 16 字節(jié)的數(shù)據(jù)塊。分組密碼可以在幾種不同的模式下運(yùn)行(組合每個數(shù)據(jù)塊的方法),一種常用的模式是計(jì)數(shù)器模式。在這種模式下,有一個單調(diào)遞增的計(jì)數(shù)器,該計(jì)數(shù)器被加密以產(chǎn)生偽隨機(jī)密鑰流。為了加密數(shù)據(jù),此密鑰流與明文輸入進(jìn)行異或運(yùn)算以生成密文。
密文可以與使用的初始計(jì)數(shù)器值(初始化向量)一起存儲或發(fā)送,以便以后使用相同的密鑰解密。解密時(shí),將加載初始計(jì)數(shù)器值,并使用相同的密鑰再次加密以生成相同的密鑰流。此密鑰流與密文進(jìn)行 XOR 運(yùn)算,以取消加密操作并恢復(fù)明文。
如果對密文的修改也以可預(yù)測的方式修改基礎(chǔ)明文,則密文稱為可延展性。計(jì)數(shù)器模式下的分組密碼(以及其他流密碼)具有微不足道的延展性。翻轉(zhuǎn)密文中的單個位將在解密時(shí)翻轉(zhuǎn)明文中的相同位,而不會更改任何其他位。這意味著攻擊者可以輕松修改加密數(shù)據(jù)并預(yù)測此更改對解密數(shù)據(jù)的影響,即使他們不知道密鑰或基礎(chǔ)明文消息也是如此。
考慮有兩個系統(tǒng)通過無線發(fā)送和接收在計(jì)數(shù)器模式下使用 AES 加密的消息進(jìn)行通信的情況。攻擊者可能能夠攔截通信,即使他們可能無法解密消息,他們也知道他們可以翻轉(zhuǎn)密文中的位以翻轉(zhuǎn)明文中的相同位。在某些情況下,可能很容易猜到明文可能是什么。這些類型的機(jī)器對機(jī)器通信通常具有結(jié)構(gòu)化和可預(yù)測的格式。攻擊者可能已經(jīng)獲得了與之相關(guān)的文檔,或者可能只是能夠猜測它或?qū)ζ溥M(jìn)行逆向工程。
在我們的示例中,攻擊者想要中斷運(yùn)營中心的訂單。攻擊者知道交換消息的格式(通過閱讀用戶手冊),處理訂單的命令是“fill”,刪除訂單的命令是“kill”。在上圖中,我們可以看到執(zhí)行訂單的命令已正確加密和解密。讓我們看看攻擊者如何在不被發(fā)現(xiàn)的情況下更改此命令,即使消息將被加密!
攻擊者知道明文消息中“fill”命令的位置,并希望惡意將命令更改為“kill”,以導(dǎo)致訂單被取消,而不是履行。
首先,攻擊者計(jì)算消息 M = “填充” 和 M' = “kill” 之間的差?。通過?包含明文消息“fill”的密文塊進(jìn)行異或運(yùn)算,解密消息中的字符“f”將更改為“k”!
由于僅加密并不能阻止這些數(shù)據(jù)被修改,我們可以通過加密消息及其CRC來保護(hù)其完整性嗎?攻擊者不會知道CRC的值,如果他們修改密文,CRC應(yīng)該檢測到修改,對吧?正如我們在上一節(jié)中看到的,加密可以是可延展的,不幸的是,加密的CRC也可以。
假設(shè)我們有一個加密的消息M,它也包含該消息上的加密CRC,并且我們知道密文中與加密CRC相對應(yīng)的位置。如果我們想將消息 M 修改為新消息 M',我們還需要修改 CRC。
設(shè) ? = M ? M' 是原始消息 M 和新消息 M' 之間的差值。這是兩個異或一起,或者已經(jīng)改變的位(如果?的每個位是我們翻轉(zhuǎn)的消息中的位,則為 1)。原始 CRC 與新計(jì)算的 M' 上的 CRC 不匹配。我們需要修改 CRC,使其在新消息 M' 上有效。
由于CRC是一個線性函數(shù),CRC(M') = CRC(M) ? CRC(?)。換句話說,為了獲得一個新的有效CRC,我們計(jì)算?上的CRC函數(shù)(我們已經(jīng)更改的位的CRC),并使用CRC對這個值進(jìn)行XOR。正如我們之前看到的,我們甚至可以在密文上完成所有這些操作,甚至不知道消息的真實(shí)值或 CRC 的值,我們可以使用有效的 CRC 將消息更改為我們想要的任何內(nèi)容!
這種弱點(diǎn)不僅僅是理論上的。它存在于有線等效保密 (WEP) 算法中,該算法允許以類似的方式修改 WEP 流量。
因此,僅僅加密數(shù)據(jù)本身并不能保護(hù)它不被修改,加密的CRC也不能。如果明文CRC,加密數(shù)據(jù)或加密數(shù)據(jù)及其CRC不能保護(hù)我們的數(shù)據(jù)免受故意修改,那又有什么作用呢?
審核編輯:郭婷
-
crc
+關(guān)注
關(guān)注
0文章
199瀏覽量
29465 -
計(jì)數(shù)器
+關(guān)注
關(guān)注
32文章
2256瀏覽量
94568 -
AES
+關(guān)注
關(guān)注
0文章
104瀏覽量
33234
發(fā)布評論請先 登錄
相關(guān)推薦
評論