1
votes

I am working on generating a 64 bits keys for DES where only 20 bits are effective i.e. the rest is padded with zeros. The way I am trying to approach it is by having a BitSet of 23 bits where every 8th is skipped (i.e. kept as false) and the rest is determined the SecureRandom.nextBoolean(). So, the output of my BitSet is 23 bits where every 8th is false. The reason why I do this is to make sure that the parity bits are not a part of the 20 bits effective key. Afterwards, I try to convert the BitSet by using Bitset.toByteArray(), which gives me 3 bytes and then I pad the rest 5 bytes with zeros. However, the problem occurs when I try to convert the BitSet to a byte[] as the representation is reversed.

public static byte[] generateDesKey() {
        BitSet temp = new BitSet();
        byte[] zeroByteKey = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
        Random r = new SecureRandom();

        for (int i = 0; i < 64; i++) {
            if (i % 8 != 0 && i < 23) {

                temp.set(i, r.nextBoolean());
            }
        }

          StringBuilder sb = new StringBuilder();
          for( int i = 0; i < temp.length();  i++ )
          {
              sb.append( temp.get( i ) == true ? 1: 0 );
          }

          System.out.println("Bitset " +sb );

        byte[] tempByteKey = temp.toByteArray();

        for (byte b : tempByteKey) {
            System.out.print(Integer.toBinaryString(b & 255 | 256).substring(1));
        }

        for (int i = 0; i < tempByteKey.length; i++) {
            zeroByteKey[i] = tempByteKey[i];
        }

        return zeroByteKey;
    }

An example of output:

Bitset 00010100011110010011101 // 23 bits where parity bits are skipped
Converted BitSet to byte[] in binary 101101000000111001011100 // 24 bits where every 8 bits are reversed

The reason why, I assume, the second output is 24 bits is because 23 bits is rounded up to 3 bytes, when converted from BitSet to byte[].

please see here - xerx593