今晚上到论坛回答问题,看到如下题目
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的处理,如下代码
[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不熟悉,总以为是什么高深的错误了,而是以为实际流程就是应该的流程,结果却不是。
正如大部分人代码走查时,对自己写的代码,即时问题在眼皮底下,反反复复看多遍,仍无法发现一样。