天天看點

5種Web常見編碼、變換算法的自動識别

#coding=utf-8
 
#識别字元序列變換算法,目前支援标準的MD5、SHA-1、Base64,及主流的URL編碼、HTML編碼
 
import re
import sys
 
#MD5判斷函數
def checkMD5(inStr):
    MD5KeyStrs = '0123456789abcdefABCDEF'
    inStr = inStr.strip()    #判斷MD5的時候把輸入兩端的空格切掉
    if (len(inStr) != 16) and (len(inStr) != 32):
        return False
    else:
        for eachChar in inStr:
            if eachChar not in MD5KeyStrs:
                return False
        return True
     
#SHA1判斷函數
def checkSHA1(inStr):
    SHA1KeyStrs = '0123456789abcdefABCDEF'
    inStr = inStr.strip()    #判斷SHA-1的時候把輸入兩端的空格切掉
    if len(inStr) != 40:
        return False
    else:
        for eachChar in inStr:
            if eachChar not in SHA1KeyStrs:
                return False
        return True
     
#Base64判斷函數
def checkBase64(inStr):
    Base64KeyStrs = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
    inStr = inStr.strip()     #判斷Base64的時候把輸入兩端的空格切掉
    if len(inStr) % 4 != 0:
        return False
    else:
        for eachChar in inStr:
            if eachChar not in Base64KeyStrs:
                return False
        return True
     
#URL編碼判斷函數
def checkURLCode(inStr):
    reURLCode = '%[0-9a-fA-F][0-9a-fA-F]'   #正規表達式
    reResultList = re.findall(reURLCode,inStr)
    if len(reResultList) == 0:
        return False
    else:
        return True
     
#HTML編碼判斷函數
def checkHTMLCode(inStr):
    htmlEncodeTuple = ('<','>','&',''','"',' ',''','/')
    for each in htmlEncodeTuple:
        if each in inStr:
            return True
    return False
 
#總的排程函數,負責調用各個算法的判斷函數
def checkInput(inStr):      
    if checkMD5(inStr):
        resStr = 'MD5'
        return resStr
    if checkSHA1(inStr):
        resStr = 'SHA-1'
        return resStr
    if checkBase64(inStr):
        resStr = 'Base64'
        return resStr
    if checkURLCode(inStr):      # 考慮到 URL編碼 與 HTML編碼可能會同時出現
        resStr = 'URLCode'
        if checkHTMLCode(inStr):
            resStr = 'URLCode + HTMLCode'
            return resStr
        else:
            return resStr
    if checkHTMLCode(inStr):
        resStr = 'HTMLCode'
        return resStr
     
    resStr = 'UnKnown'
    return resStr
     
     
         
#Python主程式
 
if __name__ == '__main__':
     
    if len(sys.argv) > 1:           #接受指令行輸入
        inputStr = str(sys.argv[1])
        resultStr = checkInput(inputStr)
        print u'你的輸入為:'.encode('gb2312') + inputStr
        print u'判斷結果為:'.encode('gb2312') + resultStr
         
    else:                         #互動界面
        print '---------------------------------------------------------------------'
        print u'---------       識别密文變換算法 WhatCodeS V1.0            ----------'.encode('gb2312')
        print u'---      目前支援識别MD5、SHA-1、Base64、URL編碼、HTML編碼      -----'.encode('gb2312')
        print u'--      支援互動操作與指令行操作(指令行不支援直接輸入特殊字元)   --'.encode('gb2312')
        print '---------------------------------------------------------------------'
        print
         
        while(True):
             
            inputStr = raw_input(u'請輸入字元序列(輸入‘q’退出程式):'.encode('gb2312'))
            if inputStr == 'q':
                break
            elif inputStr == '':
                continue
            else:
                resultStr = checkInput(inputStr)
                print u'你的輸入為:'.encode('gb2312') + inputStr
                print u'判斷結果為:'.encode('gb2312') + resultStr
                print      

不努力,誰會可憐你?