Из Википедия :
Ключ якобы состоит из 64 бит;однако только 56 из них фактически используются алгоритмом.Восемь битов используются исключительно для проверки четности и после этого отбрасываются.Следовательно, эффективная длина ключа составляет 56 бит, и она никогда не указывается как таковая.Каждый 8-й бит выбранного ключа отбрасывается, т.е. позиции 8, 16, 24, 32, 40, 48, 56, 64 удаляются из 64-битного ключа, оставляя только 56-битный ключ.
Таким образом, младшие значащие биты (т. Е. 0-е биты) не используются для построения ключа, их можно использовать для проверки четности с помощью DESKeySpec.isParityAdjusted()
.
EDIT: Простой тест, показывающий, чтомладшие биты игнорируются:
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);