编写一个程序,该程序需要两行输入,并根据Playfair加密技术将第一行用作关键字来加密第二行。
Wikipedia详细描述了Playfair加密,但是为了避免歧义,这里有一个简短的摘要:
1.生成密钥表:
用替换J
关键字中出现的所有I
,然后去除所有非字母字符和重复字符。插入5×5加密表中,用其余的字母填充剩余的单元格(除非J
;我们不喜欢J
)。
例:
S T A C K
O V E R F
Stack Overflow --> STACKOVERFLW --> L W B D G
H I M N P
Q U X Y Z
2.准备要加密的消息
将每个替换J
为I
,剥离所有非字母字符并分成对,使用可以X
将包含相同字母的任何对断开两次。如果结尾的字母数为奇数,请X
在末尾添加。(请注意:数字必须完整拼写-ONE
TWO
,THREE
,等等-但是你可以认为这已经为你做了。)
例:
In:
The cat crept into the crypt, crapped, and crept out again.
Out:
TH EC AT CR EP TI NT OT HE CR YP TC RA PX PE DA ND CR EP TO UT AG AI NX
3.加密
依次对每对字母进行加密。如果它们在键表的不同行和列中,请用找到另一个字母的列中同一行的字母替换每个字母(例如,VM
⇒ EI
,LZ
⇒ GQ
)。如果它们在同一行(或一列)中,请选择右边(或下面)的两个字符,并在必要时进行环绕(例如OE
⇒ VR
,ZG
⇒ KP
)。
例:
In:
TH EC AT CR EP TI NT OT HE CR YP TC RA PX PE DA ND CR EP TO UT AG AI NX
Out:
SI RA CA RD FM VU IC VS MO RD ZN AK EC MZ MF BC YN RD FM SV TV KB TM MY
此过程产生的字符串是加密的消息,您的程序应将其输出。
规则:
- 输入的文本和键可以从
stdin
从命令行参数或其他此类来源获得。不允许使用硬编码输入。 - 您的程序必须同时接受密码短语和消息的大小写文本。
- 加密的输出可以是大写或小写。
- 您的程序应接受长度至少为64个字符的关键短语以及至少16 KB的消息文本。
- 您不需要处理非ASCII输入。
- 您可能会忽略
XX
在加密过程中出现字母对的可能性。 - 无需在程序的输出中添加空格。
- 您的答案应包括程序产生的消息,关键字短语和加密输出的示例。
- 这是一场代码挑战赛,因此答案最短的代码(以字节为单位)将获胜。
注意:请记住,如果连续出现在同一对字母中,则只需要中断连续字母。因此,例如
MASSACHUSETTS
应加密为MA SX SA CH US ET TS
—S
必须拆分双精度对象,而T
不必拆分双精度对象。
J
”您是否对APL有相似的看法?