#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
不努力,誰會可憐你?