一个变量的误用。

 

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

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不熟悉,总以为是什么高深的错误了,而是以为实际流程就是应该的流程,结果却不是。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值