背景
甲一次性垫是一种形式的加密已经被证明是不可能的,如果使用得当开裂。
通过采用纯文本(仅包含字母AZ)并生成相同长度的随机字符串(也仅包含字母)来执行加密。该字符串充当密钥。然后,将明文中的每个字符与密钥中的相应字符配对。密文计算如下:对于每对,两个字符都转换为数字(A = 0,B = 1,... Z = 25)。这两个数字以26为模加。该数字被转换回一个字符。
解密正好相反。将密文和密钥中的字符配对并转换为数字。然后从密文模26中减去密钥,并将结果转换回字符AZ。
挑战
您面临的挑战是编写尽可能短的程序,该程序既可以加密也可以解密一次性键盘。
在输入的第一行(到STDIN)上,将出现单词“ ENCRYPT”或单词“ DECRYPT”。
如果单词是加密的,那么下一行将是纯文本。您的程序应输出两行(到STDOUT),第一行是密钥,第二行是密文。
如果单词被解密,您的程序将再获得两行输入。第一行是密钥,第二行是密文。您的程序应输出一行,这将是已解密的纯文本。
明文,密文和密钥应始终由大写字母AZ组成。它们将始终为一行,并且不包含空格。
密钥应始终是随机的。在运行之间不应重复大部分操作,并且在文本中不应找到任何模式。
两个简单的例子:
ENCRYPT
HAPPYBIRTHDAY
>ABKJAQLRJESMG
>HBZYYRTICLVME
DECRYPT
ABKJAQLRJESMG
HBZYYRTICLVME
>HAPPYBIRTHDAY
该>
代表线路输出,所以你不必打印符号作为输出。
/dev/random
,haveged
),通过与密钥进行异或他们进行XOR与字节和解密加密ORDS。gist.github.com/5078264可以从stdin读取密钥或随机性,消息或密文可以是文件名参数。
/dev/hwrng
,而不是使用伪随机源(从技术上讲会使其破损),那么为什么不给予奖励)