密文计划:编码竞赛

时间:2014-04-06 07:34:09

标签: encryption

来自TE IT的Saurabh Bothra希望与他的一名大三学生进行秘密的私人谈话。但他只能通过他的同学Manav Shah跟她说话,Saurabh不信任他!

为了维护他的隐私,Saurabh向Hacking Guru Hardik Anvekar寻求帮助。 Hardik教他ROT13--一种在UNIX系统中用于加密的方法。 Saurabh使用了这个想法并提出了他自己的方法。 Saurabh在他在校园的湖边亲自见到她的时候教他这个方法,他可以在没有Manav的帮助下与她交谈。

在Saurabh的加密技术中 - Saurabh将用另一个字母替换纯文本的每个字母,具体取决于Alphabet系列中键的第一个字符的位置。假设第一个字符是G(字母表中的第7个字母),Saurabh然后将明文的第一个字符替换为接下来的字符6.Saurabh将为前7个字符执行此操作,之后他将使用密钥的第二个字符并以那种方式替换其他角色。一旦密钥的所有字符都用完了 - Saurabh将再次开始使用第一个字符并加密整个明文。

但遗憾的是,Saurabh只能设备方法,但他无法编码。他相信你会编写一个代码来打印密文,而不是向任何人透露他的秘密方法。

输入格式

测试用例数T(< = 100) 纯文本和密钥用@字符分隔。

输出格式

仅限密文

示例输入

  

1我们最大的弱点在于放弃。最成功的方法就是再试一次。@ gaurav

示例输出

Uax mxkanymn qyuehymm fcym ch xzmzex lg. Kyv dfso xzmovdi rvt oj npxxzkj oy glqusm ni nls domn ihy dfiv kzdv.

1 个答案:

答案 0 :(得分:0)

首先,你被赋予了糟糕的规范。它包括一些神奇的数字,但没有解释它们来自何处。无论如何我实现它是为了好玩并得到了一个有效的程序,这就是我想到的。

鉴于关键' gaurav':

  • 取第一个字母' g。它的"偏移"是比一个'大6。也就是ord('g') - ord('a') == 6
  • 连续使用7(6 + 1)个字母的偏移值6。也就是说,对于明文中的每个字符,如果它是一个字母,则向其中添加6(如果结果超过' z'则减去26)。
  • 为明文中的每个字符消耗7次出现的6次偏移中的一次,即使它没有被使用!如果角色是标点符号的空格,请不要添加6,但仍将其视为7种用途之一!
  • 密钥中的下一个字母是' a'。这给出了0的偏移量。使用它1(0 + 1)时间。
  • 下一封信是' u'偏移量为20.使用它21次。
  • 等等。

所以你的算法看起来像:

O + 6 => U : #1 of 7 6s
u + 6 => a : #2 of 7 6s
r + 6 => x : #3 of 7 6s
" "        : #4 of 7 6s
g + 6 => m : #5 of 7 6s
r + 6 => x : #6 of 7 6s
e + 6 => k : #7 of 7 6s
a + 0 => a : #1 of 1 0s
t +20 => n : #1 of 21 20s
e +20 => y : #2 of 21 20s
...
and so on

告诉你该怎么做(这是你的比赛:-)):

  • 保留案例。例如,chr(ord('U') + 20) == 'i',但您不想翻译大写字母' U'小写' i'
  • 创建这些偏移的流,并为输入流中的每个字符使用一个。

提示:

  • 您希望生成偏移量的迭代器,而不是一次性创建它们的列表。