吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 735|回复: 5
收起左侧

[其他原创] XTea加密算法用AS3实现的结果与C语言的结果不同——原因分析

[复制链接]
baikunlun 发表于 2024-9-11 12:07
一个AIR应用程序使用了XTea算法生成授权码,AIR就跟Flash差不多,使用的脚本语言叫AS3
为了写个对应的注册机,找了 Python Java C 等代码,计算结果都对应不上。
[C] 纯文本查看 复制代码
/* take 64 bits of data in v[0] and v[1] and 128 bits of key[0] - key[3] */  
  
void encipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {  
    unsigned int i;  
    uint32_t v0=v[0], v1=v[1], sum=0, delta=0x9E3779B9, t1=0, t2=0;  
    for (i=0; i < num_rounds; i++) {  
        v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);  
        sum += delta;
        v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);          
    }  
    v[0]=v0; v[1]=v1;  
}  


[Actionscript3] 纯文本查看 复制代码
		public function encrypt(block:ByteArray, index:uint=0):void {
			block.position = index;
			var v0:uint = block.readUnsignedInt();
			var v1:uint = block.readUnsignedInt();
			var i:uint;
			var sum:uint =0;
			var delta:uint = 0x9E3779B9;
			for (i=0; i<NUM_ROUNDS; i++) {
				v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);
				sum += delta;
		        v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]);
			}
			block.position-=8;
			block.writeUnsignedInt(v0);
			block.writeUnsignedInt(v1);
		}


算式比较整洁,于是对每一步的计算结果做比对。
最终发现是整数右移位的计算结果有差异,也并不是每次都有差异
0~0x7FffFFff 右移结果都是一致的,再大的数就不同了,也就是说转换为二进制里面的最高位是1就不同了
无符号整数,0x80000000~0xFFFFFFFF
AS3右移,最高位补1
C语言右移,最高位补0,C语言中的有符号整数int,右移效果也是最高位补1

发现这个特征后,稍微修改了一下C语言代码,就可以与AS3效果一致了。
[C] 纯文本查看 复制代码
/* take 64 bits of data in v[0] and v[1] and 128 bits of key[0] - key[3] */

void encipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {
unsigned int i;
uint32_t v0=v[0], v1=v[1], sum=0, delta=0x9E3779B9, t1=0, t2=0;
for (i=0; i < num_rounds; i++) {
v0 += (((v1 << 4) ^ ((int)v1 >> 5)) + v1) ^ (sum + key[sum & 3]); //右移时先强制类型转换为int
sum += delta;
v1 += (((v0 << 4) ^ ((int)v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]); //右移时先强制类型转换为int
}
v[0]=v0; v[1]=v1;
}

免费评分

参与人数 3吾爱币 +9 热心值 +3 收起 理由
jk998 + 1 + 1 我很赞同!
helian147 + 1 + 1 热心回复!
侃遍天下无二人 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

kenxy 发表于 2024-9-11 13:38
楼主厉害,观察细致入微
asdasxzca 发表于 2024-9-11 14:28
 楼主| baikunlun 发表于 2024-9-11 15:03
kenxy 发表于 2024-9-11 13:38
楼主厉害,观察细致入微

主要靠坚持,打印了所有计算步骤的结果,才发现了这个问题。

AS3现在是冷门了,用的很少。
DEATHTOUCH 发表于 2024-9-11 16:08
语言的坑,要强行擦屁股,本来无符号右移应该就是补0的,结果为了兼容只好强行变成有符号的。
zk1126853389 发表于 2024-9-18 11:11
感谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 13:10

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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