對qq協議進行分析過的同學可能知道,qq的資料傳輸是使用tea演算法進行的加密。
tea演算法是一種對稱加密演算法,特點是速度快,**量小(加密、解密的核心演算法總共才20來行)。演算法的安全性雖然不比aes,但其演算法的破譯難度取決於其迭代的次數。網上說qq是16次迭代,推薦的迭代次數是64次。我就對這些簡潔小巧的事物沒有抗拒力,於是在網上搜尋一下其**,研究一下。
找到了乙個別人封裝好的類,很好用,我一會打包起來給大家。
我對**進行了處理,寫了乙個簡單的加密字串的軟體。
首先引用了網上的乙個類,很簡潔的90行**,其中加密的方法是:
1 tea tea(key, times, false);
2 tea.encrypt(plain, crypt);
解密的方法是:
1 tea tea(key, times, false);
2 tea.decrypt(crypt, plain);
建構函式中傳入金鑰key,times是迭代次數,我用的64次,第三個引數是「是否專為網路序」,如果加密完成後的密文不在網路上傳輸的話,就填false。
encrypt方法對密文進行加密,plain是明文,crypt是輸出密文的緩衝區。而decrypt方法正好相反。
下面是幾點要注意的:
第一,plain、key、crypt三個引數型別都是byte *,也就unsigned char *,裡面儲存的是二進位製碼,是不能直接輸出在螢幕上的,所以你如果要加密字串,輸出hex,就得加一些**處理一下。如果大家加密乙個檔案的話,就不用處理了。
第二,key長度16bit,所以我用了乙個md5處理之。將我們輸入的任意長度的字串先hash成md5,再作為乙個16bit的key傳入tea的建構函式。
第三,加密時,明文長度必須是8bit,於是我把明文分成許多8bit的段,將每段密文加密。如果密文密文長度不是8的倍數,則我會在最後一段明文後面補隨機二進位制位,湊成8bit。所以一段明文加密出來的結果可能不相同,但不相同的一定是最後8bit,前面都應該是一樣的。而最後8bit中有效長度,我就放在密文的第一位。所以密文一定是奇數長度。
我在網上看qq的tea加密是這樣兩個技巧:和我類似補隨機二進位制位補齊8的倍數,但採用了交織演算法:訊息被分為多個加密單元,每乙個加密單元都是8位元組,使用tea進行加密,加密結果與下乙個加密單元做異或運算後再作為待加密的明文。
這樣感覺會更加複雜和安全一點,但我嫌麻煩就沒這麼處理了。如果對安全性要求更高的同學可以自己下去稍微一改。
sqlserver對資料進行加密 解密
建立測試表 create table tbluser name nvarchar 30 password varbinary 1000 建立資料庫主金鑰 create master key encryption by password passw ord 建立證書 create certificat...
使用bcrypt對資料加密
這是一篇隨筆,用於記錄在專案中用到乙個比較的你npm包。這個包之所以這個貨因為他的安全係數比以前用到的類似於md5,sha1要高,因為bcrypt加密,同樣乙個值,你每次加密出來的值是不一樣的。原來的md5加密就做不到這一點。好了廢話不多說,如果對bcrypt的演算法感興趣的話,大佬們可以去研究一下...
使用SQL語句對資料進行MD5加密
如果資料庫表user中有一列為passwd,存放的是md5加密的資料,如何更新新的資料。update user set passwd md5 123321 where uname lihua 插入新的資料 insert into user uname,passwd values xiaoqiang ...