在C语言中操作80位数据类型

8
我正在用C语言实现一些涉及80位密钥的加密算法。其中一个操作涉及将密钥旋转移位x位。
我尝试了long double类型,如果我没记错的话是80位,但它不能使用位移运算符。
我能想到的唯一替代方案是使用一个有10个元素的char数组,并进行一些复杂的循环和if-else判断。
我的问题是是否有一种简单高效的方法来完成这个操作。
谢谢。

2
只需使用字符数组并实现自己的移位/旋转-请参见此处的示例:https://dev59.com/jW865IYBdhLWcg3wOcDy - Paul R
谢谢,保罗。我会研究那个线程的。 - gamerx
如果您使用gcc或其衍生版本的64位平台,则具有实现128类型所有算术运算的_uint128_t。这些通常是合成操作,因此您可以查找源代码以了解如何完成此操作。 - Jens Gustedt
在GNU GCC for x86中,“long double”是80位,因为它得到了FPU的本地支持。并非所有编译器都会为x86 FPU做到这一点;例如,在MSVC++中,它是“double”的同义词。但正如您所说,这是学术性的,因为移位和其他位运算符是整数操作。我建议您在FPGA中实现必要的80位操作。 - Clifford
2
没必要使用 chars - 这只是浪费计算周期。使用你的计算机体系结构提供的最大整数数据类型,可能至少需要 64 位。 - Nick Johnson
显示剩余2条评论
2个回答

4
很遗憾,您需要一个大数库。虽然C本地数据类型支持80位浮点数,但实际上并不能满足您的需求。
可以链接类似GMP这样的库,或者使用不太理想的方法,如10个字符数组或两个数字(长整型和短整型,64位和16位整数)。
两种方法都不是特别美观,但它们确实可行,如果您打算将其用于非课堂用途,GMP是最好的选择。否则,您可能会遇到一堆计时攻击,虽然可以通过编码解决,但可能会变得非常麻烦。

你的目标是追求极致效率还是只是相对高效? - Ben
2
你既然有FPGA,为什么要用C来实现这个? - blueshift
我正在尝试比较和评估FPGA实现与相当高效的C实现之间的加速比。 - gamerx
1
这没有多少意义。如果C代码在FPGA上运行,那么C实现保证比FPGA慢。这是因为软处理器执行额外的任务(例如读取代码)。另一种选择是将x86与FPGA进行比较,这样会更有意义一些。 - Mikhail
1
感谢各位的回复。我知道FPGA实现会快得多。然而,这是学校项目,我需要提出两种实现方案进行比较。 - gamerx
显示剩余4条评论

4

这里有一些混乱的地方。如果我理解正确的话,您正在FPGA上使用软件CPU。

  1. 传统上,人们使用VHDL / Verilog在FPGA上制作自己的移位寄存器。这种算法很容易实现且速度非常快。在大学时,我为一个加密项目做过类似的工作。

  2. 此外,您提到的论文讨论了128位密钥。这会更容易实现吗?


该论文还提到该算法适用于80位和128位密钥。前者是轻量级版本,我正在尝试在这里实现它。 - gamerx
这是一个很好的点:如果您正在使用FPGA,您可以将算法直接构建在其中,而不是在软CPU上运行它。 - Nick Johnson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接