我的设备不支持完整的3DES(EDE)。如何使用标准DES模拟一个?加密模式是CBC。
答案 0 :(得分:4)
首先选择三个独立的DES密钥,它们之间没有任何关系。
您需要将DES置于ECB模式,不是CBC模式。您还需要确保每个加密和解密操作仅在64位块上完成,而不是更多或更少。填充方案等会在实现中造成漏洞,并且会导致通过强力发现块内容的速度比对每个密钥的强力更快。
使用第一个密钥加密您的明文。使用第二个密钥,解密该值。使用第三个密钥,加密整个块的值。它看起来像这样:
Encrypt(k3, Decrypt(k2, Encrypt(k1, plaintext)))
解密是另一种方式,看起来像这样:
Decrypt(k1, Encrypt(k2, Decrypt(k3, ciphertext)))
当您使用3DES加密块时,您需要应用您的操作模式,如CBC或CTR,并在需要时应用填充。
小心。
答案 1 :(得分:1)
您所做的是将128位(16字节)或168位(24字节)的密钥分别分成两部分或三部分。因此,对于16字节的密钥K,您将拥有两个密钥Ka和Kb,而对于24字节密钥,您将拥有Ka,Kb和Kc。 DES ABC密钥的有效强度约为112位,DES ABA密钥的有效强度约为80位。
要加密8个字节的单个块(DES和3DES的块大小),您将执行以下加密操作:Cn = E(Ka,D(Kb,E(Kc,Mn)))其中Mn是明文消息的第n个块和Cn密文的第n个块。如果您没有Kc,那么您可以使用Ka(DES ABC密钥与DES ABA密钥)。
为此,您需要单个块DES加密,这与ECB模式下的单个块加密相同,或者单个块使用CBC加密,IV由8个字节组成,值为00h。
所以这是块加密排序,现在你需要某种加密模式和填充模式。我将在这里解释CBC模式加密,ECB不应该用于加密非随机数据。
使用CBC模式加密,您可以将矢量与纯文本进行异或。向量通常只是最后一个DESede加密块的输出。由于您没有任何前面的密文,您需要使用随机数据自己创建第一个向量。该向量称为初始化向量或IV。有关清晰的图片,请参阅wikipedia。
分组密码模式只允许加密完整的纯文本块。所以你需要一些填充方案。尽管有许多填充模式,但大多数时候都使用PKCS#5填充。你应该像这样填充纯文本:pad的字节值为0Xh,其中X是创建完整块所需的填充字节数。 X应该在1到8之间:换句话说,总是使用PKCS#5填充;这使得填充字节与纯文本区分开来成为可能。
如果在在线协议中使用填充,则需要防止填充oracle攻击。在这种情况下,强烈建议使用某种形式的完整性检查,例如通过使用单独的密钥在密文上添加HMAC。
答案 2 :(得分:0)
3DES只是在明文上使用了三次DES:
ciphertext = E_K3(D_K2(E_K1(plaintext)))
plaintext = D_K1(E_K2(D_K3(ciphertext)))
E_Kn = Encryption with Key number n.
D_Kn = Decryption with Key number n.
因此,您可以使用DES轻松“模拟”3DES。
在CBC模式下,你需要一个IV开始,然后用前一个密文块对下一个明文块进行异或。如果您的设备不支持CBC,那么这也很容易“模仿”。