4.1. Representing Keys for Use in Cryptographic Algorithms
Problem
You need to keep an internal representation of a symmetric key. You may want to save this key to disk, pass it over a network, or use it in some other way.
Solution
Simply keep the key as an ordered array of bytes. For example:
/* When statically allocated */ unsigned char *key[KEYLEN_BYTES]; /* When dynamically allocated */ unsigned char *key = (unsigned char *)malloc(KEYLEN_BYTES);
When you’re done using a key, you should delete it securely to prevent local attackers from recovering it from memory. (This is discussed in Recipe 13.2.)
Discussion
While keys in public key cryptography are represented as very large numbers (and often stored in containers such as X.509 certificates), symmetric keys are always represented as a series of consecutive bits. Algorithms operate on these binary representations.
Occasionally, people are tempted to use a single 64-bit unit to
represent short keys (e.g., a long long when using
GCC on most platforms). Similarly, we’ve commonly
seen people use an array of word-size values. That’s
a bad idea because of byte-ordering issues.
When representing
integers, the bytes of the integer may appear most significant byte
first (big-endian) or least significant byte first (little-endian).
Figure 4-1 provides a visual illustration of the
difference between
big-endian and
little-endian storage:
Figure 4-1. Big-endian ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access