從密碼學角度看TX常用的TEA加密演算法

2022-04-28 18:39:12 字數 1787 閱讀 8543

tea這個簡單加密演算法在中國如此有名,大概主要因為tx在大量協議,本地資料中使用這個演算法。網上很多人甚至直接將tx的加密演算法稱為tea演算法。

tx的演算法,資料分塊的加密的確採用的是tea(第一代)演算法,金鑰16個位元組,每次處理的分塊資料是8個位元組(2個32位整數),但標準的tea演算法推薦處理的輪數是32輪甚至64輪,而tx使用的是16輪。應該是為了加快速度。

tx的加密演算法,是於乙個資料流(buffer)的處理,採用的的是改進cbc的演算法(看見一blog稱這個是交織演算法,很貼切,大部分翻譯的書這個地方翻譯為塊加密,反而不好懂)。你可以這樣認為tea這類對稱加密演算法是針ecb的(electronic codebook),是處理乙個定長的資料塊的。但如果如果對於流資料只採用ecb演算法是有巨大風險的,因為對稱加密演算法的本質是相同的原文和金鑰,得到的密文肯定一致,如果對於流資料,單純的分塊處理,很容易讓人偽造密文資料(維基上都有人針對某個做ecb預算,對比原圖和加密後的影象,你仍然可以從密文上看出很多資訊)。cbc演算法對於這個問題的改造是在密文前面加入乙個隨機數生成的初始化向量iv(initialization vector),通過ecb演算法得到的密文半成品要和前乙個密文,(包括iv)進行異或預算預算得到密文,因為隨機數每次都不一致。這樣你可以認為密文是永遠不會重複的,而且這樣偽造的難度大大提公升。另外cbc的演算法是在ecb的基礎上的,所以如果你的長度不足以填充乙個塊,會進行補齊。

下圖來自維基

txcbc演算法的大致思路是,1個位元組補齊長度 + n個補齊的位元組(隨機數填充)+m個位元組的salt(隨機數)+ 資料內容+k個位元組的校驗0。補齊長度=tea演算法的塊大小8 -(非補齊資料區長度模除 % 8),而非補齊資料區長度(1位元組的補齊長度+資料內容長度+0校驗長度之和)。對於解密的校驗,在在解密後,檢查k個0的校驗欄位都是0,可以認為在不知道金鑰的情況下,進行偽造密文還是有不少麻煩。要說明的是這個演算法的第乙個block裡面是可能有原文資料的,而其演算法對於第乙個block也進行了加密處理,這個和標準演算法並不太一致(標準演算法iv是無意義的),而且由於n可能為0,其加鹽的處理是也是必須的。

先拋開加密演算法的安全性不談,吹毛求疵的說,這個實現在效能上的考慮有點欠缺。

首先這個演算法沒有考慮原文資料區位元組對齊的問題,(假如補齊的長度是2)可能會導致原文的資料每次處理都不是在對齊位置,這多少會影響一些計算效能。

另外,tea演算法是針對2個4位元組整數的演算法,並沒有規定位元組序。而tx的實現為了考慮多平台的一致性,實現內部計算時都是使用網路序。這的確嚴謹一點,但考慮到**99.99%的時候服務場景仍然是x86平台,而且x86的小頭在整數轉換上的優勢,反而不如直接要求所有環境統一成小頭位元組序運算(就是要求在大頭位元組序的環境轉換為小頭位元組序運算)。這樣就避免了大部分時候轉換網路序的消耗。

另外在每次異或的時候,是對每個位元組進行的異或處理,上面的這些問題,稍微改進一下,提高20%的速度應該是有可能的。

最後還是yy一下這個演算法的安全性,tea演算法其實足夠滿足大部分要求。雖然tea是乙個簡單加密演算法,tx使用的演算法,早已被破解了,源**也漫天飛了。但對稱加密的最主要安全性在於每人不同的的動態金鑰,不在演算法本身,而且我們要搞明白加密演算法主要用於網上的協議加密,儲存資料的簡單加密,他真正能防範的是第三方模擬,和中間點截獲報文分析。而對於木馬,不是加密演算法對抗的範疇。形象的舉例說密碼學的應用範疇是二戰潛伏在敵佔區的英國**向本土發報的報文處理,它能讓德軍截獲電報時也無法破譯,而木馬是可能潛伏在發報員身邊的德國間諜,對抗方法當然不一致。

密碼學基礎篇 密碼學的加解密

密碼簡單來說就是用不是我們所熟悉的,不能馬上識別的符號來代替的資訊。大概過程就是這樣 古典密碼學 1949年之前 主要特點 資料的安全基於演算法的保密。密碼編碼方式簡單,置換和代換。置換 把明文中的字母重新排列,字母本身不變,只是改變其位置,最簡單的置換就是把字母順序按倒敘排列。代換 就是將明文中的...

從統計學的角度看線性回歸

線性回歸是機器學習中常用的一種監督學習方法。常被用於選擇重要特徵和構造基學習器。本文將用統計學中極大似然估計和貝葉斯統計的方法推導線性回歸及正則化。極大似然估計的核心思想是找出一組引數值,使得在該引數值下,訓練樣本被觀察到的概率最大。在以下推導中,w 為回歸係數,w w0,w1,w m 1 t t ...

密碼學 密碼學中的安全性證明

安全性證明的定義是這樣的 所謂密碼演算法的安全性證明就是判定在乙個普通的攻擊模型中,密碼演算法和所依賴的可信密碼學演算法問題之間的規約關係,如果演算法的攻破 即攻擊者贏 意味著某一在密碼學中可信問題的解決,則說明該演算法是安全的,即安全性得到證明。第一次看這個概念,很懵,難道乙個可以攻破的密碼的演算...