Take the 2-minute tour ×
Cryptography Stack Exchange is a question and answer site for software developers, mathematicians and others interested in cryptography. It's 100% free, no registration required.

Do we have any library or any mechanism where we can use true 7 byte key for DES instead of 8 byte key. I need it for keys analysis in DES and 8 byte key requirement for associated library is creating problem in getting actual keys analysis.

share|improve this question
1  
My suggestion would be to find an open source implementation and modify it to do what you want. Shouldn't be too hard as I think DES ignores the parity bits anyways. –  mikeazo Apr 24 at 18:45
    
DES ignores the parity bits and results 256 equivalent 8 byte keys to each 7 byte key leaving extra computation in my approach of analysis. Any ways Thank you so much for suggestion. Will go with it :) –  ceasif Apr 24 at 18:56

2 Answers 2

up vote 4 down vote accepted

You need to split up your key into eight 7 bit pieces, and put these 7 bits into a byte each. The parity is in the least significant bit on most platforms, so the 7 bits need to go into the most significant bits. Of course, as the key is probably in bytes, you need to shift and combine the values in the bytes to retrieve the 7 bits.

It's possible the library does not require the parity bits to be set. In that case you don't need to calculate the parity. Otherwise you simply create the parity once you've got the 8 bytes.

Following code is in Java (which makes it a bit awkward because Java bytes are signed and most calculations assume integers).

// --- create 64 bit key from 56 bit key
// least significant bit can have any value
key64[0] = (byte) (key56[0] & 0xFE); // << 0
key64[1] = (byte) ((key56[0] << 7) | ((key56[1] & 0xFF) >>> 1));
key64[2] = (byte) ((key56[1] << 6) | ((key56[2] & 0xFF) >>> 2));
key64[3] = (byte) ((key56[2] << 5) | ((key56[3] & 0xFF) >>> 3));
key64[4] = (byte) ((key56[3] << 4) | ((key56[4] & 0xFF) >>> 4));
key64[5] = (byte) ((key56[4] << 3) | ((key56[5] & 0xFF) >>> 5));
key64[6] = (byte) ((key56[5] << 2) | ((key56[6] & 0xFF) >>> 6));
key64[7] = (byte) (key56[6] << 1);

// --- set parity in time independent of the values within key64
for (int = 0; i < key64.length; i++) {
    // if even # bits, make uneven, take last bit of count so XOR with 1
    // for uneven # bits, make even, take last bit of count so XOR with 0  
    key64[i] ^= Integer.bitCount(key64[i] ^ 1) & 1;
}
share|improve this answer
    
@fgrieu Right. I've made some comment on the code. I had mentioned before that it was Java, but that got removed during one of my edits. Feel free to make it side channel resistant, I'm presuming this kind of thing does not happen too often and can be performed on a secure system for now. –  owlstead Apr 25 at 19:31
    
I edited pyDes and its accepting 7 bytes key :) thank you for comment –  ceasif Apr 26 at 8:43
    
Note that I did not write extensive tests for this code; so please don't forget to add some unit testing. –  owlstead Apr 26 at 9:31
    
@fgrieu added your side channel code and removed 0xFE in favor of a comment. –  owlstead Apr 27 at 13:40
    
@owlstead: I see, nice. But I can't upvote twice! –  fgrieu Apr 27 at 13:44

Here, I edited existing pyDes library just by adding a new function to convert a 7 byte key into 64 bits required by the code. But I am not sure if the code implements DES in true sense

code

def __String_to_BitList_Key(self, data):
    """Turn the string data, into a list of bits (1, 0)'s"""
    if _pythonMajorVersion < 3:
        # Turn the strings into integers. Python 3 uses a bytes
        # class, which already has this behaviour.
        data = [ord(c) for c in data]
    l = len(data) * 8+8
    result = [0] * l
    pos = 0
    k=-1
    for ch in data:
        k+=1;j=k
        i = 7

        while i >= 0:
            j+=1 
            if j== 8: result[pos] = 0;pos += 1 #appending 0 to each 8th bit in transformed 8 byte
            if ch & (1 << i) != 0:
                result[pos] = 1
            else:
                result[pos] = 0
            pos += 1
            i -= 1

    print True;return  result;
share|improve this answer
    
Yes, but most crypto libraries won't accept bit lists, and that one again is not protected against side channel attacks (because of the if). why not try and port above Java code? Doesn't set parity either. –  owlstead Apr 28 at 7:58

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.