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

c# tea算法_C#中QQ协议TEA加密解密代码 网上找到的qq协议的TEA加密和解密说明如下: 也有很多源代码,但是感觉上代码比较复杂,不容易看。我用C#重写了下。* QQ消息的加密算法是一个16次的迭代过程,并且是反馈的,每一个加密单元是8字节,输出也是8字节,密钥是16字节* 我们以prePlain表示前一个明文块,plain表示当前明文块,crypt表示当前明文块加密得到的密文块,preCrypt表示前一个密文块* f表示加密算法,d表示... 阅读详情

注:本人只是从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();
C#实现TEA算法 用C#实现的TEA算法,测试可用 public static byte[] Encrypt(byte[] data, byte[] key) { byte[] dataBytes; if (data.Length % 2 == 0) { dataBytes = data; } else { dataBytes = new byte[data.Length + 1]; Array.Copy(data, 0, dataBytes, 0, data.Length); dataBytes[data.Length] = 0x0; } byte[] result = new byte[dataBytes.Length * 4]; uint[] formattedKey = FormatKey(key); uint[] tempData = new uint[2]; for (int i = 0; i < dataBytes.Length; i += 2) { tempData[0] = dataBytes[i]; tempData[1] = dataBytes[i + 1]; code(tempData, formattedKey); Array.Copy(ConvertUIntToByteArray(tempData[0]), 0, result, i * 4, 4); Array.Copy(ConvertUIntToByteArray(tempData[1]), 0, result, i * 4 + 4, 4); } return result; } 立即下载

相关推荐

TEA加密解密器C#开发

TEA加密解密器,使用C#语言开发 TEA.exe运行程序 运行前必须安装.NET.Framework 4.5 环境 说明: 1.所有输入为16进制 2.密钥长度为16Byte 3.明文和密文长度为8Byte

TEA加解密算法c#实现

用c#做一个窗口程序,使用tea算法加密数据库中的数据

activemq_CVE-2015-5254_漏洞复现_源码分析

ActiveMQ-CVE-2015-5254

qq_51550750的博客 934

MacBook上玩转国民技术N32G430:从零搭建ARM开发环境(VSCode + pyOCD)

本文详细介绍了在MacBook上搭建国民技术N32G430的ARM开发环境,涵盖VSCode配置、pyOCD调试及一键编译烧录全流程。通过Homebrew安装工具链、配置Python环境及VSCode插件,开发者可在MacOS高效开发嵌入式应用,特别适合国产芯片N32G430的开发者参考。

weixin_30614109的博客 435

视觉SLAM的前段后端最详细的梳理(硕士入门知识框架更新)

文章目录视觉SLAM的组成结构视觉里程计(VO)-特征点法 -构建稀疏点云地图-直接法 -构建稠密或半稠密的地图 --需要使用 RGB-D 传感器视觉里程计--总结:SLAM 后端研究滤波器法非线性优化后端方式的差异(有五种优化方式):单目视觉里程计的初始化:运动估计:半直接法运动估计的优化方案:关于解决累计误差的一些方法:关键帧的建图及后端优化:特征的深度估计:图优化的后端研究:视觉与IMU融合的分类:视觉与IMU的融合的优势:存在的问题:优秀的开源: 视觉SLAM的组成结构 视觉里程计(VO) -特

DC 6803

数电实训:万年历

万年历

Lmyccq的博客 1万+

精益六西格玛Python数字化应用开发-Day18 应用场景:家电企业生产效率优化

本文将重点介绍专门针对精益六西格玛黑带使用场景的 Python 库,这些库功能侧重于数据分析和流程优化,特别适用于 DMAIC 方法论和看板管理。考虑到读者具备中高级Python 使用经验,我们将深入探讨各库的高级功能和实际应用应用场景。 某家电企业生产线自动化程度高,数据量巨大,希望通过精益管理提升生产效率。企业借助 Python 脚本,打通各类数据源(MES、ERP、设备日志),自动归集生产数据,分析各工序的生产节拍、设备停机、效率损失,快速定位瓶颈环节

m0_56592100的博客 903

Vue项目实战:5分钟搞定高德地图离线部署(附避坑指南)

本文详细介绍了在Vue项目中实现高德地图离线部署的完整方案。针对内网或网络隔离环境,通过获取并改造JSAPI文件、下载组织地图瓦片数据,并集成vue-amap组件,实现地图功能的本地化运行。文中提供了核心代码、避坑指南及性能优化建议,帮助开发者快速构建稳定可靠的离线地图应用。

data3的博客 927

继电保护整定值计算软件_「全套69份」整定值计算与设计方案

【全套69份】整定值计算与设计方案,输电线路、变压器、发电机、电容器、母线保护等下载方式见文末内容预览:10kV高压电机保护原理及整定计算35kV环网运行线路继电保护整定计算方案分析35KV以下继电保护及三段式电流保护整定计算110 kv电网计算机整定计算新方案220kV两相式电铁牵引站供电线路的短路故障计算及其保护整定原则分析220kV周潮线接地距离保护整定计算特殊方案750 kV变压器保护配置...

weixin_30825953的博客 5005

Go语言爬虫:chromedp 的详细使用

chromedp 是 Go 语言中无头浏览器自动化的终极利器。它能驱动真实的 Chrome 浏览器,处理 JavaScript 渲染、复杂交互和反爬虫机制

数据知道的博客 4488

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

上一篇: SafeDel 文件安全删除器alpha
下一篇: C#编写贪吃蛇游戏 RedSnake
Red_angelX
博客等级 码龄21年 67粉丝 51原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值