DES加密中不同密钥加密出来的内容一样,解密也一样,为什么?

发布于 2022-01-03 13:33:56 字数 237 浏览 528 评论 15

明文为:QKCXRHFAZMGVUHQN

密钥:PPPPPPPPPPPPPPPP  或者 QQQQQQQQQQQQQQQQ

采用DESede/ECB/NoPadding 进行加密  

加密后密转换为16进制 密文为:AAEAAF2DABDE20366516B2734EFBB967

该过程中可以把P和Q随意替换,密文不变。

请问有知道这是为什么的吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(15

如日中天 2022-01-07 19:54:51

@LiYong_Luke  是对的

冬天旳寂寞 2022-01-07 19:54:50

@LiYong_Luke 是对的

秋意浓 2022-01-07 19:54:33

回复
@120011676 : 96

风苍溪 2022-01-07 19:54:24

DES的密钥是64位,它分成的8组,每一组的最后一位是校验位,因此有效密钥是56位,因此对于java,只能8个P。 太多或太少都会是Wrong key size

清欢 2022-01-07 19:52:15

回复
我看错了,你是DESede, 那密码应该是24个P。因为它需要的是168位有效密钥

南冥有猫 2022-01-07 19:52:07

回复
杠上了,8P也不对,楼主也不贴他代码

等你爱我 2022-01-07 19:50:17

回复
@120011676 : 24P,对了

本王不退位尔等都是臣 2022-01-07 19:41:39

你们讨论那么激烈,我试了下,楼主JavaScript吧?java不能用这个key。

import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Hex;

import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

public class DESedeTest {
    public static void main(String[] args) throws Exception {
        String key = "PPPPPPPPPPPPPPPP";
        String content = "QKCXRHFAZMGVUHQN";
        System.out.println(Hex.encodeHexString(ec(key.getBytes(), content.getBytes())));
        String m = ec(key, content);
        System.out.println(ec(key, content));
        System.out.println(dc(key, m));
        System.out.println(dc("QQQQQQQQQQQQQQQQ", m));

    }

    public static String ec(String key, String content) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
        String Algorithm = "DESede/ECB/NoPadding";
        SecretKey secretKey = new SecretKeySpec(key.getBytes(), "DESede");
        Cipher c1 = Cipher.getInstance(Algorithm);
        c1.init(Cipher.ENCRYPT_MODE, secretKey);
        return Hex.encodeHexString(c1.doFinal(content.getBytes()));
    }

    public static String dc(String key, String content) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, DecoderException {
        String Algorithm = "DESede/ECB/NoPadding";
        SecretKey secretKey = new SecretKeySpec(key.getBytes(), "DESede");
        Cipher c1 = Cipher.getInstance(Algorithm);
        c1.init(Cipher.DECRYPT_MODE, secretKey);
        return new String(c1.doFinal(Hex.decodeHex(content.toCharArray())));
    }

    public static byte[] ec(byte[] key, byte[] data)
            throws Exception {
        SecretKey deskey = new SecretKeySpec(key, "desede");
        Cipher cipher = Cipher.getInstance("DESede/ECB/NOPADDING");
        cipher.init(Cipher.ENCRYPT_MODE, deskey);
        return cipher.doFinal(data);
    }

    public static byte[] de(byte[] key, byte[] data)
            throws Exception {
        SecretKey deskey = new SecretKeySpec(key, "DESede");
        Cipher cipher = Cipher.getInstance("DESede/ECB/NOPADDING");
        cipher.init(Cipher.DECRYPT_MODE, deskey);
        return cipher.doFinal(data);
    }

}

Exception in thread "main" java.security.InvalidKeyException: Wrong key size
    at java.base/com.sun.crypto.provider.DESedeCrypt.init(DESedeCrypt.java:69)
    at java.base/com.sun.crypto.provider.ElectronicCodeBook.init(ElectronicCodeBook.java:95)
    at java.base/com.sun.crypto.provider.CipherCore.init(CipherCore.java:591)
    at java.base/com.sun.crypto.provider.CipherCore.init(CipherCore.java:467)
    at java.base/com.sun.crypto.provider.DESedeCipher.engineInit(DESedeCipher.java:166)
    at java.base/javax.crypto.Cipher.implInit(Cipher.java:870)
    at java.base/javax.crypto.Cipher.chooseProvider(Cipher.java:932)
    at java.base/javax.crypto.Cipher.init(Cipher.java:1302)
    at java.base/javax.crypto.Cipher.init(Cipher.java:1239)
    at DESedeTest.ec(DESedeTest.java:41)
    at DESedeTest.main(DESedeTest.java:13)

Process finished with exit code 1
 

像你 2022-01-07 19:40:09

该答案为正解,事后我自己研究了下,DES加密算法,第八位及其八的倍数位为校验位。

多彩岁月 2022-01-07 19:37:23

因为P和Q的二进制码仅仅是最后一位不同,P是1010000 Q是1010001 ,而标准的DES加密,密钥的是7位密钥+1位校验码,而加密的时候直接忽略了加密密钥的校验位,所以这样加密密钥是一样的了,当然密文也一样了。

类似的,你还可以使用bbbbbbbb  cccccccc 两组密码加密密文也是一样的,因为b 是1100010 c是1100011

恋你朝朝暮暮 2022-01-07 13:43:01

可怕

岁吢 2022-01-07 10:32:15

这个网站上没有无填充模式

月牙弯弯 2022-01-07 04:05:18

你这是有填充的,我那是无填充的

南汐寒笙箫 2022-01-06 22:39:07

这个网站是有填充的,我那个是无填充的

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文