QQ的TEA填充算法C#实现 By Red_angelX

这篇博客分享了作者将QQ的TEA填充算法从Java翻译为C#的过程,详细记录了研究与实现的艰辛,修复了一个导致解密失败的错误,并优化了部分代码。提供了完成的C#代码,有助于读者进行协议分析和构建自定义QQ客户端。
摘要由CSDN通过智能技术生成

注:本人只是从LUMA QQ的 Source Code里面把相应Java语言翻译成C#,纯技术研究,并没有对TC产品做任何逆向分析,不承担任何法律责任!转载请保持本文完整性

网上有c/c++,vb,delphi,java,perl各种版本的tea填充算法,唯独没有C#的,这让我这种狂热喜爱C#的人如何承受,于是,花3天时间看了各种代码经历无数失败的挫折终于用C#完成了该填充算法,废话不多说,直接给代码

 /*********************************************************

FILE :      QQCrypt.cs

9.22更正:一处笔误造成解密失败的BUG

                    优化部分代码

**********************************************************/

 

using  System;

namespace  RedQ
{
    
/// <summary>
    
/// QQ Msg En/DeCrypt Class
    
/// Writen By Red_angelX On 2006.9.13
    
/// </summary>

    public class QQCrypt
    
{    
        
//QQ TEA-16 Encrypt/Decrypt Class 
        
// 
        
// 
        
//And also LumaQQ//s source code 
        
//  CopyRight:No CopyRight^_^ 
        
//  Author : Red_angelX     
        
//  NetWork is Free,Tencent is ****!
        
// 
        
//Class Begin 
        
//AD:Find Job!!,If you Want Give me a Job,Content Me!!

        
//Copied & translated from LumaQQ//s source code          `From LumaQQ///s source code: 
        private byte[] Plain;                                   //指向当前的明文块 
        private byte[] prePlain ;                               //指向前面一个明文块 
        private byte[] Out;                                     //输出的密文或者明文 
        private long Crypt, preCrypt;                           //当前加密的密文位置和上一次加密的密文块位置,他们相差8 
        private long Pos;                                       //当前处理的加密解密块的位置 
        private long padding;                                   //填充数 
        private byte[] Key = new byte[16];                      //密钥 
        private bool Header;                                    //用于加密时,表示当前是否是第一个8字节块,因为加密算法 
                                                                
//是反馈的,但是最开始的8个字节没有反馈可用,所有需要标 
                                                                
//明这种情况 
        private long contextStart;                              //这个表示当前解密开始的位置,之所以要这么一个变量是为了 
                                                                
//避免当解密到最后时后面已经没有数据,这时候就会出错,这 
                                                                
//个变量就是用来判断这种情况免得出错 
        public QQCrypt()
        
{
            
//
            
// TODO: 在此处添加构造函数逻辑
            
//
        }

        

        
//Push 数据
        byte[] CopyMemory(byte[] arr,int arr_index,long input)  //lenth = 4
        {
            
if(arr_index+4 > arr.Length)
            
{
                
// 不能执行
                return arr;
            }


            arr[arr_index
+3]=(byte)((input & 0xff000000>> 24);
            arr[arr_index
+2]=(byte)((input & 0x00ff0000>> 16);
            arr[arr_index
+1]=(byte)((input & 0x0000ff00>> 8);
            arr[arr_index]
=(byte)(input & 0x000000ff);

            arr[arr_index] 
&= 0xff;
            arr[arr_index
+1&= 0xff;
            arr[arr_index
+2&= 0xff;
            arr[arr_index
+3&= 0xff;

            
return arr;
        }


        
long CopyMemory(long Out,byte[] arr,int arr_index)
        
{
            
if(arr_index+4 > arr.Length)
            
{
                
return Out;
                
//不能执行
            }


            
long x1 = arr[arr_index+3<< 24;
            
long x2 = arr[arr_index+2<< 16;
            
long x3 = arr[arr_index+1<< 8;
            
long x4 = arr[arr_index];

            
long o = x1 | x2 | x3 | x4;
            o 
&= 0xffffffff;
            
return o;
        }


        
long getUnsignedInt(byte[] arrayIn, int offset,int len /*Default is 4*/
        
{

            
long ret = 0;
            
int end = 0;
            
if (len > 8)
                end 
= offset + 8;
            
else
                end 
= offset + len;
            
for (int i = offset; i < end; i++
            
{
                ret 
<<= 8;
                ret 
|= arrayIn[i] & 0xff;
            }

            
return (ret & 0xffffffff| (ret >> 32);
        }


        
long Rand()
        
{
            Random rd 
= new Random();
            
long ret;
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值