日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

QQ协议TEA加密解密代码 C#

發布時間:2023/12/19 C# 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QQ协议TEA加密解密代码 C# 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

???? 網上找到的qq協議的TEA加密和解密說明如下: 也有很多源代碼,但是感覺上代碼比較復雜,不容易看。我用C#重寫了下。 基于2008協議

???? * QQ消息的加密算法是一個16次的迭代過程,并且是反饋的,每一個加密單元是8字節,輸出也是8字節,密鑰是16字節

???? * 我們以prePlain表示前一個明文塊,plain表示當前明文塊,crypt表示當前明文塊加密得到的密文塊,preCrypt表示前一個密文塊
???? * f表示加密算法,d表示解密算法 那么從plain得到crypt的過程是:
???? *?????? crypt = f(plain ^ preCrypt) ^ prePlain
???? * 所以,從crypt得到plain的過程自然是
???? *?????? plain = d(crypt ^ prePlain) ^ preCrypt
???? * 此外,算法有它的填充機制,其會在明文前和明文后分別填充一定的字節數,以保證明文長度是8字節的倍數
???? * 填充的字節數與原始明文長度有關,填充的方法是:
???? *
???? *????? ------- 消息填充算法 -----------
???? *????? a = (明文長度 + 10) mod 8
???? *????? if(a 不等于 0) a = 8 - a;
???? *????? b = 隨機數 & 0xF8 | a;????????????? 這個的作用是把a的值保存了下來
???? *????? plain[0] = b;?????????????????? 然后把b做為明文的第0個字節,這樣第0個字節就保存了a的信息,這個信息在解密時就要用來找到真正明文的起始位置
???? *????? plain[1 至 a+2] = 隨機數 & 0xFF;??? 這里用隨機數填充明文的第1到第a+2個字節
???? *????? plain[a+3 至 a+3+明文長度-1] = 明文; 從a+3字節開始才是真正的明文
???? *????? plain[a+3+明文長度, 最后] = 0;?????? 在最后,填充0,填充到總長度為8的整數為止。到此為止,結束了,這就是最后得到的要加密的明文內容

???? *????? ------- 消息填充算法 ------------

?

Code
??1????/**////?<summary>
??2????///?加密解密QQ消息包的工具類.?
??3????///?</summary>

