4.7. Representing Keys (or Other Binary Data) as English Text
Problem
You want to use an easy-to-read format for displaying keys (or fingerprints or some other interesting binary data). English would work better than a hexadecimal representation because people’s ability to recognize the key as correct by sight will be better.
Solution
Map a particular number of bits to a dictionary of words. The dictionary should be of such a size that an exact mapping to a number of bits is possible. That is, the dictionary should have a number of entries that is a power of two.
Discussion
The
spc_bin2words()
function shown here converts a binary string of the specified number
of bytes into a string of English words. This function takes two
arguments: str is the binary string to convert,
and len is the number of bytes to be converted.
#include <string.h> #include <stdlib.h> #include "wordlist.h" #define BITS_IN_LIST 11 #define MAX_WORDLEN 4 /* len parameter is measured in bytes. Remaining bits padded with 0. */ unsigned char *spc_bin2words(const unsigned char *str, size_t len) { short add_space = 0; size_t i, leftbits, leftovers, scratch = 0, scratch_bits = 0; unsigned char *p, *res; res = (unsigned char *)malloc((len * 8 / BITS_IN_LIST + 1) * (MAX_WORDLEN + 1)); if (!res) abort( ); res[0] = 0; for (i = 0; i < len; i++) { leftovers = str[i]; leftbits = 8; while (leftbits) { if (scratch_bits + leftbits <= BITS_IN_LIST) { scratch |= (leftovers << (BITS_IN_LIST - leftbits - scratch_bits)); scratch_bits ...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