我在互联网上发现了一些代码示例,它们使用 CipherInputStream 或其他东西加密字节......如果我有一个包含 1000 位的文件怎么办,我该如何应用 DES 呢?我在java中做
2 回答
这是一个相当合理的问题,尽管投了反对票。
许多加密模式(例如 CBC)要求输入是底层密码块大小的倍数(例如,AES 为 16 字节,DES 为 8 字节)。为了实现这一点,使用了一种填充方案。是否可以加密具有任意位长度的明文取决于您使用的填充方案。
最常用的填充方案(即 PKCS #5 填充)将 n 个字节的值 n 添加到明文中。这显然要求明文以字节为单位。但是有一些鲜为人知的填充方案允许任意输入。例如,所谓的“位填充”将单个 1 位附加到您的明文中,并根据需要附加尽可能多的 0 位,直到您的输入长度是密码块大小的倍数。例如,ISO/IEC 9797-1 标准提出了这一点。
在决定是否要在应用程序中支持任意位长度时,您还必须考虑要使用的加密库。虽然一些加密算法已经标准化以允许以位为单位的任意大小的输入,但您的加密库可能无法实现它。例如,散列函数 SHA-1 对输入(例如 4 位字符串 '0101')进行了很好的定义,但您可能很难找到一个可以实际计算此散列的库。
Java 没有允许您访问小于字节的任何内容的原始类型。因此,您需要处理字节,而不是 Java 中的位。
如果我有一个包含 1000 位的文件怎么办,我该如何应用 DES 呢?
使用字节。Cipher.doUpdate和Cipher.doFinal方法使用字节,而不是它们的数组。使用合适的填充方案来解释任何未填充的数据。