计算机如何区分乱码和英文?

一个大的字符串加密之后就是乱码了,一般来说看不出其字面意思,我们需要正确的解密  

而解密后,计算机要怎恶么知道解密是否成功呢?

 

isEnglish()函数会把解密后的字符串分割成单词s,检查每个单词是否在包含成千上万个英文单词的文件里,

尽管这个文件不能说包含所有单词。现在,如果一定数量的单词s是英文单词,那么我们可以大概率的说

这些文字是英文,也就是说我们有信心说找到了正确的密钥,解密成功。


这里定义了一种计算机如何区分乱码和英文de方法:

# Detect English module
# http://inventwithpython.com/hacking (BSD Licensed)

# To use, type this code:
#   import detectEnglish
#   detectEnglish.isEnglish(someString) # returns True or False
# (There must be a "dictionary.txt" file in this directory with all English
# words in it, one word per line. You can download this from
# http://invpy.com/dictionary.txt)
# 好的习惯   常量大写命名!!  ' \t\n'分别是 空格 (两个转义字符)制表符 和 换行字符
UPPERLETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
LETTERS_AND_SPACE = UPPERLETTERS + UPPERLETTERS.lower() + ' \t\n'

def loadDictionary():
    dictionaryFile = open('dictionary.txt')
    # englishWords = {}定义了一个空的字典
    englishWords = {}
    # 把所有的单词设成这个字典的键key,其对应的值都为None
    # dictionaryFile.read().split('\n')这是一个列表,read()读出了整个文档内容
    # 成了一个大的字符串,split('\n')方法将其分割组成列表
    # (因为这个文件中每一行只有一个单词)
    for word in dictionaryFile.read().split('\n'):
        # 我们不在乎每个键里面保存了什么值,所以用None 属于NoneType数据类型
        # 表示这个值暂且不存在,我也说不好他是什么以及会是什么
        englishWords[word] = None
    dictionaryFile.close()
    return englishWords

# 装载一个字典  在detectEnglish的全局代码块中,任何import detectEnglish的
# Python程序都可以看见并使用
ENGLISH_WORDS = loadDictionary()

# 接受一个字符串参数,返回一个浮点值,比例(没有一个0~1全是),表示已经识别出了多少个英文单词
def getEnglishCount(message):
    message = message.upper()
    message = removeNonLetters(message)
    possibleWords = message.split()

    # 考虑到message可能是一个不是英文字母的字符串如'1234568' 那么调用removeNonLetters
    # 返回了空的字符串,然后经过split()方法转化成空的列表 这种情况要return出去
    if possibleWords == []:
        return 0.0 # no words at all, so return 0.0

    matches = 0
    for word in possibleWords:
        if word in ENGLISH_WORDS:
            matches += 1
    # 我们在python中使用除法的时候要避免除以0错误,这里这种错误不会发生,因为如果possibleWords
    # 是空列表时在上面已经return出去了,这是一种处理除以0错误的办法
    return float(matches) / len(possibleWords)
    
# 移除特殊符号和数字(不在LETTERS_AND_SPACE中的字符串)
def removeNonLetters(message):
    lettersOnly = []
    for symbol in message:
        if symbol in LETTERS_AND_SPACE:
            lettersOnly.append(symbol)
    return ''.join(lettersOnly)

# 判断是英文字是通过设定字母和单词所占的比例,即设定阈值来判断的
def isEnglish(message, wordPercentage=20, letterPercentage=85):
    # By default, 20% of the words must exist in the dictionary file, and
    # 85% of all the characters in the message must be letters or spaces
    # (not punctuation or numbers).
    wordsMatch = getEnglishCount(message) * 100 >= wordPercentage
    numLetters = len(removeNonLetters(message))
    messageLettersPercentage = float(numLetters) / len(message) * 100
    lettersMatch = messageLettersPercentage >= letterPercentage
    return wordsMatch and lettersMatch

这个代码可能对我们的其他破译程序有用,所以把它做成单独的模块,以便其他想要调用isEnglish()的程序导入。

这样使用

>>> import detectEnglish
>>> detectEnglish.isEnglish('is this sentence English text?')
True
>>>

 

posted @ 2020-08-10 21:45  PiaYie  阅读(565)  评论(0编辑  收藏  举报