免责声明:这实际上是一个编码挑战,因此我明确不寻求完整的解决方案。
密码的工作方式如下:
从ABCDEFGHIJKLMNOPQRSTUVWXYZ和关键字KEYWORD开始。我们构建我们的第一个字母表,在关键字的每一个字母周围依次移动上面的字母表。即:
第一个字母K,字母表变成LMNOPQRSTUVWXYZKABCDEFGHIJ
第二个字母E,字母表变成FGHIJELMNOPQRSTUVWXYZKABCD
等等,直到我们得到初始密码字母表:YFGHIJELMNRPQDSTUVOXWZKABC
为了加密,我们使用这个字母表,对于纯文本中的每个字母,执行与在开始阶段围绕纯文本字母(因此,如果明文的第一个字母是F )执行相同的洗牌操作,您将得到J作为第一个密文字母,而您的新字母表将是GHIJELMNRPQDSTUVOXWZKABCFY。
我该怎么解决这个问题?我认为已知的明文攻击,因为我很可能知道明文的开头,也知道在解决方案中只有有限数量的可能单词。
经过进一步的研究,我发现了一个晦涩的密码混沌密码,它朝这个方向发展。
编辑:较长的示例(还使用keyword作为关键字):
doyouthinkthereisanotherwaytosolvethiscipher
变成了
HFUTLNAQYWHBWBEBTIEXWSZFGZQPINTQGHKDSVVVPXNM
第二次编辑:用于测试它的python代码
class ScrabbleCipher:
def __init__(self, keyword):
self.alpha = string.ascii_uppercase
self.keyword = keyword.upper()
self.initialAlpha()
def initialAlpha(self):
for i in self.keyword:
self.shuffle(i)
self.initial = self.alpha
def shuffle(self, letter):
try:
tg = self.alpha.index(letter)
except Exception as e:
print letter
self.alpha = self.alpha[tg+1:] + letter + self.alpha[:tg]
def encrypt(self, plaintext):
self.alpha = self.initial
plaintext = plaintext.upper()
ciphertext = ''
for i in plaintext:
pos = string.ascii_uppercase.index(i)
ciphertext += self.alpha[pos]
self.shuffle(i)
return ciphertext
def decrypt(self, ciphertext):
ciphertext = self.sani(ciphertext)
self.alpha = self.initial
plaintext = ''
for i in ciphertext:
pos = self.alpha.index(i)
corLet = string.ascii_uppercase[pos]
plaintext += corLet
self.shuffle(corLet)
return plaintext发布于 2019-05-31 07:34:37
因此,我找到了一种方法,但这既不是优雅的,也不是一般的解决方案。它依赖于(沉重的)假设,即最初选择的关键字是英语,第二个假设是,得到的密码文本也是英语。然后,它就变成了一种相对粗糙的蛮力练习:
1)选择一个英语单词
2)创建一个由该单词实例化的密码
3)使用该密码解密密码文本。
4)检查解密后的明文是否包含英文单词。
使用一个相对较大的单词列表(400 K),大约花了30-40秒才打破,关键字本身有9个字符长。因此,如果关键字是随机的,解决方案将是完全不切实际的(顺便说一句,这是这个挑战的第二部分,因此,如果我也解决了这个问题,我将更新这个答案)。
https://crypto.stackexchange.com/questions/70888
复制相似问题