Java DES加密普通与密码长度

Java DES加密普通与密码长度,java,encryption,des,encryption-symmetric,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) thr

我正在使用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吗

编辑: 好心的,我需要澄清的答案。密码始终以=。这可能是因为填充物吗?你能给我解释一下为什么/如何得出这个长度的密码吗?并且总是以=?
我的代码是正确的还是有错误?我对编码部分有疑问。

有几件事:

  • 返回表示使用“平台的默认字符集”(例如,可以是UTF-8或UTF-16或..)对字符串进行编码的字节,以避免混淆!在任何情况下,请参见
    msgBytes.length
    以获取真正的纯文本长度

  • ,作为块密码,将沿边界填充输出-但在使用时,这将始终大于纯文本(请参阅
    msgBytes.length
    )长度,因为纯文本始终填充有[1,8]字节。要查看真正的加密大小,请参阅
    textcencrypted.length

  • 加密的字节使用base-64进行编码,该过程独立于加密,增加了所需的字节数(因为每个字符/字节仅使用6位)。Java base-64实现也引入了尾随“=”字符

  • 只要您(或其他拥有正确算法和密码密钥的人)能够检索初始字符串——按相反顺序执行每个步骤的反转,那么它就可以工作。如果某一特定步骤没有反向/反向操作或无法“撤消”,则说明有问题;但这也意味着每一步都可以单独测试


    对数字

  • msg.getBytes()
    返回ASCII/UTF-8编码序列(如果使用UTF-16或另一种“宽”编码,则下面的数字将太大)
  • 因此,
    msgBytes.length
    为24
  • 由于
    msgBytes.length
    mod 8为0,纯文本中填充了8个字节,其值为0x08(根据CKCS#5)
  • 因此,
    textEncrypted.length
    是32(24个数据+8个填充)
  • 由于base-64编码,32字节*1.33~43个字符
  • 使用base-64填充(
    =
    ),最终结果是44个字符
    发生了几件事:

  • 返回表示使用“平台的默认字符集”(例如,可以是UTF-8或UTF-16或..)对字符串进行编码的字节,以避免混淆!在任何情况下,请参见
    msgBytes.length
    以获取真正的纯文本长度

  • ,作为块密码,将沿边界填充输出-但在使用时,这将始终大于纯文本(请参阅
    msgBytes.length
    )长度,因为纯文本始终填充有[1,8]字节。要查看真正的加密大小,请参阅
    textcencrypted.length

  • 加密的字节使用base-64进行编码,该过程独立于加密,增加了所需的字节数(因为每个字符/字节仅使用6位)。Java base-64实现也引入了尾随“=”字符

  • 只要您(或其他拥有正确算法和密码密钥的人)能够检索初始字符串——按相反顺序执行每个步骤的反转,那么它就可以工作。如果某一特定步骤没有反向/反向操作或无法“撤消”,则说明有问题;但这也意味着每一步都可以单独测试


    对数字

  • msg.getBytes()
    返回ASCII/UTF-8编码序列(如果使用UTF-16或另一种“宽”编码,则下面的数字将太大)
  • 因此,
    msgBytes.length
    为24
  • 由于
    msgBytes.length
    mod 8为0,纯文本中填充了8个字节,其值为0x08(根据CKCS#5)
  • 因此,
    textEncrypted.length
    是32(24个数据+8个填充)
  • 由于base-64编码,32字节*1.33~43个字符
  • 使用base-64填充(
    =
    ),最终结果是44个字符
    DES加密的结果始终是8字节的倍数。根据指定的填充算法,输入也被填充到8字节的倍数

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


    因此,44个字符的输出对应33个字节,但末尾的=表示实际上只有32个字节。这很好,因为使用PKCS5填充的24字节清除数据将变为32字节。

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

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

    因此,44个字符的输出对应33个字节,但末尾的=表示实际上只有32个字节。这很好,因为使用PKCS5填充的24字节清除数据变为32字节