How should I create my DES key? Why is an 7-character string not enough?
Asked Answered
F

7

4

I'm having a bit of difficulty getting an understand of key length requirements in cryptography. I'm currently using DES which I believe is 56 bits... now, by converting an 8 character password to a byte[] my cryptography works. If I use a 7 digit password, it doesn't.

Now, forgive me if I'm wrong, but is that because ASCII characters are 7 bits, therefor 8 * 7 = 56bits?

That just doesn't seem right to me. If I want to use a key, why can I not just pass in a salted hash of my secret key, i.e. an MD5 hash?

I'm sure this is very simple, but I can't get a clear understanding of what's going on.

Frieda answered 8/6, 2009 at 15:31 Comment(0)
I
7

Each algorithm is designed to accept a certain key length. The key is used as part of the algorithm, and as such, can't be whatever your heart desires.

Common key sizes are:

  • DES: 56bit key
  • AES: 128-256bit key (commonly used values are 128, 192 and 256)
  • RSA (assymetric cryptography): 1024, 2048, 4096 bit key

A number, such as 1234567 is only a 4-byte variable. The key is expected to be a byte array, such as "1234567" (implicitly convertible to one in C) or `{ '1', '2', '3', '4', '5', '6', '7' }.

If you wish to pass the MD5 hash of your salted key to DES, you should use some key compression technique. For instance, you could take the top 7 bytes (somewhat undesirable), or perform DES encryption on the MD5 hash (with a known constant key), and take all but the last byte as the key for DES operation.

edit: The DES I'm talking about here is the implementation per the standard released by NIST. It could so be (as noted above), that your specific API expects different requirements on the length of the key, and derives the final 7-byte key from it.

Interplay answered 8/6, 2009 at 15:42 Comment(0)
M
12

DES uses a 56-bit key: 8 bytes where one bit in each byte is a parity bit.

In general, however, it is recommended to use an accepted, well-known key derivation algorithm to convert a text password to a symmetric cipher key, regardless of the algorithm.

The PBKDF2 algorithm described in PKCS #5 (RFC 2898) is a widely-used key derivation function that can generate a key of any length. At its heart, PBKDF2 is combining salt and the password through via a hash function to produce the actual key. The hash is repeated many times so that it will be expensive and slow for an attacker to try each entry in her "dictionary" of most common passwords.

The older version, PBKDF1, can generate keys for DES encryption, but DES and PBKDF1 aren't recommended for new applications.

Most platforms with cryptographic support include PKCS #5 key-derivation algorithms in their API.

Monday answered 8/6, 2009 at 16:27 Comment(1)
Thanks to you for pointing out that there is one parity bit (discarded?) in each of the eight bytes.Wescott
I
7

Each algorithm is designed to accept a certain key length. The key is used as part of the algorithm, and as such, can't be whatever your heart desires.

Common key sizes are:

  • DES: 56bit key
  • AES: 128-256bit key (commonly used values are 128, 192 and 256)
  • RSA (assymetric cryptography): 1024, 2048, 4096 bit key

A number, such as 1234567 is only a 4-byte variable. The key is expected to be a byte array, such as "1234567" (implicitly convertible to one in C) or `{ '1', '2', '3', '4', '5', '6', '7' }.

If you wish to pass the MD5 hash of your salted key to DES, you should use some key compression technique. For instance, you could take the top 7 bytes (somewhat undesirable), or perform DES encryption on the MD5 hash (with a known constant key), and take all but the last byte as the key for DES operation.

edit: The DES I'm talking about here is the implementation per the standard released by NIST. It could so be (as noted above), that your specific API expects different requirements on the length of the key, and derives the final 7-byte key from it.

Interplay answered 8/6, 2009 at 15:42 Comment(0)
J
6

The key must have size 64-bits but only 56-bits are used from the key. The other 8-bits are parity bits (internal use).

ASCII chars have 8-bit size.

Juliannjulianna answered 8/6, 2009 at 15:42 Comment(1)
Some right, some wrong. US-ASCII characters are only 7 bits. But thank you for pointing out that each byte of a DES key contains a parity bit.Monday
H
2

You shouldn't pass you passwords straight into the algorithm. Use for instance the Rfc2898DeriveBytes class that will salt your passwords, too. It will work with any length.

Have a look here for an example.

EDIT: D'Oh - your question is not C# or .Net tagged :/

Herbherbaceous answered 8/6, 2009 at 15:38 Comment(0)
C
0

DES requires a 64 bit key. 56 bits for data and 8 bits for parity. Each byte contains a parity bit at the last index. This bit is used to check for errors that may have occurred. If the sum of the 7 data bits add up to an even number the correct parity bit is 0, for an odd number it's 1.

ASCII chars contain 8 bits, 8 chars can be used as a key if error correction is not necessary. If EC is necessary, use 7 chars and insert parity bits at indices (0 based) 7,15,23,31,39,47,55,63.

sources: Wikipedia: https://en.m.wikipedia.org/wiki/Data_Encryption_Standard

“The key ostensibly consists of 64 bits; however, only 56 of these are actually used by the algorithm. Eight bits are used solely for checking parity, and are thereafter discarded. Hence the effective key length is 56 bits.”

“The key is nominally stored or transmitted as 8 bytes, each with odd parity. According to ANSI X3.92-1981 (Now, known as ANSI INCITS 92-1981), section 3.5:

One bit in each 8-bit byte of the KEY may be utilized for error detection in key generation, distribution, and storage. Bits 8, 16,..., 64 are for use in ensuring that each byte is of odd parity.”

Corin answered 8/6, 2009 at 15:31 Comment(0)
F
0

According to MSDN DES supports a key length of 64 bits.

Fireworks answered 8/6, 2009 at 15:39 Comment(0)
C
0

To avoid this issue and increase the overall security of one's implementation, typically we'll pass some hashed variant of the key to crypto functions, rather than the key itself.

Also, it's good practice to 'salt' the hash with a value which is particular to the operation you are doing and won't change (e.g., internal userid). This assures you that for any two instances of the key, the resulting has will be different.

Once you have your derived key, you can pull off the first n-bites of it as required by your particular crypto function.

Corpus answered 8/6, 2009 at 16:37 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.