开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 14184|回复: 4
收起左侧

[技术文章] Tea算法分析

[复制链接]
发表于 2020-4-10 10:35:53 | 显示全部楼层 |阅读模式   贵州省遵义市
在游戏项目中,一般需要对zy或xx进行加密保护,最简单高效的加密算法就是采用位与或之类的,但是比较容易被人分析出来。
TEA加密算法不但比较简单,而且有很强的抗差分分析能力,加密速度也比较快。可以根据项目需求设置加密轮数来增加加密强度。
1.加密核心函数
static void tea_encrypt(uint32_t *v,uint32_t *k)   
{  
    uint32_t y = v[0],z = v[1],sum = 0,i;         
    uint32_t delta = 0xcccccccc;                  
    uint32_t a = k[0],b = k[1],c = k[2],d = k[3];   
    for (i = 0;i < 32;i++)   
    {                          
        sum += delta;  
        y += ((z << 2) + a) ^ (z + sum) ^ ((z >> 7) + b);  
        z += ((y << 2) + c) ^ (y + sum) ^ ((y >> 7) + d);  
    }  
    v[0] = y;  
    v[1] = z;  
}  

uint16_t encrypt(uint8_t *src,uint16_t size_src,uint8_t *key)  
{  
    uint8_t a = 0;  
    uint16_t i = 0;  
    uint16_t num = 0;  

    //将明文补足为8字节的倍数  
    a = size_src % 8;  
    if (a != 0)  
    {  
        for (i = 0;i < 8 - a;i++)  
        {  
            src[size_src++] = 0;  
        }  
    }  

    //加密  
    num = size_src / 8;  
    for (i = 0;i < num;i++)  
    {  
        tea_encrypt((uint32_t *)(src + i * 8),(uint32_t *)key);  
    }  

    return size_src;  

解密函数
static void tea_decrypt(uint32_t *v,uint32_t *k)   
{  
    uint32_t y = v[0],z = v[1],sum = 0xC6EF3720,i;   
    uint32_t delta = 0xcccccccc;              
    uint32_t a = k[0],b = k[1],c = k[2],d = k[3];      


    for (i = 0;i < 32;i++)   
    {                           
        z -= ((y << 2) + c) ^ (y + sum) ^ ((y >> 7) + d);  
        y -= ((z << 2) + a) ^ (z + sum) ^ ((z >> 7) + b);  
        sum -= delta;                       
    }  
    v[0] = y;  
    v[1] = z;  
}  


uint16_t decrypt(uint8_t *src,uint16_t size_src,uint8_t *key)  
{  
    uint16_t i = 0;  
    uint16_t num = 0;  


    //判断长度是否为8的倍数  
    if (size_src % 8 != 0)  
    {  
        return 0;  
    }  


    //解密  
    num = size_src / 8;  
    for (i = 0;i < num;i++)  
    {  
        tea_decrypt((uint32_t *)(src + i * 8),(uint32_t *)key);  
    }  


    return size_src;  
}  


 楼主| 发表于 2020-4-18 15:04:31 | 显示全部楼层   贵州省遵义市
怎么回事动态的了,这样不是每个都容易搞出问题
回复 支持 反对

使用道具 举报

结帖率:100% (30/30)

签到天数: 23 天

发表于 2020-4-16 11:56:46 高大上手机用户 | 显示全部楼层   辽宁省大连市
tx用的多但是密匙应该是动态的了,以前固定密匙,现在15分钟一变,那个生成密匙的Java算法还看不懂

点评

这个思路是错误的,   辽宁省大连市  发表于 2020-11-8 23:15
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-11 12:47:01 | 显示全部楼层   贵州省遵义市
这个算法还是比较经常用的吧
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表