DES加密普通与密码长度

时间:2013-10-19 05:21:15

标签: java encryption des encryption-symmetric

我正在使用Java制作一个玩具程序,使用DES加密来加密消息。我要加密的消息是:

String msg="This is a secret message";

我将其转换为字节为:

byte [] msgBytes=msg.getBytes();

并将其发送到加密功能如下:

//encryption function
public static String encryptMsg(byte [] msgBytes, SecretKey myDesKey) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException
{
    Cipher desCipher;
    // Create the cipher 
    desCipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
    desCipher.init(Cipher.ENCRYPT_MODE, myDesKey);
    byte[] textEncrypted = desCipher.doFinal(msgBytes);

// converts to base64 for easier display.
byte[] base64Cipher = Base64.encode(textEncrypted);
return new String(base64Cipher);
} //end encryptMsg

然后,我显示密码,密码和明文长度,然后我得到:

Encrypted Message: FDCU+kgWz25urbQB5HbFtqm0HqWHGlGBHlwwEatFTiI=
Original msg length: 24
Encrypted msg length: 44

您能否向我澄清为什么密码长度为44而原始邮件长度为24?

修改 请注意,我需要澄清答案。密码始终以=结尾。这可能是因为填充?你能解释一下这个长度导致密码的原因和方式吗?总是以=?结尾? 我的代码是正确的还是有错误的?我对编码部分有疑问。

2 个答案:

答案 0 :(得分:2)

有几件事情在发生:

  1. msg.getBytes()使用“平台的默认字符集”返回表示字符串编码的字节(例如,可以是UTF-8 UTF-16 或< / em> ..):specify the encoding manually以避免混淆!在任何情况下,请参阅msgBytes.length以获取 true 纯文本长度。

  2. 作为块密码的
  3. DES将沿block size边界填充输出 - 这将总是更大使用PKCS#5时的纯文本(参考msgBytes.length)长度,因为纯文本总是用[1,8]字节填充。要查看 true 加密大小的内容,请参阅textEncrypted.length

  4. 加密字节使用base-64进行编码,此过程(与加密无关)会增加所需的字节数by about 33%(因为每个字符/字节仅使用6位)。 Java base-64实现也adds padding,这是引入尾随“=”字符的地方。

  5. 只要您(或其他具有正确算法和密钥的人)可以检索初始字符串 - 通过以相反顺序执行每个步骤的反转,那么它就可以工作。如果特定步骤没有反向/反向操作或者不能“撤消”,则出现问题;但这也意味着每一步都可以单独测试


    给数字!

    1. msg.getBytes()返回ASCII / UTF-8编码序列(如果它使用UTF-16或其他“宽”编码,则下面的数字会太大)
    2. 因此,msgBytes.length为24
    3. 由于msgBytes.length mod 8为0,纯文本为 padded ,其中8个字节的值为0x08(每个CKCS#5)
    4. 因此,textEncrypted.length为32(24个数据+8个填充)
    5. 由于base-64编码,32字节* 1.33~43个字符
    6. 使用base-64填充(=),最终结果为44个字符!

答案 1 :(得分:2)

DES加密的结果将始终是8个字节的倍数。根据指定的填充算法,输入也被填充为8个字节的倍数。

base 64编码将每3个字节编码为4个字符(3x8 = 4x6 = 24),并通过填充=字符确保输出长度为4的倍数。

因此,44个字符输出对应33个字节,但最后的=表示实际上只有32个字节。哪个没问题,因为带有PKCS5填充的24字节清除数据变为32字节。