Rebol3 Code Examplex
Vigenère cipher
Encrypt or decrypt using the Vigenère cipher.
Rebol [
title: "Rosetta code: Vigenère cipher"
file: %Vigenere_cipher.r3
url: https://rosettacode.org/wiki/Vigenère_cipher
]
vigenere: context [
letters: charset [#"A" - #"Z"]
encrypt: function [
"Encrypts a message using the Vigenère cipher"
msg [string!] "plaintext string (mixed case, may contain non-alpha characters)"
key [string!] "uppercase cipher key string (e.g. VIGENERECIPHER)"
][
pos: 1
result: copy ""
foreach c msg [
c: uppercase c
;; skip non-alphabetic characters (spaces, punctuation, etc.)
if find letters c [
append result #"A" + ((key/:pos - #"A" + c - #"A") % 26)
pos: 1 + (pos % length? key) ; advance key position, wrapping at key length
]
]
result ; return encrypted string
]
decrypt: function [
"Decrypts a Vigenère-encrypted message back to uppercase plaintext"
msg [string!] "ciphertext string produced by encrypt (uppercase letters only)"
key [string!] "same cipher key used during encryption"
] [
pos: 1
result: copy ""
foreach c msg [
c: uppercase c
append result #"A" + ((26 + c - key/:pos) % 26)
pos: 1 + (pos % length? key) ; advance key position, wrapping at key length
]
result ; return decrypted string
]
]
text: "Beware the Jabberwock, my son! The jaws that bite, the claws that catch!"
key: "VIGENERECIPHER"
encr: vigenere/encrypt text key ;; encrypt the plaintext
decr: vigenere/decrypt encr key ;; decrypt it back — should match original letters (uppercased)
print text ;= original mixed-case text
print encr ;= encrypted ciphertext
print decr ;= decrypted result (uppercase, punctuation stripped during encryption)