Oceantoo 是一个基于 XOR/LFSR 的加密算法
作者:Sec-Labs | 发布时间:
项目地址
https://github.com/garyexplains/oceantoo
Oceantoo
Oceantoo 是一个基于 XOR/LFSR 的加密算法。
什么是 LFSR?
线性反馈移位寄存器(LFSR)是一种通过移位(将所有位向左或向右移动)并在创建的空间中添加一个新位(反馈)来操作数字(寄存器)的方法。
它们通常用作伪随机数生成器(如此例所示)。
初始状态称为种子,因为 LFSR 是确定性的,当从给定的初始状态开始时,它将始终生成相同的数字序列。
反馈通过使用 XOR 结合某些位(称为触发器)来生成将插入移位所创建的空隙的位。
XOR 刷新器
当且仅当其参数不同时,异或为 true。因此:
| A | B | XOR |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
位编号
在阅读关于 LFSR 的文章时,可能会混淆位的编号方式。
例如,1011 可以被编号为
| 1 | 2 | 3 | 4 |
|---|---|---|---|
| 1 | 0 | 1 | 1 |
或者
| 4 | 3 | 2 | 1 |
|---|---|---|---|
| 1 | 0 | 1 | 1 |
第一种方法是讨论 LFSR 时传统的方式。
4 位 LFSR
一个简单的 4 位 LFSR 的例子是使用位 3 和位 4。它们使用 XOR 运算结合起来,并在向左移位后插入到位 1 中。
| 1 | 2 | 3 | 4 | 注释 |
|---|---|---|---|---|
| 1 | 0 | 0 | 1 | 位 3(0)XOR 位 4(1)等于 1 |
| 1 | 1 | 0 | 0 | 1001 向右移位变为 ?100,然后加上上面的进位变成 1100 |
| 0 | 1 | 1 | 0 | |
| 1 | 0 | 1 | 1 | |
| 0 | 1 | 0 | 1 | |
| 1 | 0 | 1 | 0 | |
| 1 | 1 | 0 | 1 | |
| 1 | 1 | 1 | 0 | |
| 1 | 1 | 1 | 1 | 位 3(1)XOR 位 4(1)等于 0 |
| 0 | 1 | 1 | 1 | 1111 向右移位变为 ?111,然后加上上面的进位变成 0111 |
| 0 | 0 | 1 | 1 | |
| 0 | 0 | 0 | 1 | |
| 1 | 0 | 0 | 0 | |
| 0 | 1 | 0 | 0 | |
| 0 | 0 | 1 | 0 |
在生成随机数序列时,移出的位,即位 1,即最低有效位 (LSB),被用来生成随机位,这些随机位可以被用作随机数(取决于需要多少位)。
128位LFSR
Oceantoo使用一个128位的LFSR,其反馈位分别为128、127、126、121。这样的LFSR具有最大的循环周期,意味着它将生成340,282,366,920,938,463,463,374,607,431,768,211,455个独特的数字,没有重复!
LFSR弱点
在给定足够的数据的情况下,有办法确定“破解”LFSR并获取其初始状态并模拟它生成的数字。Berlekamp-Massey算法是一种算法,它会为给定的二进制输出序列找到最短的线性反馈移位寄存器(LFSR)。
为了克服这种弱点,可以使用各种方法。其中一种方法是使用多路复用的LFSR。这些最初在1980年S.M. Jennings的博士论文中首次提到。
多路复用的LFSRs和收缩生成器使用多个LFSR。在后者的情况下,一个LFSR控制另一个的使用方式。因此,如果您有LFSR1和LFSR2,则当LSFR1的LSB为1时,序列的输出为LFSR2的LSB。当LFSR1为0时,LFSR2的LSB被丢弃。然后算法循环,直到LFSR1生成1,因此使用LFSR2。
其他变体包括在LFSR1和LFSR2之间交替使用,等等。
关于FISH和PIKE的说明
FISH(FIbonacci SHrinking)是Siemens于1993年发布的一种加密算法。根据Ross Anderson的研究结果(见《关于Fibonacci密钥流生成器的文章》),FISH可以用几千个已知明文比特就能破解。
在同一篇文章中,Anderson提出了PIKE。PIKE是对FISH的改进。Anderson指出,“如果控制比特是进位比特而不是最低有效比特,那么我们的攻击将会更加困难”。
因此,Oceantoo使用了一个LFSR的进位比特来缩短序列(见下文)。PIKE还使用了XOR运算来计算每个LFSR的最低有效比特,这与Oceantoo相同。
Oceantoo的LFSRs
在文章“Multiplexed Sequences的统计弱点”中,Jovan Dj. Golic等人表明,多路复用的LFSRs存在一些固有的弱点,并提出了一些解决方案。其中包括对LFSR的输出进行减少(类似于缩减生成器),并对两个LFSR的输出进行XOR运算。
Oceantoo使用了3个LFSR,每个LFSR均为128位。
LFSR3用于减少输出。如果LFSR3的进位比特为1,则LFSR1的最低有效比特会被忽略1位,而LFSR2的最低有效比特会被忽略2位。但是,该算法不会循环回到初始状态。只有当LFSR3的进位比特为1时,才会执行这种任意的操作。
然后,随机数序列生成器的输出为LFSR1 XOR LFSR2。
这个想法是,由于序列是生成比特的异或值,因此无法确定LFSR1和LFSR2的状态。此外,由于LFSR1和LFSR2的缩减是不同的,而且仅在LFSR3的进位比特为1时才会发生,因此它们的步长不同。
种子值
每个LFSR都需要一个初始状态,事实上需要128位的初始状态。Oceantoo通过获取明文密码并生成该字符串的SHA256哈希值来初始化LFSRs。使用该哈希值的前128位来初始化一个LFSR,称为LFSR Captain。然后使用LFSR Captain作为标准LFSR生成3x128位数据,用于初始化LFSR1-3。然后舍弃LFSR Captain。对于解码,如果提供相同的密码,则三个LFSR的初始状态将是相同的。
Oceantoo还有一个选项,即在开始编码或解码之前将其序列向前移动n个字节。这意味着要对文件进行编码,需要提供一个密码和一个可选的偏移量。要进行解码,需要相同的密码和相同的偏移量,否则解码将失败。
使用偏移量的潜在优势是将Oceantoo用作一次性密码(OTP)。加密的每个新消息都需要从一个新的偏移量开始,该偏移量应比先前编码的消息长度长1。OTP成功的一个条件是密钥不能在整个过程中或部分重复使用。
加密
实际的加密是使用XOR进行的。文件的每个字节都与来自三个128位LFSR组合的下一个字节进行XOR。这意味着要加密文件,您只需通过Oceantoo运行它一次,要解密它,您需要再次运行它!
性能
LFSR的优点之一是它在硬件上很容易实现。移位寄存器设置的特性允许高性能加密。缩小和使用多个LFSR的添加意味着Oceantoo不像其他加密机制那样高效。
示例用法
oceantoo -p mypassword1 secret_designs.doc secret_designs.doc.oct- 这将使用密钥mypassword1编码Word文档secret_designs.doc,并将输出写入secret_designs.doc.octoceantoo -p mypassword1 secret_designs.doc.oct secret_designs.doc- 是上述操作的反向操作(即解码)。oceantoo -p mypassword1 -n 187172 secret_designs.doc secret_designs.doc.oct- 这将使用密钥mypassword1和偏移量187172对Word文档secret_designs.doc进行编码,并将输出写入secret_designs.doc.octoceantoo -p mypassword1 -n 187172 secret_designs.doc.oct secret_designs.doc- 是上述操作的反向操作(即解码)。oceantoo -p mypassword1 -n 9854213 -r -l 50- 将从基于密码和偏移量的Oceantoo的LFSRs中打印出50个随机字节(0-255)。oceantoo -1 0x00 -2 0x00 -r -l 10- 将从Oceantoo的LFSRs中打印出10个随机字节,它们已被强制初始化为由-1和-2(分别是lsfr_l和lfsr_h)设置的比特模式。oceantoo -c -1 0xAAFFEEDDFEFE0000 -2 0xAABBCCFEFE00007E -r -l 10 -v- 将从Oceantoo的LFSRs中打印出10个随机字节,其中LFSR Captain已被强制初始化为由-1和-2(分别是lsfr_l和lfsr_h)设置的比特模式。使用-v标志提供额外的调试信息。
免责声明,因为良好的加密很难
“任何人都可以创建一个自己无法破解的算法”-Bruce Schneier。
良好的加密很难,有很多陷阱等等。 Oceantoo从未受到数学家或密码学专家的审查。它应该被视为纯学术(和业余)项目。
Oceanto按原样提供,并声明任何明示或暗示的保证,包括但不限于特定用途适用性的暗示保证都被否认。
你已经被警告了。
致谢
SHA256代码来自Brad Conte。请参阅他的GitHub: https://github.com/B-Con/crypto-algorithms