44 lines
1.4 KiB
Text
44 lines
1.4 KiB
Text
cypher: procedure options (main); /* 21 September 2012 */
|
|
declare t(26) character (26);
|
|
declare (i, j, k, L) fixed binary;
|
|
declare (original, encoded, coder) character (1000) varying initial ('');
|
|
declare cypher character (30) varying;
|
|
declare (co, ct, cc) character (1);
|
|
|
|
/* Set up cypher table. */
|
|
t(1) = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
|
do i = 2 to 26;
|
|
t(i) = substr(t(i-1), 2, 25) || substr(t(i-1), 1, 1);
|
|
end;
|
|
|
|
cypher = 'VIGILANCE';
|
|
original = 'Meet me on Tuesday evening at seven.';
|
|
put edit ('Message=', original) (a);
|
|
original = uppercase(original);
|
|
|
|
/* Create the cypher text, same length as original, or longer. */
|
|
coder = repeat(cypher, length(original)/length(cypher));
|
|
|
|
/* Encode the original message, character by character. */
|
|
/* Non-alphabetic characters are ignored. */
|
|
L = 0;
|
|
do i = 1 to length(original);
|
|
co = substr(original, i, 1);
|
|
j = index(t(1), co);
|
|
if j = 0 then iterate; /* Ignore non-alphabetic character */
|
|
L = L + 1;
|
|
ct = substr(coder, L, 1);
|
|
k = index(t(1), ct);
|
|
encoded = encoded || substr(t(j), k, 1);
|
|
end;
|
|
put skip data (encoded);
|
|
|
|
/* DECODING. */
|
|
put skip list ('Decoded=');
|
|
do i = 1 to length(encoded);
|
|
cc = substr(coder, i, 1);
|
|
j = index(t(1), cc);
|
|
k = index(t(j), substr(encoded, i, 1));
|
|
put edit (substr(t(1), k, 1) ) (a(1));
|
|
end;
|
|
end cypher;
|