当前位置: 首页 > 知识库问答 >
问题:

Python蛮力解密字母替换

洪宇定
2023-03-14

我试图基于字母替换(没有固定偏移量)解密密码文本。我的目标是找到钥匙。

例如:

a -> g
b -> a
c -> k

这是我的纯文本:

直到现代,密码学几乎只指加密,即将普通信息转换为无法理解的文本的过程

我生成一个随机替换,得到如下结果:

该公司的董事会成员在董事会会议上发言

规则:

  • 纯文本只包含较低的字母a... z
  • 空格不加密
  • 英文文本

我想当我使用英文字母频率时,我可以用最常用的字母链接替换加密文本中最常用的字母:https://en.wikipedia.org/wiki/Letter_frequency#/media/File:English_letter_frequency_(频率)。svg

但是我不能解密所有的东西。我只得到这样的结果:

如果你不知道,我就会告诉你,如果你不知道,我就会告诉你

我不知道如何继续下去......

import collections
import string
import random


mostUsedLetterNumbers = 9
mostUsedLetters = ['e','t','a','o','i','n','s','h','r','d','l','c','u','m','w','f','g','y','p','b','v','k','j','x','q','z']


#plain Text ---------------------------------------------------------------------------
#Lies den Text  
text = "until modern times cryptography referred almost exclusively to encryption which is the process of converting ordinary information into unintelligible text"
print "Cleartext:"
text = text.lower()
print text

#crypt with random.shuffle ---------------------------------------------------------------------------

abc = list(string.ascii_lowercase) #abcdef....+ lower letter

key = abc[:]  
random.shuffle(key);
#print (key) #this is my key I want to get in the end

e= dict(zip(abc,key))  
#print e

#print text
ct = ""

for c in text:
    #print(e[c])
    if c == ' ':
        ct = ct + " "
    else:
        ct = ct + e[c]

print "\nChippertext:\n",ct

#Count File ---------------------------------------------------------------------------

letters = collections.Counter(text)

#print letters
print "\nFound letters:"
for key,count in letters.iteritems():
    if key == '\n':
        print "newlines",count
    elif key == ' ':
        print "spaces",count
    else:
        print key, count

#del spaces and newlines
del letters['\n']
del letters[' ']
#----------------------------------------------------------------
#get letter count
topLetters = letters.most_common(mostUsedLetterNumbers)
#print topLetters

#replace letters
i=0
replacedText= ct
for i in range(0,mostUsedLetterNumbers):
    replacedText = string.replace(replacedText,topLetters[i][0],mostUsedLetters[i])

print "\nDecrypted:\n",replacedText

print "\nOriginal text:\n",text

共有3个答案

夏侯渊
2023-03-14

本教程可能会帮助您破解替换密码:https://inventwithpython.com/hacking/chapter18.html

楚志强
2023-03-14
匿名用户

多字母密码的解密并不容易。尤其是这么短的文本(如果你加密了一本800页的小说,解密会更好)。

首先,你需要某种度量密钥有多好。一种方法是字母频率的使用。你也可以使用比格或三角图。或者可以将解密文本与最常见的单词列表进行比较。可能是所有这些词的混合。

接下来,你需要一种“智能”的方式来测试关键候选人。你的密码是26!(大约4e26)可能的钥匙。你不想从abcde开始。。。z并选择所有排列。也许你可以从纯粹基于字母频率的算法开始,然后进行模拟退火

如果你只是不想解密一条信息(而且你还没有能力自动解密),那么你最好还是手工解密。从基于字母频率的解密文本开始,您可以在输出中看到文本文本——听起来很合理。将ehtx视为正确,忽略其他选项。现在输出中只有一个单词t。这很可能是,我们得到了o。好的,让我们看看:\u to。。也许是变成了?你明白了。

韦思淼
2023-03-14

在你的半解密文本中找到一个单词,其中至少包含一个未知字母,并且可能在英语词典中被解密到尽可能少的单词数。对于每种可能性,递归地重复这个过程。这叫做递归回溯,查一查。

例如,理想的情况是,如果纯文本包含单词戏剧,并且您正确地替换了第一部分中最常见的字母(根据您的示例判断,事实并非如此,您将需要更长的纯文本)。那么每个字母都是已知的,除了c,也就是说,它看起来像theatrixs。翻阅字典,你会发现只有一个单词的所有已知字母都位于这些位置,这样你就可以确定某些字母(例如,x)可以被c替换,并且你会取得一点进步。

然而,假设theatrims是一个真正的英语单词,你找不到任何其他单词可以毫不含糊地解密。然后你必须迭代各种可能性,并对每一种可能性递归地重复这个过程。你可以试试x-

 类似资料:
  • 我是Python新手,刚刚开始尝试使用LeetCode来构建我的排骨。在这个经典问题上,我的代码遗漏了一个测试用例。 问题如下: 给定一个整数数组,返回两个数字的索引,使它们相加到一个特定的目标。 您可以假设每个输入都有一个精确的解决方案,并且您可以不使用相同的元素两次。 例子: 给定nums=[2,7,11,15],target=9, 因为Nums[0]Nums[1]=2 7=9,返回[0,1]

  • 正如你从标题中所看到的,我正在努力对因子为2个素数的大整数进行强制因子分解。我想知道是否有一种方法可以在for循环中使用for循环。我知道这是一种很糟糕的方式,但无论如何我都愿意这样做。(我本来打算使用费马分解定理,但如果没有一些额外的方法/库,你就不能求大整数,我无法做到这一点),所以请尝试一下,看看你是否可以帮助我。大致如下: 显然,这太可怕了,我知道你不能通过说i.nextPossibleP

  • fn=fn−1+fn−2,其中f1=1和f2=1。因此,前12项将为f1=1,f2=1,f3=2,f4=3,f5=5,f6=8,f7=13,f8=21,f9=34,f10=55,f11=89,f12=144 第12项f12是第一个包含三位数的项。 斐波那契数列中第一个包含1000位数字的项是什么?

  • 对于我的Intro CS类,我们必须创建一个程序,找到一个特定的数字,在本例中是一个地址。地址在1000和9999之间,必须满足以下标准: 所有四位数字都不同 千位数字是十位数字的三倍 这个数字是奇数 数字之和是27 到目前为止,我已经能够生成数字的范围,并缩小奇数,但其余的是相当混乱的。建议?

  • 问题内容: 为了编写一个解决C程序的蛮力迷宫,我首先编写了这个Java程序来测试一个想法。我对C还是很陌生,打算在Java中正确处理后将其转换。结果,我试图远离arraylist,fancy库等,以便更轻松地转换为C。该程序需要生成最短步骤的单个宽度路径来解决迷宫问题。我认为我的问题可能在于将通过每个递归传递的路径存储数组碎片化。感谢您的关注。-乔 代码中解释了数字符号 问题答案: 这本来不是要作

  • 有没有可能字典在这个问题上比蛮力慢? > 为正整数集定义以下迭代序列: <代码>n→ n/2(n为偶数) <代码>n→ 3n 1(n为奇数) 使用上述规则,从13开始,我们生成以下序列: 可以看出,该序列(从13开始,到1结束)包含10个术语。虽然这还没有被证明(科拉兹问题),但人们认为所有的起始数字都以1结束。 100万以下的哪个起始数字产生的链条最长? 注:一旦链开始,条款允许超过一百万。 代