【发布时间】:2011-02-08 13:51:44
【问题描述】:
我最近收到了 Bruce Schneier 的《应用密码学》一书,读起来很不错。我现在了解了书中概述的几种算法的工作原理,我想开始用 C 来实现其中的一些。
许多算法的共同点是将一个 x 位密钥分成几个较小的 y 位密钥。例如,Blowfish 的密钥 X 是 64 位的,但您需要将其分成两个 32 位的一半; Xl 和 Xr。
这就是我卡住的地方。我在 C 方面还算不错,但在按位运算符等方面我不是最强的。
在对 IRC 的一些帮助之后,我设法想出了这两个宏:
#define splitup(a, b, c) {b = a >> 32; c = a & 0xffffffff; }
#define combine(a, b, c) {a = (c << 32) | a;}
其中 a 是 64 位,b 和 c 是 32 位。但是,编译器会警告我将 32 位变量移动 32 位这一事实。
我的问题是:
- 将 32 位变量移位 32 位有什么不好?我猜它是未定义的,但这些宏似乎确实有效。
- 另外,你会建议我换一种方式吗?
正如我所说,我对 C 相当熟悉,但按位运算符之类的仍然让我头疼。
编辑
我发现我的 combine 宏实际上并没有组合两个 32 位变量,而是简单地将 0 与 a 进行 OR 运算,结果得到 a。
所以,在我之前的问题之上,我仍然没有一种方法可以将两个 32 位变量组合起来得到一个 64 位变量;我们将不胜感激。
【问题讨论】:
-
+1,很棒的问题,感谢您花时间正确格式化并欢迎使用 Stack Overflow!
-
顺便说一句,我敢打赌,你的组合宏应该是与 b 而不是 a 的 ORing,对吧?
标签: c bit-manipulation 32bit-64bit