一个变量的误用。

来源:互联网 发布:jc是什么意思网络用语 编辑:程序博客网 时间:2024/05/02 04:15

 

今晚上到论坛回答问题,看到如下题目

http://topic.csdn.net/u/20100524/21/57fb65e1-0e66-4753-b131-3be1bddcb452.html?32866

 

说是RC5的加密,解密结果不一致。

 

RC5很多种 这里应该是ECB,32位字,轮数未定,key未定,实验时给的轮数12,key为16字节即128位。

 

[1]没见过这种实现,RC5也不懂。改了下libeay32使其支持,并跑了下rc5test。

[2]虽然给出的只是代码片段,但是不难恢复成一个完整代码,缺的只是main,P32,Q32之类,将其补足。

[3]根据rc5test中给出的测试集,实验其加密功能是正确的,由此不用怀疑ROTL的正确性。

[4]回复了如下内容

"已确认加密结果是正确的。

已确认错误应该在ROTR的处理,如下代码

A0=A;
B0=B;
        A = ROTL(A ^ B, B) + S[2 * i];
        B = ROTL(B ^ A, A) + S[2 * i + 1];
        B1 = (ROTR(B - S[2 * iRounds + 1], A)) ^ A;
        A1 = (ROTR(A - S[2 * iRounds], B1)) ^ B1;
理论上有A1=A0 B1=B0的,但实际不等"

 

[5]真笨,这时候只注重表面了,愣是没细看编码

[6]此后是花了一个多小时在反复,推到输出值 检查。查看其逻辑时就是当做iRounds为i去想去推得。

[7]中间层注释过与S有关的代码,结果加解密都一致了。加上S后则不行,还试图打印过ROTR的第二个参数及其mod32后的值,无果

[8]恍然发现本该i的地方错写成iRounds了,后者为总的轮数,而解密时用i遍历从后往前的所有轮。即:


void CRC5Base::Decrypt(unsigned char *data)
中的
    for (int i = iRounds; i > 0; i--)
    {
        B = (ROTR(B - S[2 * iRounds + 1], A)) ^ A;
        A = (ROTR(A - S[2 * iRounds], B)) ^ B;
    }

 


将iRounds换成i即可

 

 

这是近期解决问题最不值得一次,一是对RC5不熟悉,总以为是什么高深的错误了,而是以为实际流程就是应该的流程,结果却不是。

正如大部分人代码走查时,对自己写的代码,即时问题在眼皮底下,反反复复看多遍,仍无法发现一样。