您好,登錄后才能下訂單哦!
最近想把word密碼文件的服務器密碼信息歸檔到mysql數據庫,心想著如果直接在里面寫明文密碼會不會不安全,如果用sha這些不可逆的算法又沒法還原回來,所以自己就想著用Python寫一個小代碼,先把明文密碼加密之后再存mysql表中。下面貼出我的Python代碼:
首先是加密encript.py
# coding:utf-8 def encrpt(s): length = len(s) j = "" for i in s: if ord(i) <= 49: i = chr(ord(i) + length) j = j + i elif ord(i) > 81 and ord(i) <= 126: i = chr(ord(i) - length) j = j + i else: j = j + chr(32) + i return j s = raw_input("請輸入6到16位的密碼:") enscript_s = "" if len(s) < 6 or len(s)>16: print ("密碼長度不符合") if len(s) == 0: print ("密碼不能為空") for i in s: if ord(i) < 33 and ord(i) > 126: print ("非法字符") if len(s) >= 6 and len(s) <= 16: enscript_s = encrpt(s) print enscript_s
注意,我這里限定了加密6到16位密碼,下面說說我的思路:
首先,輸入6到16位密碼,然后判斷這些密碼符不符合規定的字符,當然我認為這里我的判定還不夠完善,ord函數獲取每一個字符對應的十進制ASCII碼。大家可以翻看ASCII碼表,ASCII碼十進制33到126,包含了大小寫字母,數字和特殊標點等內容,我認為密碼字符就是應該在這些范圍內的,然后我執行了encrpt(s)函數,這里的詳細說下這個函數,加密的原理就是密碼中的字符這里假定ASCII碼小于等于49的將該字符和字符長度相加作為新的字符密碼的ASCII碼,然后調用chr函數將這個新的ASCII碼轉換成字符格式,大家可以對照著ASCII碼表設。而下面的ASCII碼大于81,少于126的范圍是跟上面的49相關的,因為最大是16位長度,如果49+16那么這個值就是65,而33(上面說明了輸入的密碼應該包含大小寫字母,數字和特殊標點等內容,這個范圍是從ASCII為33,也就是感嘆號的開始)+6=39,也就是小于等于49的字符轉換的范圍是39~65;另一方面,對于ASCII碼范圍在81~126的,我們將其減去密碼長度作為新的字符密碼,那么同理81-16=65,126-6=120,也就是新的字符密碼的ASCII碼范圍剛好在66~120之間,這個就保證和加密后的字符一定不會和上面條件為49的加密的字符的ASCII碼重復;另外,這里對于49~80這里的字符段我所做的處理是直接按照原來的字符,并且在字符的左手邊插入了一個空格字符,就是 j = j + chr(32) + i這句話實現的,這個空格字符作為我們沒有處理的字符的標記,后面解密會用到。
下面是解密代碼,decript.py
# coding:utf-8 def decrpt(s): length2 = len(s) length3 = len(s.replace(" ", "")) j = "" for i in range(length2): if s[i] is None: continue if ord(s[i-1]) == 32: j = j + s[i] continue elif ord(s[i]) >= 33 and ord(s[i]) <= 65: j = j + chr(ord(s[i]) - length3) continue elif ord(s[i]) > 65 and ord(s[i]) <= 126: j = j + chr(ord(s[i]) + length3) continue return j s = raw_input("請輸入6到16位的密碼:") descript_s = "" if len(s) < 6 or len(s)>32: print ("密碼長度不符合") if len(s) == 0: print ("密碼不能為空") for i in s: if ord(i) < 1 and ord(i) > 127: print ("非法字符") if len(s) >= 6 and len(s) <= 32: descript_s = decrpt(s) print descript_s
可以看到len(s) >= 6 and len(s) <= 32,我這里限定了字符的長度可以到32位,是因為剛才加密可能會產生空格標記字符,這樣長度就會超過限定的16位密碼字符了,然后我們關注decrpt這個函數,里面我獲取了兩個長度length2和length3,length2是密文(包括加密時插入的空格字符標記),length3是原來明文的實際長度(只要將加密時的空格字符標記去掉就可以算出來),然后下面的解密條件也是和加密的條件一一對應的,重點說下
if ord(s[i-1]) == 32:
j = j + s[i]
continue
這個,這里我們剛才加密插入的空格字符標記就有用了,剛才加密的時候如果是沒有處理的明文密碼是會在字符左邊插入空格字符的(ASCII碼32),然后在讀到這個沒有處理的字符時,我們檢查前一個字符是否是空格字符,如果是證明這個字符沒有經過加密,所以也不用解密了。這里為什么要插入這個空格字符呢,這里假定我們有一個明文字符對應的ASCII碼是70(字符F),那么根據剛才加密的條件,ASCII碼在49到80之間是不會加密的,還是按照原來的字符,但是我們解密的時候,條件規定了ASCIII碼在33與74之間是要減去密碼長度的,這樣就沒法得出正確的字符了,這里可能有疑問,為什么加密的時候設定條件中ASCII碼49-80之間是斷開的,解密的時候怎么33~74和74~126連續起來了,這里是因為加密時候ASCII碼是49~80這一段的確沒有處理,但是一旦加上字符的長度,解密范圍就會變大,例如加一個最大長度的字符49+16=65,解密的時候就要在65的范圍內,所以范圍就增大了。
最后附上測試圖:
加密
解密
測試后我們就可以把" Gpan8lY7;-"這個加密后的字符串粘貼到mysql表中,注意,粘貼的時候別漏了G字母左邊是有個空格標記的,表示G這個字符沒有被加密。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。