0

我有一个使用 Triple DES 加密和解密数据的代码。代码一切正常。

我对 Triple Des 有疑问。Triple DES 在执行加密过程时会改变数据大小。我用谷歌搜索,对我得到的答案完全感到困惑。

它会改变吗?如果是,则表示如何查找加密数据的大小。

这是代码:

unsigned char   initVector[8];
unsigned char*  block;
int     j;

    memset(initVector, 0xEE, sizeof(initVector));
    nBlocks = dwDataSize / 8;

    for (i=0; i < nBlocks; i++)
    {
        block = (unsigned char*) pData + i*8;
        memset(initVector, 0xEE, sizeof(initVector));
        des_ede3_cbc_encrypt((unsigned char *)block,(unsigned char *)block, 8,
                m_Schedule1 , m_Schedule2, m_Schedule3, (C_Block *)initVector, DES_ENCRYPT);

我在另一个讨论中看到大小会改变。

链接在这里。 加密字符串的长度

问候,湿婆。/

4

2 回答 2

4

TripleDES 是一种分组密码原语。分组密码通过基于密钥创建输入数据块(应该与随机数据无法区分)的排列来工作,只有在密钥已知的情况下才能反转。

因此,加密数据占用与输入数据完全相同的空间量(可能除了最后一个块的填充)。典型的块大小是从 4 到 32 字节的任何 2 的幂。

(一个思想实验:密文不可能比输入,因为两个不同的输入必须映射到同一个密文,这是不可能的。相反,如果密文更长,那么将是某些密文,而不是加密的结果,因此不会“与随机数据无法区分”。)

于 2012-09-10T07:41:14.120 回答
0

这取决于。更准确地说,它取决于以下要素:

  1. 密文和明文的编码
  2. 加密模式
  3. 填充模式和块大小
  4. NONCE 或 IV
  5. (可选)身份验证标签

3DES 是一种分组密码。这是一个看似随机的位排列(主要使用字节作为最小元素)。单个 3DES 使用 64 位/8 字节作为输入并生成相同的大小

从第一个开始:如果您加密一段文本(字符串),那么您需要先将字符串编码为字节。如果您希望将密文存储在字符串中,则需要将结果转换为字符串。

接下来是加密模式:如果这是一种将 3DES 块密码转换为流密码(例如 CTR)的模式,则输入大小与输出大小相同,不包括 NONCE。

然后是填充模式。如果您使用 ECB 或 CBC 模式加密,那么如果纯文本有 length ,则必须填充,并且是块大小(以字节为单位)。如果您可以将纯文本与填充区分开来,那么您可以添加填充字节。如果你不能,那么你需要总是填充,添加到填充字节。PKCS#5 填充(最常见的一种)总是填充。xx % n != 0n0n - 11n

通常您还需要传输 IV 或 NONCE。它们通常都与块大小大致相同。一个常见的选择是在密文前面加上 IV。这通常针对您应用的 CBC 模式加密执行。唯一不应该创建新(随机)IV 的情况是您只使用一次密钥。

大多数情况下,您应该为密文添加完整性保护。如果您使用例如 GCM 模式加密,那么您需要一些额外的空间用于身份验证标签。如果您使用 MAC 或 HMAC,那么这应该包含在密文的顶部。

还有密文窃取之类的东西,可以用来取消填充。最后,对于某些单块加密模式,您可能不需要 IV。

在你的情况下

如果您使用字节,请使用 CBC 模式加密,预先添加 IV 并使用 PKCS#5 填充,那么计算将是(n) + ((x) + (n - x % n)). 对于 3DES n = 8,.

于 2012-09-11T18:14:19.243 回答