SP3373 PERMCODE - Permutation Code

Description

As the owner of a computer forensics company, you have just been given the following note by a new client: I, Albert Charles Montgomery, have just discovered the most amazing cypher for encrypting messages. Let me tell you about it. To begin, you will need to decide on a set of symbols, call it S, perhaps with the letters RATE. The size of this set must be a power of 2 and the order of the symbols in S is important. You must note that R is at position 0, A at 1, T at 2, and E at 3. You will also need one permutation P of all those symbols, say TEAR. Finally you will need an integer, call it x. Together, these make up the key. Given a key, you are now ready to convert a plaintext message M of length n (M\[0\], M\[1\]... M\[n-1\]), that has some but not necessarily all of the symbols in S, into a cyphertext string C, also of length n (C\[0\], C\[1\],...C\[n-1\]), that has some but not necessarily all of the symbols in S. The encrypting algorithm computes C as follows: 1. Calculate an integer d as the remainder after dividing the integer part of (n $ ^{1.5} $ + x) by n. This can be expressed more succinctly as d = (int)(n $ ^{1.5} $ + x) % n, where "%" is the remainder operator. 2. Set C\[d\] to be the symbol in S whose position is the same as the position of M\[d\] in P. 3. For each j ≠ d in 0..n-1, set C\[j\] to be the symbol in S whose position is the value obtained by xor-ing the position of M\[j\] in P with the position of M\[(j+1) % n\] in S. Note that the bitwise xor operator is "^" in C, C++, and Java. For example, consider this scenario where S=RATE, P=TEAR, x=102, M=TEETER, and n=6. To compute d, first calculate 6 $ ^{1.5} $ + 102 = 116.696938, then take the remainder after dividing by 6. So d = 116 % 6 = 2. The following table shows the steps in filling in the cyphertext C. Note that the order of the steps is not important. 0 1 2 3 4 5 S = R A T E P = T E A R M = T E E T E R C = E M\[0\] is T, T is at P\[0\]. M\[1\] is E, E is at S\[3\]. C\[0\] = S\[0 xor 3\] = S\[3\] E T M\[1\] is E, E is at P\[1\]. M\[2\] is E, E is at S\[3\]. C\[1\] = S\[1 xor 3\] = S\[2\] E T A 2 is d. M\[2\] is E, E is at P\[1\], so C\[2\] = S\[1\] E T A E M\[3\] is T, T is at P\[0\]. M\[4\] is E, E is at S\[3\]. C\[3\] = S\[0 xor 3\] = S\[3\] E T A E A M\[4\] is E, E is at P\[1\]. M\[5\] is R, R is at S\[0\]. C\[4\] = S\[1 xor 0\] = S\[1\] E T A E A A M\[5\] is R, R is at P\[3\]. M\[0\] is T, T is at S\[2\]. C\[5\] = S\[3 xor 2\] = S\[1\]

Input Format

The input for the decoder consists of one or more sets of {key, encrypted message} pairs. The key is on 3 separate lines. The first line contains the single integer x, 0 < x < 10,000; the second line contains the string S; and the third line contains the string P, which will be a permutation of _S_. The length of S (and therefore P) will always be one of the following powers of two: 2, 4, 8, 16, or 32. Following the key is a line containing the encrypted message string C, which will contain at least one and at most sixty characters. The strings S, P, and C will not contain whitespace, but may contain printable characters other than letters and digits. The end of the input is a line which contains the single integer 0.

Output Format

For each input set print the decrypted string on a single line, as shown in the sample output.