??4????public?static?class?QQCrypter
??5????{
??6????????private?static?void?code(byte[]?In,?int?inOffset,?int?inPos,?byte[]?Out,?int?outOffset,?int?outPos,?byte[]?key)
??7????????{
??8????????????if?(outPos?>?0)
??9????????????{
?10????????????????for?(int?i?=?0;?i?<?8;?i++)
?11????????????????{
?12????????????????????In[outOffset?+?outPos?+?i]?=?(byte)(In[inOffset?+?inPos?+?i]?^?Out[outOffset?+?outPos?+?i?-?8]);
?13????????????????}

?14????????????}

?15????????????uint[]?formattedKey?=?FormatKey(key);
?16????????????uint?y?=?ConvertByteArrayToUInt(In,?outOffset?+?outPos);
?17????????????uint?z?=?ConvertByteArrayToUInt(In,?outOffset?+?outPos?+?4);
?18????????????uint?sum?=?0;
?19????????????uint?delta?=?0x9e3779b9;
?20????????????uint?n?=?16;
?21
?22????????????while?(n--?>?0)
?23????????????{
?24????????????????sum?+=?delta;
?25????????????????y?+=?((z?<<?4)?+?formattedKey[0])?^?(z?+?sum)?^?((z?>>?5)?+?formattedKey[1]);
?26????????????????z?+=?((y?<<?4)?+?formattedKey[2])?^?(y?+?sum)?^?((y?>>?5)?+?formattedKey[3]);
?27????????????}

?28????????????Array.Copy(ConvertUIntToByteArray(y),?0,?Out,?outOffset?+?outPos,?4);
?29????????????Array.Copy(ConvertUIntToByteArray(z),?0,?Out,?outOffset?+?outPos?+?4,?4);
?30????????????if?(inPos?>?0)
?31????????????{
?32????????????????for?(int?i?=?0;?i?<?8;?i++)
?33????????????????{
?34????????????????????Out[outOffset?+?outPos?+?i]?=?(byte)(Out[outOffset?+?outPos?+?i]?^?In[inOffset?+?inPos?+?i?-?8]);
?35????????????????}

?36????????????}

?37????????}

?38
?39????????private?static?void?decode(byte[]?In,?int?inOffset,?int?inPos,?byte[]?Out,?int?outOffset,?int?outPos,?byte[]?key)
?40????????{
?41????????????if?(outPos?>?0)
?42????????????{
?43????????????????for?(int?i?=?0;?i?<?8;?i++)
?44????????????????{
?45????????????????????Out[outOffset?+?outPos?+?i]?=?(byte)(In[inOffset?+?inPos?+?i]?^?Out[outOffset?+?outPos?+?i?-?8]);
?46????????????????}

?47????????????}

?48????????????else
?49????????????{
?50????????????????Array.Copy(In,?inOffset,?Out,?outOffset,?8);
?51????????????}

?52????????????uint[]?formattedKey?=?FormatKey(key);
?53????????????uint?y?=?ConvertByteArrayToUInt(Out,?outOffset?+?outPos);
?54????????????uint?z?=?ConvertByteArrayToUInt(Out,?outOffset?+?outPos?+?4);
?55????????????uint?sum?=?0xE3779B90;
?56????????????uint?delta?=?0x9e3779b9;
?57????????????uint?n?=?16;
?58
?59????????????while?(n--?>?0)
?60????????????{
?61????????????????z?-=?((y?<<?4)?+?formattedKey[2])?^?(y?+?sum)?^?((y?>>?5)?+?formattedKey[3]);
?62????????????????y?-=?((z?<<?4)?+?formattedKey[0])?^?(z?+?sum)?^?((z?>>?5)?+?formattedKey[1]);
?63????????????????sum?-=?delta;
?64????????????}

?65????????????Array.Copy(ConvertUIntToByteArray(y),?0,?Out,?outOffset?+?outPos,?4);
?66????????????Array.Copy(ConvertUIntToByteArray(z),?0,?Out,?outOffset?+?outPos?+?4,?4);
?67????????}

?68
?69????????/**////?<summary>
?70????????///?解密
?71????????///?</summary>
?72????????///?<param?name="In">密文</param>
?73????????///?<param?name="offset">密文開始的位置</param>
?74????????///?<param?name="len">密文長度</param>
?75????????///?<param?name="key">密鑰</param>
?76????????///?<returns>返回明文</returns>

?77????????public?static?byte[]?Decrypt(byte[]?In,?int?offset,?int?len,?byte[]?key)
?78????????{
?79????????????//?因為QQ消息加密之后至少是16字節,并且肯定是8的倍數,這里檢查這種情況
?80????????????if?((len?%?8?!=?0)?||?(len?<?16))
?81????????????{
?82????????????????return?null;
?83????????????}

?84????????????byte[]?Out?=?new?byte[len];
?85????????????for?(int?i?=?0;?i?<?len;?i?+=?8)
?86????????????{
?87????????????????decode(In,?offset,?i,?Out,?0,?i,?key);
?88????????????}

?89????????????for?(int?i?=?8;?i?<?len;?i++)
?90????????????{
?91????????????????Out[i]?=?(byte)(Out[i]?^?In[offset?+?i?-?8]);
?92????????????}

?93????????????int?pos?=?Out[0]?&?0x07;
?94????????????len?=?len?-?pos?-?10;
?95????????????byte[]?res?=?new?byte[len];
?96????????????Array.Copy(Out,?pos?+?3,?res,?0,?len);
?97????????????return?res;
?98????????}

?99
100????????public?static?byte[]?Encrypt(byte[]?In,?int?offset,?int?len,?byte[]?key)
101????????{
102????????????//?計算頭部填充字節數
103????????????int?pos?=?(len?+?10)?%?8;
104????????????if?(pos?!=?0)
105????????????{
106????????????????pos?=?8?-?pos;
107????????????}

108????????????byte[]?plain?=?new?byte[len?+?pos?+?10];
109????????????plain[0]?=?(byte)((Rnd.Next()?&?0xF8)?|?pos);
110????????????for?(int?i?=?1;?i?<?pos?+?3;?i++)
111????????????{
112????????????????plain[i]?=?(byte)(Rnd.Next()?&?0xFF);
113????????????}

114????????????Array.Copy(In,?0,?plain,?pos?+?3,?len);
115????????????for?(int?i?=?pos?+?3?+?len;?i?<?plain.Length;?i++)
116????????????{
117????????????????plain[i]?=?0x0;
118????????????}

119????????????//?定義輸出流
120????????????byte[]?outer?=?new?byte[len?+?pos?+?10];
121????????????for?(int?i?=?0;?i?<?outer.Length;?i?+=?8)
122????????????{
123????????????????code(plain,?0,?i,?outer,?0,?i,?key);
124????????????}

125????????????return?outer;
126????????}

127
128????????private?static?uint[]?FormatKey(byte[]?key)
129????????{
130????????????if?(key.Length?==?0)
131????????????{
132????????????????throw?new?ArgumentException("Key?must?be?between?1?and?16?characters?in?length");
133????????????}

134????????????byte[]?refineKey?=?new?byte[16];
135????????????if?(key.Length?<?16)
136????????????{
137????????????????Array.Copy(key,?0,?refineKey,?0,?key.Length);
138????????????????for?(int?k?=?key.Length;?k?<?16;?k++)
139????????????????{
140????????????????????refineKey[k]?=?0x20;
141????????????????}

142????????????}

143????????????else
144????????????{
145????????????????Array.Copy(key,?0,?refineKey,?0,?16);
146????????????}

147????????????uint[]?formattedKey?=?new?uint[4];
148????????????int?j?=?0;
149????????????for?(int?i?=?0;?i?<?refineKey.Length;?i?+=?4)
150????????????{
151????????????????formattedKey[j++]?=?ConvertByteArrayToUInt(refineKey,?i);
152????????????}

153????????????return?formattedKey;
154????????}

155
156????????private?static?byte[]?ConvertUIntToByteArray(uint?v)
157????????{
158????????????byte[]?result?=?new?byte[4];
159????????????result[0]?=?(byte)((v?>>?24)?&?0xFF);
160????????????result[1]?=?(byte)((v?>>?16)?&?0xFF);
161????????????result[2]?=?(byte)((v?>>?8)?&?0xFF);
162????????????result[3]?=?(byte)((v?>>?0)?&?0xFF);
163????????????return?result;
164????????}

165
166????????private?static?uint?ConvertByteArrayToUInt(byte[]?v,?int?offset)
167????????{
168????????????if?(offset?+?4?>?v.Length)
169????????????{
170????????????????return?0;
171????????????}

172????????????uint?output;
173????????????output?=?(uint)(v[offset]?<<?24);
174????????????output?|=?(uint)(v[offset?+?1]?<<?16);
175????????????output?|=?(uint)(v[offset?+?2]?<<?8);
176????????????output?|=?(uint)(v[offset?+?3]?<<?0);
177????????????return?output;
178????????}

179
180????}

