fork download
  1. ; hardware random number generator
  2.  
  3. (define (take n xs)
  4. (let loop ((n n) (xs xs) (ys '()))
  5. (if (or (zero? n) (null? xs))
  6. (reverse ys)
  7. (loop (- n 1) (cdr xs)
  8. (cons (car xs) ys)))))
  9.  
  10. (define (rand-letter)
  11. (with-input-from-file "/dev/random" (lambda ()
  12. (do ((i 4 (- i 1)) (r 0 (+ (* r 256) (char->integer (read-char)))))
  13. ((zero? i) (integer->char (+ (modulo r 26) 65)))))))
  14.  
  15. (define (keypad n)
  16. (do ((n n (- n 1)) (cs (list) (cons (rand-letter) cs)))
  17. ((zero? n) (list->string cs))))
  18.  
  19. (define (trigraph msg key)
  20. (define (i->a i) (integer->char (+ i 65)))
  21. (define (a->i a) (- (char->integer a) 65))
  22. (define (tri c k) (i->a (modulo (- 25 (a->i k) (a->i c)) 26)))
  23. (let* ((msg (string->list msg))
  24. (key (take (length msg) (string->list key))))
  25. (list->string (map tri msg key))))
  26.  
  27. (display (rand-letter)) (newline)
  28. (define key "HDFHIJNULLPVJNHTNKNBAXPYR")
  29. (display (trigraph "ATTACKATDAWN" key)) (newline)
  30. (display (trigraph (trigraph "ATTACKATDAWN" key) key)) (newline)
Success #stdin #stdout 0.04s 8792KB
stdin
Standard input is empty
stdout
G
SDBSPGMMLOOR
ATTACKATDAWN