Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从56位二进制字符串创建DES密钥_Java_Binary_Jca - Fatal编程技术网

Java 从56位二进制字符串创建DES密钥

Java 从56位二进制字符串创建DES密钥,java,binary,jca,Java,Binary,Jca,我有一个56位的二进制字符串,我想用作DES加密的密钥 我在JCA文档网站上找到了以下代码 byte[] desKeyData = { (byte)0x01, (byte)0x02, (byte)0x03, (byte)0x04, (byte)0x05, (byte)0x06, (byte)0x07, (byte)0x08 }; DESKeySpec desKeySpec = new DESKeySpec(desKeyData); SecretKeyFactory keyFactory = S

我有一个56位的二进制字符串,我想用作DES加密的密钥

我在JCA文档网站上找到了以下代码

byte[] desKeyData = { (byte)0x01, (byte)0x02, (byte)0x03, 
(byte)0x04, (byte)0x05, (byte)0x06, (byte)0x07, (byte)0x08 };
DESKeySpec desKeySpec = new DESKeySpec(desKeyData);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
但是,这将使用8个字节作为密钥(而不是7个字节)。不清楚desKeyData[0]是对应于最低有效字节还是最高有效字节。此外,是否可以直接使用56位字符串生成可用于此目的的字节数组?

来自:

密钥表面上由64位组成;然而,该算法实际上只使用了其中的56个。八位仅用于检查奇偶校验,然后被丢弃。因此,有效密钥长度为56位,并且从未引用过。所选密钥的每8位被丢弃,即从64位密钥中删除位置8、16、24、32、40、48、56、64,只留下56位密钥

因此,最低有效位(即第0位)不用于密钥构造,它们可通过
DESKeySpec.isParityAdjusted()
用于检查奇偶校验

编辑:显示忽略最低有效位的简单测试:

SecretKeyFactory sf = SecretKeyFactory.getInstance("DES");
byte[] in = "test".getBytes("UTF-8");

Cipher c1 = Cipher.getInstance("DES");
c1.init(Cipher.ENCRYPT_MODE, sf.generateSecret(new DESKeySpec(
   new byte[] {0x10,0x20,0x30,0x40,0x50,0x60,0x70,(byte) 0x80})));
byte[] r1 = c1.doFinal(in);

Cipher c2 = Cipher.getInstance("DES");
c2.init(Cipher.ENCRYPT_MODE, sf.generateSecret(new DESKeySpec(
    new byte[] {0x11,0x21,0x31,0x41,0x51,0x61,0x71,(byte) 0x81})));
byte[] r2 = c2.doFinal(in);

assertArrayEquals(r1, r2);  

有效位是改变一个或数的符号的位。最高或最低有效位的概念不能应用于字节

正如axtavt answer所说,从序列的所有64位中,只有以下范围内的位被用作实际密钥:
(1..7)、(9..15)、(17..23)、(25..31)、(33..39)、(41..47)、(49..55)、(57..63)
。例如,变为1的序列上的56个相关位是:
0x7f、0x7f、0x7f、0x7f、0x7f、0x7f、0x7f、0x7f
,将最高有效位保留为零作为奇偶校验


要实际将7字节、56位序列转换为8字节序列,您可以使用。

8字节输入通常意味着它使用每个字节的7个最低有效位。哪个字节的有效位最高?第0次还是第7次?最重要的是,为什么我们在2011年仍然使用DES?(第一个回答“向后兼容”将获得“You't-get-my-point-did-You?”徽章)数字0x01的最低有效位设置为1,数字0x80的最高有效位设置为1。@vz0-我的意思是在字节数组中。。索引0处的字节是否为最低有效字节?位位置为8、16等。。这不是意味着每个字节的最高有效位而不是最低有效位吗?从1开始,奇偶校验位是每个字节的最高有效位。根据您所指的代码,设置奇偶校验位:
result[7-resultIx/8]|=1。在这种情况下,最低有效位用于奇偶校验。@axtavt如果我将56位二进制字符串拆分为一个大端字节数组,则任何字节的msb都可以是“1”,但字节数据类型不允许这样做(其范围为-2^7-1到2^7-1)。类型转换是解决此问题的正确方法吗?我想知道,如果我将这些类型转换为字节,我还会使用我想要使用的同一个键吗?