QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2146|回复: 3

ASD:QQ 加密算法?

[复制链接]
发表于 2005-5-9 21:05:03 | 显示全部楼层 |阅读模式
我在EVA020版本中的qq_crypt.c中的
int decrypt_every_8_byte (void) {
    for (pos_in_byte = 0; pos_in_byte < 8; pos_in_byte ++ ) {
        if (context_start + pos_in_byte >= instrlen) return 1;
        decrypted[pos_in_byte] ^= crypt_buff[pos_in_byte];
    }
    qq_decipher( (unsigned long *) decrypted,
                              (unsigned long *) key,
                             (unsigned long *) decrypted);
   
    context_start +=  8;
    crypt_buff    +=  8;
    pos_in_byte   =   0;
    return 1;
  }/* decrypt_every_8_byte*/
  发现 此函数的返回值不论什么结果都为1;
但在其外层嵌套函数中又发现有
if (! decrypt_every_8_byte()) return 0;
return 0代表解密失败.那其不是说不会失败了!!!
我是第一次看linux下C++编程,请大家指正!
发表于 2005-5-9 21:39:13 | 显示全部楼层
这个是解密算法得一部分。 我到是没有仔细研究, 据puzzlebird的说法,是TEA加密算法,
你可以search这个算法,然后研究。
看样子这个函数总是返回1。

这个算法看的头大。 这个是个内嵌的函数,这个函数的reture 总为真, 但是函数执行中
总是改变了整个函数的数据。你看整个函数还有其他的return, 有可能解密失败。
回复

使用道具 举报

发表于 2005-5-10 19:49:34 | 显示全部楼层
那个if判断是否多余?
我看了openq 最老的0.1和最新的0.2.7两个版本中的解密算法,这个if都没去掉,是否还有其他用途??:-(.
回复

使用道具 举报

发表于 2005-6-8 14:26:48 | 显示全部楼层
我推测这个是puzzlebird程序中的一个手误
应该修改为
[code:1]
if (context_start + pos_in_byte >= instrlen) return 0;
[/code:1]
该判断是用来确定,如果最后不满8位的话解密失败。我没研究过TEA算法,不过我认为从算法设计的角度,这个情况通常是判做失败的
可以尝试如上修改,如果没有遇到什么问题,那么基本可以确证是手误。
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-2 02:23 , Processed in 0.125638 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

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