一个变量的误用。
来源:互联网 发布: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不熟悉,总以为是什么高深的错误了,而是以为实际流程就是应该的流程,结果却不是。
正如大部分人代码走查时,对自己写的代码,即时问题在眼皮底下,反反复复看多遍,仍无法发现一样。
- 一个变量的误用。
- inet_ntoa的一个典型误用
- inet_ntoa的一个典型误用
- C++ string的一个误用
- pyton中类的变量与对象的变量误用
- 一个误用snprintf的bug分析
- -webkit-animation属性的一个误用
- 一个误用snprintf的bug分析
- JDBC的误用-从一个outofmemory中想到的
- 记录一个Hadoop Configuration易产生的误用
- 网络编程中inet_ntoa的一个典型误用
- 内存优化的误用
- 误用的函数
- C++的memset误用
- 数组的误用
- 缓存的误用
- java异常的误用
- UIViewController的误用
- 微软的银光技术
- 伤感
- 怎样编译gcc源码
- CTreeCtrl控件学习第一课
- 应用ExcelHelper 数据库内容导出到Excel
- 一个变量的误用。
- 对eclipse失望了
- GridView导出Excel研究
- Hadoop分布式集群配置总结
- 使用jaxb进行类和xml的绑定
- 设计模式之C#简单工厂模式
- spring中bean的继承
- Hadoop中的集群配置和使用技巧
- 操作系统学习笔记(12)--代码地址