One time pad

From Hackepedia
Jump to navigationJump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

A one time pad takes plaintext and a pad (random garble) and XORs it together. Another person who has the same pad can then decipher this. A pad must never be re-used and must be discarded after deciphering.

Here is an example in C how a one time pad program might look like:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

#define PLAIN 0
#define PAD 1
 
int
main(int argc, char *argv[])
{
struct stat sb[2];
int fd[2];
u_char c, p;

if (argc != 3) {
 fprintf(stderr, "usage: otp [plaintext] [pad]\n");
 exit(1);
}

fd[PLAIN] = open(argv[1], O_RDONLY, 0);
if (fd[PLAIN] < 0) {
       perror("open [PLAIN]");
       exit(1);
}
if (fstat(fd[PLAIN], &sb[PLAIN]) < 0) {
       perror("fstat [PLAIN]");
       exit(1);
}
fd[PAD] = open(argv[2], O_RDONLY, 0);
if (fd[PAD] < 0) {
       perror("open [PAD]");
       exit(1);
}
if (fstat(fd[PAD], &sb[PAD]) < 0) {
       perror("fstat [PAD]");
       exit(1);
}
if (sb[PAD].st_size < sb[PLAIN].st_size) {
       fprintf(stderr, "pad must be larger or equal in size to plaintext\n");
       exit(1);
}
while (read(fd[PLAIN], &c, sizeof(c)) > 0) {
 if (read(fd[PAD], &p, sizeof(p)) < 0) {
       perror("read [PAD]");
       exit(1);
 }
 c ^= p;
 write(STDOUT_FILENO, &c, 1);
}

return 0;
}


And here is how it would be used:

atlas$ dd if=/dev/random of=pad bs=512 count=2
2+0 records in
2+0 records out
1024 bytes transferred in 0.000057 secs (17970574 bytes/sec)
atlas$ ./otp otp.c pad | tee ciphertext | hexdump -C | head
00000000  47 41 5c ff 5a 58 8a bc  dd 69 90 88 be 3c 56 12  |GA\.ZX...i...<V.|
00000010  27 bd 65 18 37 1a c2 86  c8 d5 c6 31 ef ad 4d c2  |'.e.7......1..M.|
00000020  30 91 68 c0 ab 1a 74 77  5a 90 66 7f 4f 11 ea 05  |0.h...twZ.f.O...|
00000030  d4 99 24 d9 15 86 59 64  e0 6f 7c 9d 4a 36 ee 2a  |..$...Yd.o|.J6.*|
00000040  04 52 38 3e 23 b1 73 e8  53 57 3c 14 11 5e ba df  |.R8>#.s.SW<..^..|
00000050  3e 3b 44 2c c1 bc 42 10  1a 6f 04 90 30 e7 9f 26  |>;D,..B..o..0..&|
00000060  0a 12 47 e7 70 3e 1d 3e  9c 77 3c 9c 9f 50 31 49  |..G.p>.>.w<..P1I|
00000070  de d3 cf ed 51 8d 78 04  a0 70 8d d7 cc bd 2a f5  |....Q.x..p....*.|
00000080  7b 72 66 82 83 76 6b 71  6e f6 6a ba 6f 11 1c 57  |{rf..vkqn.j.o..W|
00000090  c6 41 25 ce bb 3f 80 9d  3e 82 fc bb 9f 4b d9 b7  |.A%..?..>....K..|
atlas$ ./otp ciphertext pad | hexdump -C | head
00000000  23 69 6e 63 6c 75 64 65  20 3c 73 79 73 2f 74 79  |#include <sys/ty|
00000010  70 65 73 2e 68 3e 0a 23  69 6e 63 6c 75 64 65 20  |pes.h>.#include |
00000020  3c 73 79 73 2f 73 74 61  74 2e 68 3e 0a 23 69 6e  |<sys/stat.h>.#in|
00000030  63 6c 75 64 65 20 3c 66  63 6e 74 6c 2e 68 3e 0a  |clude <fcntl.h>.|
00000040  23 69 6e 63 6c 75 64 65  20 3c 75 6e 69 73 74 64  |#include <unistd|
00000050  2e 68 3e 0a 23 69 6e 63  6c 75 64 65 20 3c 73 74  |.h>.#include <st|
00000060  64 69 6f 2e 68 3e 0a 23  69 6e 63 6c 75 64 65 20  |dio.h>.#include |
00000070  3c 73 74 64 6c 69 62 2e  68 3e 0a 0a 23 64 65 66  |<stdlib.h>..#def|
00000080  69 6e 65 20 50 4c 41 49  4e 20 30 0a 23 64 65 66  |ine PLAIN 0.#def|
00000090  69 6e 65 20 50 41 44 20  31 0a 0a 0a 69 6e 74 0a  |ine PAD 1...int.|


A One Time Pad can be used by aircraft carriers who launch airplanes. The pad is made just seconds before launch in a secure part of the ship (data center) and uploaded through an umbilical cord to the airplane. Depending on how much of the pad is stored will securely encrypt communications between this carrier and the airplane. If the carrier sinks, the airplane has to switch to other secure communications to talk to other friendlies.