181

?

轉載于:https://www.cnblogs.com/beikx/archive/2009/11/08/1598309.html

總結

以上是生活随笔為你收集整理的QQ协议TEA加密解密代码 C#的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 男人捅爽女人 | 国产精品黄色网 | 四季av中文字幕 | 免费看黄色片视频 | 乌克兰毛片 | 床戏高潮做进去大尺度视频 | 中国亚洲老头同性gay男男… | 亚洲天堂手机版 | 臭脚猛1s民工调教奴粗口视频 | 亚洲乱色熟女一区二区三区 | 伊人91视频 | 丝袜五月天| 欧美一区三区二区在线观看 | 三级91| 男女爽爽视频 | 偷拍视频一区二区 | 国产a级免费 | av免费观| 在线色播 | 在办公室被c到呻吟的动态图 | 绯色av一区二区 | 香蕉视频网站入口 | 91精品大片| 天天综合日日夜夜 | 日本japanese乳偷乱熟 | 日本成人在线免费 | 精品人妻伦九区久久aaa片 | 操操av| 大陆日韩欧美 | 国产精品1024| 日韩精品中字 | 99精品欧美 | 啪啪免费网 | 亚洲免费av网站 | 第一毛片 | 国产毛片91| www.欧美色图 | 无码国产精品高潮久久99 | 天天舔天天操 | 巨物撞击尤物少妇呻吟 | 婷婷.com| 怡红院av在线 | 毛毛毛片| 欧美sm极限捆绑bd | av收藏小四郎最新地址 | 日韩经典第一页 | 看片网址国产福利av中文字幕 | 日本三级一区 | 久草av在线播放 | 国产字幕在线观看 | 视频区图片区小说区 | 国产无套精品一区二区三区 | 日本特黄一级 | 久久人人爽人人爽人人 | 亚洲一区二区三区视频 | 肥臀熟女一区二区三区 | 亚洲人交配视频 | 午夜不卡在线 | 91九色国产ts另类人妖 | 97超碰资源总站 | 大桥未久av一区二区三区中文 | 九九热免费在线视频 | 污片免费在线观看 | 老熟妇一区二区 | 精品国产一区二区在线观看 | 久草成人在线 | 日韩国产免费 | 极品三级 | 麻豆网站免费观看 | 国产精品扒开腿做爽爽爽视频 | 久久午夜福利电影 | 少妇2做爰交换朴银狐 | 久久久久久久久久久影视 | 国产成人精品免费视频 | 99小视频| 亚洲精选免费 | 成人午夜视频免费看 | 欧美日韩性视频 | 中文字幕在线观看线人 | 久久免费在线观看视频 | 天天干天天舔天天射 | 少妇乱淫36部 | 国产男女网站 | 国产三级在线播放 | 伊人伊网 | 国产爆操视频 | 善良的老师伦理bd中字 | 国产精品一区二区三区在线播放 | 日日夜夜撸啊撸 | 久久婷婷综合色丁香五月 | 成人夜色| 韩日产理伦片在线观看 | 蜜臀久久99精品久久久 | 亚洲精品国产免费 | 天堂在线一区 | 欧性猛交ⅹxxx乱大交 | 4虎最新网址| 亚洲少妇色 | 国产乱色精品成人免费视频 |