; two-way cipher
(define (plus str1 str2)
(list->string
(map (lambda (x y)
(integer->char
(+ (modulo
(+ (- (char->integer x) 65)
(- (char->integer y) 65))
26)
65)))
(string->list str1) (string->list str2))))
(define (minus str1 str2)
(list->string
(map (lambda (x y)
(integer->char
(+ (modulo
(- (- (char->integer x) 65)
(- (char->integer y) 65))
26)
65)))
(string->list str1) (string->list str2))))
(define plaintext1 "PROGRAMMING")
(define plaintext2 "PRAXISXXXXX")
(define ciphertext "ABCDEFGHIJK")
(define key1 (minus ciphertext plaintext1))
(define key2 (minus ciphertext plaintext2))
(display key1) (newline)
(display key2) (newline)
(display (minus ciphertext key1)) (newline)
(display (minus ciphertext key2)) (newline)
OyB0d28td2F5IGNpcGhlcgoKKGRlZmluZSAocGx1cyBzdHIxIHN0cjIpCiAgKGxpc3QtPnN0cmluZwogICAgKG1hcCAobGFtYmRhICh4IHkpCiAgICAgICAgICAgKGludGVnZXItPmNoYXIKICAgICAgICAgICAgICgrIChtb2R1bG8KICAgICAgICAgICAgICAgICAgKCsgKC0gKGNoYXItPmludGVnZXIgeCkgNjUpCiAgICAgICAgICAgICAgICAgICAgICgtIChjaGFyLT5pbnRlZ2VyIHkpIDY1KSkKICAgICAgICAgICAgICAgICAgMjYpCiAgICAgICAgICAgICAgICA2NSkpKQogICAgICAgICAoc3RyaW5nLT5saXN0IHN0cjEpIChzdHJpbmctPmxpc3Qgc3RyMikpKSkKCihkZWZpbmUgKG1pbnVzIHN0cjEgc3RyMikKICAobGlzdC0+c3RyaW5nCiAgICAobWFwIChsYW1iZGEgKHggeSkKICAgICAgICAgICAoaW50ZWdlci0+Y2hhcgogICAgICAgICAgICAgKCsgKG1vZHVsbwogICAgICAgICAgICAgICAgICAoLSAoLSAoY2hhci0+aW50ZWdlciB4KSA2NSkKICAgICAgICAgICAgICAgICAgICAgKC0gKGNoYXItPmludGVnZXIgeSkgNjUpKQogICAgICAgICAgICAgICAgICAyNikKICAgICAgICAgICAgICAgIDY1KSkpCiAgICAgICAgIChzdHJpbmctPmxpc3Qgc3RyMSkgKHN0cmluZy0+bGlzdCBzdHIyKSkpKQoKKGRlZmluZSBwbGFpbnRleHQxICJQUk9HUkFNTUlORyIpCihkZWZpbmUgcGxhaW50ZXh0MiAiUFJBWElTWFhYWFgiKQoKKGRlZmluZSBjaXBoZXJ0ZXh0ICJBQkNERUZHSElKSyIpCgooZGVmaW5lIGtleTEgKG1pbnVzIGNpcGhlcnRleHQgcGxhaW50ZXh0MSkpCihkZWZpbmUga2V5MiAobWludXMgY2lwaGVydGV4dCBwbGFpbnRleHQyKSkKCihkaXNwbGF5IGtleTEpIChuZXdsaW5lKQooZGlzcGxheSBrZXkyKSAobmV3bGluZSkKCihkaXNwbGF5IChtaW51cyBjaXBoZXJ0ZXh0IGtleTEpKSAobmV3bGluZSkKKGRpc3BsYXkgKG1pbnVzIGNpcGhlcnRleHQga2V5MikpIChuZXdsaW5lKQ==