我有一个应用程序,在那里我必须通过BLE广告传输一个长度固定为14字节的加密数据包。AES算法限制数据长度至少为16字节,DES要求数据长度为8字节的倍数。我有一个14字节的奇数长度,我无法更改。有什么加密算法可以用来加密这个14字节的数据吗。如果有人能指出该算法的任何基于C的实现,那也很好?
假设明文和密文的长度正好是14个字节:
在CTR模式下使用AES。这在每一侧产生相同的16字节数据块。您可以使用16个字节中的14个作为XOR键,并丢弃最后两个。
然而,这里有一条皱纹。底层协议是无状态广播。获得IV的唯一方法是使用唯一的数据包标识符,但可能没有。如果没有大约10个额外的字节,我将很难想出一个独特的IV生成器。
您可以将基于ECB的密文窃取(CTS(与块大小小于14字节的块密码一起使用。我不会详细介绍CTS是如何工作的,因为维基百科的文章做得很好。
如果你听说欧洲央行不好,那么你是对的。遗憾的是,任何其他模式都需要某种IV,这会耗尽你的有效载荷限制。由于CTS将密文的一部分移动到最后一个明文块,ECB的坏特性消失了。
与具有128比特块的分组密码相比,具有诸如64比特之类的小块大小的分组密码具有更差的安全特性。看看Sweet32的攻击就知道了。在您的情况下,我想这并不是一个真正的问题,因为攻击者无法让您生成许多加密广播,如果他们尝试,将需要很长时间。
一种流行的64位块大小的分组密码是DES。您可能听说过,由于密钥大小较小,DES很容易强制执行,因此您是正确的。三重DES(EEE或EDE(起到了拯救作用,它的密钥大小是原来的三倍,对暴力攻击有更好的保护。
遗憾的是,您不能使用AES,因为CTS至少需要两个块才能工作,而一个AES块已经打破了您的大小限制。
AES和DES都是块密码算法,所以它们可以处理的块的最小大小是正确的BUT使用块加密有很多不同的方法,其中一些可以处理任意长度的数据流。签出">s比特密码反馈模式";其中s是单独加密的实际块的大小。在这里,您可以使用s=2。
为什么不将数据框化,使其具有以下功能:
- 标题
- 有效载荷
- 填充
报头将包含数据的长度,加上可能的"0";魔术;检查同步的代码。有效载荷是您的数据。然后填充是一个零块(如果你愿意,也可以是随机数(,以适应分组密码所需的块侧倍数。
假设您想以相同的14个字节进行传输,那么您就有点卡住了。上面的建议意味着您需要传输16个字节(甚至更多(,然后忽略最后2个字节。
您需要数据的安全性如何?一个答案可能是使用DES加密所有完整的块(在您的情况下是一个8字节的块(,然后使用较弱的东西对剩余的(在您情况下是6个(字节进行编码。一种相当安全的方法是简单地将之前的6字节解码字节值与剩余的6字节尾部数据异或。在DES保护的数据被解码之前,不能确定xor值。
当然,如果DES部分都是零,那么你的尾码将是可见的。如果这种情况很少发生,这可能不是问题,因为黑客不知道DES数据是零。你没有太多的数据,所以很难想象你能做更多的事情。
通常,您可以生成前1K原始数据的64位(8字节(校验和,并将其用作xor。通常情况下,您将有一个小于8字节的尾部数据,您将对其进行异或,并且只传输字节数。解码时,将忽略剩余的字节。