tea加密java
1. 什麼是TEA演算法
TEA演算法被廣泛地應用於計算機數據加密領域,OICQ的數據安全採用了TEA演算法。本文討論了TEA的演算法的原理及實現,並揭示了QQ中該演算法的應用,本文是靈鑰科技公司(www.panakes.com)在即時通信密碼研究公開的第一篇論文,今後我們將陸續發表相關的論文及相應的產品。
TEA演算法簡介
TEA演算法是由劍橋大學計算機實驗室的DavidWheeler和RogerNeedham於1994年發明.TEA是TinyEncryptionAlgorithm的縮寫。特點是加密速度極快,高速高效,但是抗差分攻擊能力差。
TEA加密演算法是一種分組密碼演算法,其明文密文塊64比特(8位元組),密鑰長度128比特(16位元組)。TEA加密演算法的迭代次數可以改變,建議的迭代次數為32輪,盡管演算法的發明人強調加密16輪就很充分了。兩個TEAFeistel周期算為一輪。圖1示例了TEA一輪的加密流程。
以下示例了TEA的C語言加密演算法,TEA的解密演算法與加密演算法類似。
#defineTEA_ROUNDS0x20
#defineTEA_DELTA0x9E3779B9
#defineTEA_SUM0xE3779B90
voidtiny_encrypt(unsignedlong*constv,unsignedlong*constw,
constunsignedlong*constk)
{
registerunsignedlong
y=v[0],
z=v[1],
a=k[0],
b=k[1],
c=k[2],
d=k[3],
n=TEA_ROUNDS,
sum=0,
delta=TEA_DELTA;
while(n-->0){
sum+=delta;
y+=(z<<4)+a^z+sum^(z>>5)+b;
z+=(y<<4)+c^y+sum^(y>>5)+d;
}
w[0]=y;
w[1]=z;
}
TEA演算法利用的不斷增加的(即源程序中的delta)值作為變化,,就是黃金分割率。它的作用是使得每輪的加密是不同。的准確值可能不太重要。但是在這里,它被初始化為
=0x9e3779b
QQ是如何利用TEA進行加密的?
TEA演算法被廣泛應用於QQ的數據加密中,QQ採用16輪的TEA演算法加密,在這時採取16輪加密時而不採取標準的32輪加密時為了減少驗證伺服器的壓力。QQ在數據加密前採用了密碼學中的常用的填充及交織技術,減少加密數據的相關性,增加破譯者的破解難度。
下表列出了QQ應用TEA演算法幾個方面
序號
應用
相關文件
1
通訊報文的加密/解密
2
消息記錄的加密/解密
MsgEx.db
3
本地消息密碼、首次登錄時間、提示內容驗證密碼
Matrix.db
4
消息備份文件
*.bak
QQ的TEA演算法源程序分析
QQ在進行TEA加密前採用ntohl函數對原文數據和加密密鑰進行了變換,從網路位元組順序轉換位主機位元組順序進行加密後,再通過htonl函數將數據轉換為網路位元組順序的數據。
為什麼要這樣做呢?因為不同的計算機使用不同的位元組順序存儲數據。因此任何從Winsock函數對IP地址和埠號的引用和傳給Winsock函數的IP地址和埠號均時按照網路順序組織的。
為防止分析者分析出QQ是採用TEA加密演算法的,程序的設計者採用了subeax,61C88647h指令,而不採用Addeax9e3779b9h指令。因為分析者只需要判斷9e3779b9h(即是我們前面提的黃金分割率的值)就知道採用了TEA加密演算法。
sub_409A43procnear;CODEXREF:sub_409B8C+AEp
;sub_409B8C+109p...
var_10=dwordptr-10h
var_C=dwordptr-0Ch
var_8=dwordptr-8
var_4=dwordptr-4
arg_0=dwordptr8
arg_4=dwordptr0Ch
arg_8=dwordptr10h
pushebp
movebp,esp
subesp,10h
pushebx
pushesi
movesi,[ebp+arg_0]
pushedi
pushdwordptr[esi];netlong
callntohl
pushdwordptr[esi+4];netlong
movedi,eax;y
callntohl
movebx,eax;z
moveax,[ebp+arg_4]
leaecx,[ebp+var_10]
leaesi,[ebp+var_10]
subeax,ecx
mov[ebp+arg_0],4
mov[ebp+arg_4],eax
jmpshortloc_409A7C
;哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text:00409A79
loc_409A79:;CODEXREF:sub_409A43+49j
moveax,[ebp+arg_4]
loc_409A7C:;CODEXREF:sub_409A43+34j
pushdwordptr[eax+esi];netlong
callntohl;對k[0],k[1],k[2],k[3]進行ntohl變化,
mov[esi],eax
addesi,4
dec[ebp+arg_0]
jnzshortloc_409A79
push10h;做十六輪TEA運算
xoreax,eax
popecx
loc_409A93:;CODEXREF:sub_409A43+88j
movedx,ebx
movesi,ebx
shredx,5;z>>5
addedx,[ebp+var_C];z>>5+k[1]
subeax,61C88647h;sum=sum+deltadelta:0x9e3779b9
shlesi,4;z<<4
addesi,[ebp+var_10];z<<4+k[0]
xoredx,esi;(z>>5+k[1])^(z<<4+k[0])
leaesi,[eax+ebx];sum+z
xoredx,esi;(z<<4+k[0])^(sum+z)^(z>>5+k[1])
addedi,edx;y+=(z<<4+k[0])^(sum+z)^(z>>5+k[1])
movedx,edi
movesi,edi
shredx,5;y>>5
addedx,[ebp+var_4];y>>5+k[3]
shlesi,4;y<<4
addesi,[ebp+var_8];y<<4+k[2]
xoredx,esi;(y>>5+k[3])^(y<<4+k[2])
leaesi,[eax+edi];(sum+y)
xoredx,esi;(y<<4+k[2])^(sum+y)^(y>>5+k[3])
addebx,edx;z+=(y<<4+k[2])^(sum+y)^(y>>5+k[3])
dececx
jnzshortloc_409A93
pushedi;hostlong
callhtonl
movesi,[ebp+arg_8]
pushebx;hostlong
mov[esi],eax;加密結果
callhtonl
mov[esi+4],eax;加密結果
popedi
popesi
popebx
leave
retn
sub_409A43endp
結論
作為一種分組加密演算法,TEA加密演算法在其發展的過程中,目前出現了幾種針對TEA演算法設計的缺陷攻擊方法,使得原有的TEA加密演算法變得不安全,在過去的十幾年中,TEA演算法進行了若干次的改進,歷經XTEA,BlockTEA,XXTEA幾個版本。目前最新的演算法是XXTEA。
QQ採用了最初的TEA演算法做其核心的加密演算法,QQ在採用TEA演算法時採用了16輪的加密,其加密復雜度比32輪減了許多。利用TEA演算法的設計缺陷,使得快速破解QQ密碼成為可能。
值得一提的QQ在利用TEA演算法做加密時,採用了交織及隨機填充隨機數的技術,增加了密碼分析者分析難度,從一定程度上保護了信息的安全。
更多信息請訪問www.panakes.com
TEA(Tiny Encryption Algorithm) 是一種優秀的數據加密演算法,雖然它比 DES(Data Encryption Standard) 要簡單得多, 但有很強的抗差分分析能力,加密速度也比 DES 快得多,而且對 64 位數據加密的密鑰長達 128 位,安全性相當好。 下面的程序來自盧開澄《計算機密碼學》(清華大學出版社)。
補充:為了使這段程序更加實用,我將其整理為幾個單元, 分別用於 Delphi 和 C++Builder 。包括對數據流 TMemoryStream 和字元串的加密/解密功能, 對字元串的加密/解密還通過 Base64 編碼/解碼,保持加密後的字元串仍為字元串。
// v[2] : 64bit data, k[4] : 128bit key
void encipher( unsigned long * const v, const unsigned long * const k )
{
register unsigned long y = v[0], z = v[1], sum = 0, delta = 0x9E3779B9,
a = k[0], b = k[1], c = k[2], d = k[3], n = 32;
while ( n-- > 0 )
{
sum += delta;
y += ( z << 4 ) + a ^ z + sum ^ ( z >> 5 ) + b;
z += ( y << 4 ) + c ^ y + sum ^ ( y >> 5 ) + d;
}
v[0] = y;
v[1] = z;
}
void decipher( unsigned long * const v, const unsigned long * const k )
{
register unsigned long y = v[0], z = v[1], sum = 0xC6EF3720, delta = 0x9E3779B9,
a = k[0], b = k[1], c = k[2], d = k[3], n = 32;
// sum = delta << 5, in general sum = delta * n
while ( n-- > 0 )
{
z -= ( y << 4 ) + c ^ y + sum ^ ( y >> 5 ) + d;
y -= ( z << 4 ) + a ^ z + sum ^ ( z >> 5 ) + b;
sum -= delta;
}
v[0] = y;
v[1] = z;
}
2. 電子郵件證書有哪些功能
電子郵件證書是在互聯網上證明電子郵件身份的唯一標識,用於加強身份認證,大大降低大型網站和各企事業單位部署基於客戶端證書的強身份認證技術的成本,從而快速推動基於客戶端證書的強身份認證技術在企業管理信息系統中的普及應用。
電子郵件證書主要是用來對電子郵件通信進行加密和數字簽名的,為用戶和員工提供雙因素身份驗證,保護通過網路發送的重要公司文檔,並進行身份驗證以確保他們有權訪問在線伺服器。
安全電子郵件證書應用
電子郵件證書應用范圍比較廣,適用於各行各業的電子郵件。電子郵件證書利用PKI的公鑰加密技術,以電子郵件證書作為公鑰的載體,發件人使用郵件接收者的數字證書中的公鑰對電子郵件的內容和附件進行加密,加密後的郵件只能由接收者持有的私鑰才能解密,因此只有郵件接收者才能閱讀,其他人截獲該郵件看到的只是加密後的亂碼信息,這樣就可確保電子郵件在傳輸過程中不被他人閱讀,防止了機密信息的泄露
3. QQ工作原理是什麼
首先QQ客戶端向伺服器發送一個請求登錄令牌的數據包.伺服器返回登錄令牌.這個令牌是在伺服器端生成的.和客戶端的IP地址,版本信息等數據相關.以後會用到這個令牌去進行其他操作.
在QQ客戶端得到登錄令牌之後.就會向伺服器發送一個包含登錄信息的登錄請求.要求登錄.服務順會首先看看客戶端的號碼.I守址和版本是否可以在本伺服器上進行登錄.如果可以的話,就驗證客戶端的登錄信息是否與伺服器上保存的登錄信息進行比較.匹配的就向客戶端返回一個登錄成功的數據包.不匹配返回登錄失敗.因為QQ的伺服器有很多台.可能要分管不同的QQ版本.IP等.所以如果客戶端的號碼.IP地址和版本無法在本伺服器進行登錄.伺服器就返蜀犬吠日一個重定向包.讓客戶端去另外一台伺服器登錄.其實整個QQ登錄過程就是這么簡單的兩個步驟.
了解了QQ登錄的過程後.我們還需要知道具人本的數據包格式.以便解析出我們需要的數據內容.QQ登錄過程的數據包分為頭部.內容和尾部三個部分.其中頭的格式固定為:0x02客戶端版本 命令 序列號 QQ號碼. 其中0x02是1個位元組的標志;客戶端版本2個位元組.用於表示QQ客戶端的版本;命令2個位元組.表示要發送的命令類型.例如請求登錄令牌登錄請求等;序列號是一個2位元組的隨機數,在一次QQ會話中通過它來確認回應包是否對應請求包.QQ客戶端默認每次加1;QQ號碼就是4位元組的QQ號.對於伺服器來說是每個欄位是無所謂的.QQ登錄過程數據包的尾部固定為0x03.
1. 請求登錄令牌包
包內容就是對一次命令的具體信息,對於第一次發送的請求登錄令牌包來說,包命令是0x0062,整個請求包如下所示;
而伺服器返回包則相對復雜一些,如下所示;
其中0x18表示登錄令牌的長度,現在QQ默認的登錄令牌長度是0x18.這個令牌是在伺服器端生成的.具體的生成演算法我們當然還無從得知,應該是參考了QQ客戶端的I守址.埠和其他一些信息生成這個令版的,因為你把在A機器上得到的令牌用到B機器上,你就會登錄不了.如果你把A機器上的IP給改了.你照樣也登錄不了.
2. 登錄包.
對於我們嗅探QQ密碼來說,最重要的就是這個登錄包.在這里包含了和QQ密碼相關的信息.登錄包的具體結構如下;
其中初始密鑰是一個16位元組的隨機數,用於本身的加密.這里最重要的就是密碼密鑰加密的一個空字元串.
所謂密碼密鑰就是用QQ口呤進行兩次MD5加密後得到的密文,然後以這個密文作為密鑰去加密一個空字元串,這次加密使用了反饋的TEA演算法,加密結果放在QQ登錄包里,讓伺服器去驗證,由於QQ的加密演算法使用特殊的填充機制使用QQ伺服器可以驗證出用戶密碼是否正確,這個會在後面進行詳細的解釋.QQ登錄包裡面還有一些諸如登錄狀態,登錄令版和很多未知的內容.但是這些對於我們破解QQ密碼來說都沒有什麼太大的作用.
需要特別提到的是,前面的請求登錄令牌包是不加密的,而這個登錄包除了初始密鑰本身以外的部分都要用初始密鑰進行加密,加密演算法同樣是反饋的TEA.
QQ伺服器在收到這個登錄包之後,首先要用初始密鑰解密登錄包後面的部分,如果解密成功,就會用保存在伺服器上的密信息去解密密碼密鑰加密的那個空字元串密文,我現在還不確定QQ伺服器上保存的是密碼明文還是密碼密鑰.猜測是密碼密鑰.這樣伺服器就用密碼密鑰去解密那段16位密文,如果用戶提交的密碼是正確的.才可以解密成功.否則解密函數會返回空,認證就失敗了.當驗證QQ客戶端密碼准確無誤後.就返回一個登錄成功包.格式如下:
QQ的加密演算法
了解了上面的QQ登錄的通信協議之後還不足以破解QQ密碼,我們還需要掌握QQ的加密演算法.前面提到了,密碼密鑰是用戶密碼進行兩次MD5加密之後得到的結果.然後再用空個結果作為密鑰使用TEA演算法進行加密.TEA是Tiny Encrypt Arithmetic的縮寫.顧名思義就是一種比較簡單的小型加密演算法.它用一個16位元組的密鑰去加密一個8位元組的明文.得到一個8位元組的密文.也可以反向從密文解密出明文.具體的演算法可以到網上搜索查閱.這里就不在贅述了.
但是QQ使用的TEA雖然是標準的TEA.但是QQ卻使用了一種自己特殊的填充反饋機制,QQ消息被分為多個加密單元.每一個加密單元都是8位元組.使用TEA進行加密.加密結果再作為下一個單元的密鑰.如果明文本身的長度不是8的倍數.那麼還要進行填充.使其成為8的倍數.填充的時候會用一個32位隨機數存放於明文的開始位置.再在明文的最後用0填充為整個長度是8的倍數.由於會向後反饋這樣即使對於相同的明文,因為使用了不同的隨機數.也會產生完全不同的密文.
使用這種特殊的填充反饋演算法所導致的結果就是,一段密文只能用加密它的密鑰進行解密.如果使用不正確的密鑰.就無法得到正確的填充結果.最常見的就是解密後得到的填充數值不是0,這樣就判斷解密失敗.
4. TEA加密演算法的介紹
TEA演算法由劍橋大學計算機實驗室的David Wheeler和Roger Needham於1994年發明。它是一種分組密碼演算法,其明文密文塊為64比特,密鑰長度為128比特。TEA演算法利用不斷增加的Delta(黃金分割率)值作為變化,使得每輪的加密是不同,該加密演算法的迭代次數可以改變,建議的迭代次數為32輪。
5. TEA加密演算法的應用
QQTEA 演算法建立在標准 TEA演算法的基礎上,使用16輪的加密(這是最低限,推薦應該是32輪)。QQ在使用這個演算法的時候,由於需要加密不定長的數據,所以使用了一些常規的填充辦法和交織演算法。
1 填充演算法
如果明文本身的長度不是8的倍數,那麼還要進行填充以使其成為8的倍數。以位元組為單位,令N=原始字元串+10+填充位元組數n,則N應該是8的倍數。
具體的填充方法:第一個位元組為:(random()&0xf8)|n,隨後填充(n+2)個位元組random()&0xff ,後面接原始數據,最後填充7 個位元組0x00 。
因為使用了不同的隨機數,所以填充的結果使得即使對於相同的明文,密文的結果也會不同。
2 交織演算法
消息被分為多個加密單元,每一個加密單元都是8位元組,使用TEA進行加密,加密結果與下一個加密單元做異或運算後再作為待加密的明文。
6. 招新——第一次嘗試破解tea演算法
物拿正 開始接觸逆向分析時,入門級別的一道題目,是一個師兄寫的考核題《sotired》,嘗試著破解了下,以下是具體的過程。
1、雙擊發現打不開,應該是linux系統下的文件(事實證明確實如此,我在虛擬機那裡驗證了一下,隨便輸入字元串,得到的答案是sorry~,給人crakeme的感覺,哈哈)
2、使用反匯編工具ida64位,將文件拖進去,找到main函數,使用F5大法,得到下面的界面:
看到sorry~和wow!congratulation!的字元串,可以推斷出有字元串的對比,看到if語句,沒錯就是它了,看來temp[k]裡面有我們想要的東西(用於匹配比較的正確密文)點進去,得到
這里利用一個小插件lazyida,哈哈哈(我比較懶),得到密文,
在這里需要聲明下,因為最後讀出來的那個0x00111885B有誤(lazyida的原因),其實是0x32111885B才對,所以是 0x572CB9C1, 0x73A6EB63, 0x069E6A55, 0x818E33D9, 0x7ED0A862, 0x3211885B,這些16進制的數就是密文啦!有了密文,我們要破解它,就需要找密鑰啦,回去看函數
想像下,用戶輸入一組字元串,for循環了3次,atoui函數猜測應該是某種轉換函數,點進去
果然是移位加密轉換,結果是int 型,所以v11[6]的字元數據全部被轉換了數字,繼續往下
又有3次循環,看到encipher函數應該是加密函數來的,然後傳遞了兩個參數,一個是轉化後的v11,另一個v7,這里就可以懷疑了,v7應該是密鑰,而且用了引用,難道是地址嗎?很奇怪,點進去v7,得到
這里又要懷疑了,前面4個都是?一個數字有4個數據,感覺很像數組的樣子,於是嘗試一波
轉換為數組,然後F5大法刷新下!得到
看來我們的推斷是正敏薯確的,v7是一個數組,裡面的數據應該是密鑰了!到此,我們成功地拿到了密文和密鑰了,接下來就是解密罩悔了,解密前需要知道是怎麼加密的,回到剛剛的encipher函數,進去
看到這里有人可能要很激動了,這個演算法不就是tea演算法嗎?!(沒錯,雖然我一開始也不知道,於是我去谷歌了一波!)
tea演算法就是把密文結合密鑰進行移位再異或的運算,總共進行32輪。解密則是反過來求解,不過需要先算出delta的值,即9e3779b9*32後得到13c6ef3720,明顯溢出了(手賤算了下,溢出。tea演算法把溢出的忽略了,emmmm,我也不太懂其中的原因,能用先用著,哈哈哈),於是乎,可以寫腳本了,打開c++,寫入腳本
我們的密文和密鑰修改好後,因為有密文有6個16進制的數,所以解密3次,得到結果
好啦,這就是我們的flag了,但是看不懂是吧,沒關系,去轉換下,谷歌走起!
大家記得把空格消除,然後把它和在一起轉化,好啦,虛擬機linux操作系統打開,文件打開,輸入flag,得到的就是WOw!congratulation!
以上便是我花了一個下午整理出來的一個逆向題目,希望對大家有幫助,也希望能多多交流哦,嘻嘻~
7. 自己的加密演算法別人能破譯嗎
你的加密是針對那些對象嗎?要對付專家級以上的是不可能的.一般的喃就看他願不願意花時間來破你的文件了.現在免費的破譯軟體有的事.如果你只是不想讓別人看到你的隱私而已那你自己的和下在免費密碼編輯器都可以考慮了
8. TEA是什麼
要是說英語的話應該是茶的意思吧。不過它也是Trust Email Available的簡寫,這是天威誠信推出譽困鬧的一款郵件安全證書,而且是一款即插即用,高強度安全的硬證書,可以保證電子郵件內容的真慶罩實、保密、完整及不可否認。
TEA可以直接面向所有對電子郵件有安全需求的用戶,如公司、企業、政府的商務、財務、法律及管理人員,或其他可能接觸保密信息(如合約、財務信息、機密信息等)的人員。持有TEA的用戶可以通過簽名和尺租加密操作實現對電子郵件的簽名及加密等有效管理。
9. 為什麼說TEA演算法安全性高
tea演算法在安全學領域,TEA(Tiny Encryption Algorithm)是一種分組加密演算法,它的實現非常簡單,通常只需要很精短的幾行代碼。TEA 演算法最初是由劍橋計算機實驗室的 David Wheeler 和 Roger Needham 在 1994 年設計的。
TEA演算法使用64位的明文分組和128位的密鑰,它使用Feistel分組加密框架,需要進行 64 輪迭代,盡管作者認為 32 輪已經足夠了。該演算法使用了一個神秘常數δ作為倍數,它來源於黃金比率,以保證每一輪加密都不相同。但δ的精確值似乎並不重要,這里 TEA 把它定義為 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。
之後 TEA 演算法被發現存在缺陷,作為回應,設計者提出了一個 TEA 的升級版本——XTEA(有時也被稱為「tean」)。XTEA 跟 TEA 使用了相同的簡單運算,但它採用了截然不同的順序,為了阻止密鑰表攻擊,四個子密鑰(在加密過程中,原 128 位的密鑰被拆分為 4 個 32 位的子密鑰)採用了一種不太正規的方式進行混合,但速度更慢了。
10. 輕量級 加密演算法 有哪幾種
注:(以下內容我是從網上找的,不知道能不能幫到你..這些問題我也不怎麼懂!!)
1.AES(Advanced Encryption Standard),
AES是一個使用128為分組塊的分組加密演算法,分組塊和128、192或256位的密鑰一起作為輸入,對4×4的位元組數組上進行操作。AES的每一輪加密都包含4個階段,分別是AddRoundKey,SubBytes,ShiftRows,和MixColumns。眾所周之AES是種十分高效的演算法,尤其在8位架構中,這源於它面向位元組的設計。
AES 適用於8位的小型單片機或者普通的32位微處理器,並且適合用專門的硬體實現,硬體實現能夠使其吞吐量(每秒可以到達的加密/解密bit數)達到十億量級。同樣,其也適用於RFID系統。[3]高效的實現和演算法的免費使用為AES在無線區域網和後來出現的相關協議中的應用鋪平了道路。
2.DESL(Data Encryption Standard Lightweight Extension),
數據加密標准(DES)是由美國聯邦信息處理標准在1976年為美國選出的一種加密演算法。作為一個分組加密演算法,DES在64位大小的分組快上進行操作,其密鑰同樣也是64位。[10]DES的大致結構由Feistel網路組成,此網路中包括含有8個S-Boxes的16次完全相同的基本輪回,一次初始排列,一次最終排列和一個獨立的密鑰次序表。
3.XXTEA
TEA微型加密演算法最初是由David Wheeler和Roger Needham在1994年以Fast Software Encryption工作室的名義發表的,設計的重點在於描述與實現的簡單性。它是一種分組加密演算法,以128位的密鑰對64位的分組塊進行操作。[6]TEA遭受到等效密鑰的困擾——每個密鑰與其他是那個密鑰是等效的,也就是說有效的密鑰長度只有126位。此演算法易受到相關密鑰(Related Key)攻擊法的攻擊。