Anomymous 发表于 2005-5-9 21:05:03

ASD:QQ 加密算法?

我在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 ^= crypt_buff;
    }
    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++编程,请大家指正!

yunfan 发表于 2005-5-9 21:39:13

这个是解密算法得一部分。 我到是没有仔细研究, 据puzzlebird的说法,是TEA加密算法,
你可以search这个算法,然后研究。
看样子这个函数总是返回1。

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

quby 发表于 2005-5-10 19:49:34

那个if判断是否多余?
我看了openq 最老的0.1和最新的0.2.7两个版本中的解密算法,这个if都没去掉,是否还有其他用途??:-(.

henryouly 发表于 2005-6-8 14:26:48

我推测这个是puzzlebird程序中的一个手误
应该修改为

if (context_start + pos_in_byte >= instrlen) return 0;

该判断是用来确定,如果最后不满8位的话解密失败。我没研究过TEA算法,不过我认为从算法设计的角度,这个情况通常是判做失败的
可以尝试如上修改,如果没有遇到什么问题,那么基本可以确证是手误。
页: [1]
查看完整版本: ASD:QQ 加密算法?