【问题标题】:encryption using provided key using DES with padding使用带有填充的 DES 使用提供的密钥进行加密
【发布时间】:2012-05-24 22:22:19
【问题描述】:

我想使用给定密钥使用 DES 加密帧。

我使用的填充样式是 PKCS5Padding。如果要添加 2 个字节,则使用 02 02 填充字符串;如果要添加 3 个字节以形成 8 的倍数,则使用 03 03 03 填充字符串。 但我的要求是用我的特定字节填充一个字符串。例如,如果要添加 2 个字节,则添加 30 30 和 3 个字节,然后添加 30 30 30(十六进制 0 的值为 30)。另外,我必须知道添加了多少填充字节。 我应该遵循哪种填充技术以及如何使用它?

下面是我的加密代码:

byte[] keyValue = new byte[]{(byte) 0x30, (byte) 0x30, (byte) 0x30, (byte) 0x30, (byte) 0x30, (byte) 0x16,(byte) 0x05, (byte) 0x12};
myKeySpec = new DESKeySpec(keyValue);
mySecretKeyFactory = SecretKeyFactory.getInstance("DES");
key = mySecretKeyFactory.generateSecret(myKeySpec);


Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
IvParameterSpec iv2 = new IvParameterSpec(new byte[8]);
cipher.init(Cipher.ENCRYPT_MODE, key, iv2);
byte[] plainText = function.HexStringToByteArray(payloadRecv);
byte[] encryptedText = cipher.doFinal(plainText);

【问题讨论】:

    标签: java encryption padding des


    【解决方案1】:

    不要在密码规范中选择PKCS5Padding。选择NoPadding。在加密之前,您必须自己将填充添加到数据中。解密后(同样不使用填充),您必须检查最后一个字节以了解要删除和自己删除的填充字节数。

    基本上,只需按照您的描述编写代码即可。

    【讨论】:

    • 没错,但我希望你的数据不要以 30h 结尾,因为无法区分数据和填充。我从未听说过询问者描述的填充机制,因此它不会包含在任何加密 API 中。
    • @Robert:是的,如果你总是添加填充,就会有填充。这与我的评论有何关系?
    • @Robert:无论使用什么填充方案,它都必须允许解密器区分真实数据和填充。如果真实数据以 30H 结束,那么你怎么知道真实数据在哪里结束和填充开始?假设解密器解密最后一个块并看到 30H 30H。哪些字节是填充,哪些是数据?
    • 如果我对原始问题的理解正确,他确定要添加的填充字节数,然后将每个字节的值设置为该数字的 16 倍。所以如果最后一个字节是0x40,那么就有4个字节的填充。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    相关资源
    最近更新 更多