java - DES 加密明文与密码长度

标签 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 吗?

编辑: 请,我需要澄清的答案。密码总是以 = 结尾。这可能是因为填充?你能向我解释为什么/如何用这个长度产生密码吗?并且总是以 =? 我的代码是正确的还是有错误?我对编码部分有疑问。

最佳答案

有几件事情正在发生:

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

  2. DES ,作为一个 block 密码,将沿着 block size 填充输出边界 - 但是当使用 PKCS#5 时,这将总是大于纯文本(引用msgBytes.length)长度因为纯文本总是用 [1,8] 字节填充。要查看真实 加密大小是多少,请参阅textEncrypted.length

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

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


数字!

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

关于java - DES 加密明文与密码长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19462675/

相关文章:

java - Box2DDebugRenderer 和 SpriteBatch 错位

java - 运行程序时出现 ClassNotFoundException

java - 使用列表/字符串单击并下拉值

c++ - Tag18 的 OpenPGP CFB 模式

c# - Windows 应用商店应用、加密、提供的用户缓冲区对于请求的操作无效

node.js - 如何在 Node.js 中加密?

c - 寻找良好的小型 DES 实现

java - 如何在 Java 中自动裁剪图像的白色边框?

c# - 通过加密数据生成MAC

.net - KCV值-3DES加密