以前手機裏管理密碼的腳本,都是直接編寫進純文本而後進行屢次歸檔及壓縮來實現不明文存儲,一直以爲不太安全,因而昨天晚上編寫腳本實現了簡單的文件對稱加密。git
網上文章都利用 openssl
來進行文件加解密,這不符合在手機上運行的須要,因此必須本身編寫文件的對稱加密。github
對稱加密的加密過程使用祕鑰將明文轉換成密文,而解密過程則使用同個祕鑰將密文轉換成明文,而最簡單的實現就是利用位運算中的亦或運算。算法
例以下面是一字節明文數據 src
利用一字節祕鑰 key
進行亦或運算,生成一字節密文 dst
的過程。安全
src 1010 1000 key 1100 1000 dst 0110 0000
下面則是利用祕鑰對密文進行解密的過程,一樣也是利用亦或運算。ssh
dst 0110 0000 key 1100 1000 src 1010 1000
上面介紹的是最核心的原理,下面先討論密鑰和文件數據的讀寫,再來介紹整個加密過程。優化
爲了使得密鑰更安全,因此採用不定的長度,但爲了後續編寫代碼方便,就須要使用摘要算法將不定長密鑰映射到統一長度,代碼中選擇了 md5 算法。加密
下面代碼使用 md5sum
命令來獲取密鑰的 md5 值,注意因爲 md5sum
獲得的輸出包含 -
(兩個空格)字段加原始值,因此最後一步截取了 md5 值部分。code
password="password" # enter your password md5=`echo -n "${password}"|md5sum` md5=${md5% -*}
hexdump
命令能夠很方便的來讀取文件,並輸出自定義的格式,下面就是代碼中用來讀取文件的命令。md5
hexdump -e '16/1 "%02x" "|"' ${input_file}
這裏 -e
選項後面的格式化字符串 '16/1 "%02x" "|"'
,表示每個字節的輸出格式爲 %02x
即用兩位十六進制表示一字節,而每十六字節就輸出 |
字符,這是爲了後面分割用的,也能夠用別的分割字符串代替。ssl
直接利用 echo
命令的 -e
選項,就能夠輸出十六進制數據,例以下面的例子。
echo -ne "\x41" > ${output_file} # output ASCII character 'A'
上面談到利用 md5 算法將密鑰映射到統一的 16 字節的值,因此只須要明文數據的每 16 個字節中的每一個字節,與密鑰 16 字節的 md5 值中的每一個字節進行亦或運算,就能夠進行加密,而後利用上面談到的方式進行輸出便可,而解密過程只需將明文數據換成密文數據便可。
經過這個簡單的腳本,會發現計算機世界真的很簡單也很奇妙,一個位運算就對數據實現數據的加解密,並且數據無非就是零與壹,代碼所作的就是操做這些零與壹。
完整代碼見筆者的 Github,因爲編寫倉促代碼質量不好,後面會專門寫一個密碼管理的腳本而後優化下這個腳本。