Shell指令碼實現Base64 加密解密✨
阿新 • • 發佈:2020-07-22
加密演算法
# !/bin/bash # 全域性變數 str="" base64_encode_string(){ # 源資料 source_string=$1 echo "源資料:$1" # 判斷是否為空 if [ 0 -eq "${#source_string}" ]; then echo "輸入為空,退出" return fi echo "正在執行..." # 編碼集Wnrm0b7QPpI1FGBYVizZXN84vTJqocOuD9aHdgSlt2jRyAKEe6kCxhsfwL5M3U+/ BASE64_CODE_TABLE=(W n r m 0 b 7 Q P p I 1 F G B Y V i z Z X N 8 4 v T J q o c O u D 9 a H d g S l t 2 j R y A K E e 6 k C x h s f w L 5 M 3 U + /) # 不知道 FIRST_SOURCE_BYTE_DIVIDEND=0X04 SECOND_SOURCE_BYTE_DIVIDEND=0X10 THIRD_SOURCE_BYTE_DIVIDEND=0X40 # 標記 encode_state=1 # last_source_byte="" # 結果 result="" # 將字元轉化成ASCII碼值 for((i=0;i<${#source_string};++i)){ #curChar='printf "%d" "${#source_string:i:1}";' curChar=`printf "%d" "'${source_string:i:1}";` echo curChar=$curChar case $encode_state in 1) index=$(( $curChar / $FIRST_SOURCE_BYTE_DIVIDEND )) # echo "INDEX IN STATE 1 IS : $index" result="$result${BASE64_CODE_TABLE[$index]}" echo "結果:" $result encode_state=2;; 2) index_high=$(( ($last_source_byte % $FIRST_SOURCE_BYTE_DIVIDEND)* 0X10 )) index_low=$(( $curChar / $SECOND_SOURCE_BYTE_DIVIDEND )) index=$(( $index_high + $index_low )) # echo "index in state 2 is: $index" result="$result${BASE64_CODE_TABLE[$index]}" echo "結果:$result" encode_state=3;; 3) index_high=$(( ($last_source_byte % $SECOND_SOURCE_BYTE_DIVIDEND) * 0X04 )) index_low=$(( $curChar / $THIRD_SOURCE_BYTE_DIVIDEND )) index=$(( $curChar % $THIRD_SOURCE_BYTE_DIVIDEND )) # echo "index2 in state 3 is: $index" result="$result${BASE64_CODE_TABLE[$index]}" echo "結果:$result" # 追加最後一位 index=$(( $curChar % 0x10 )) result="$result${BASE64_CODE_TABLE[$index]}" echo "追加結果:$result" encode_state=1;; esac last_source_byte=$curChar } # process pading case $encode_state in 2) echo $FIRST_BYTE_DIVIDEND index=$(( ($last_source_byte % $FIRST_SOURCE_BYTE_DIVIDEND) * 0X10 )) #echo "index in pading state 2 is: $index" result="$result${BASE64_CODE_TABLE[$index]}==";; 3) index=$(( ($last_source_byte % $SECOND_SOURCE_BYTE_DIVIDEND) * 0X04 )) #echo "index in pading state 3 is: $index" result="$result${BASE64_CODE_TABLE[$index]}=";; esac echo "新增字尾:$result" str=$result } # main函式 echo "開始加密..." read m echo $m read n # 第二種 echo "-------------------" cat $1 |while read line do from=$line base64_encode_string $from #str=$? # echo "輸出:" $str # 寫入檔案 echo "$str" >> to done # 加密 # 寫入檔案 #base64_encode_string $1 echo "加密結束..."
解密演算法
# !/bin/bash # 全域性變數 str="" _str="" # 編碼集Wnrm0b7QPpI1FGBYVizZXN84vTJqocOuD9aHdgSlt2jRyAKEe6kCxhsfwL5M3U+/ BASE64_CODE_TABLE=(W n r m 0 b 7 Q P p I 1 F G B Y V i z Z X N 8 4 v T J q o c O u D 9 a H d g S l t 2 j R y A K E e 6 k C x h s f w L 5 M 3 U + /) # 16#---->ascii fun(){ a=$1 b=`printf "%d" $a` #echo $b |awk '{printf("%c", $1)}' _str=`echo $b |awk '{printf("%c", $1)}'` } # 四個字元轉化為正確的三個字元 get(){ # get get=$1 echo "資料來源" $1 # to to="" # size size=4 if [[ $2 = 1 ]]; then size = 3 elif [[ $2 = 2 ]]; then size =2 fi for((i=0;i<size;++i))do # echo "迴圈I:$i ${get:i:1}" for((j=0;j<64;j++))do # echo "當前:$j ${BASE64_CODE_TABLE[$j]}" if [[ ${get:i:1} = ${BASE64_CODE_TABLE[$j]} ]]; then if [[ i < size-1 ]];then to=$(( ($to + $j)* 0x10)) # 此時為十進位制 echo "匹配:$i $j $to ${get:i:1}" else to=$(($to + $j)) fi break fi done done get="" # 十進位制轉化為十六進位制 echo "十六進位制結果" $to if [[ size = 1 ]]; then to=$to/0x04 tmp=$to / 0x100 tmp="\x${tmp}" tmp=`printf "$tmp"` to=$to >> 8 tmp="\x${to}" tmp=`printf "$tmp"` get=$get $tmp elif [[ size = 2 ]]; then to=$to/0x10 tmp="\x${to}" tmp=`printf "$tmp"` get=$get $tmp else printf "%d" $(( ($to / 65536) )) tmp=$(( ($to / 65536) )) fun $tmp echo "_str:" $_str to=$(( ($to % 65536) )) tmp=$(( ($to / 256) )) # tmp="\x${tmp}" echo `printf "$tmp"` tmp=`printf $tmp` get="$get" "$tmp" to=$to >> 8 get=$get `echo -e '\x${to % 0x100}'` to=$to >> 8 get=$get `echo -e '\x${to % 0x100}'` fi echo "get----------->" echo $get } base64_encode_string(){ # 源資料 source_string=$1 last=0 last_to=0 # 結果 result="" # 判斷是否為空 if [ 0 -eq "${#source_string}" ]; then echo "輸入為空,退出" return fi # 結尾標記 end=0 echo "結尾: ${source_string:${#source_string}-3}" if [ ${source_string:${#source_string}-2} = "==" ]; then end=2 elif [ ${source_string:${#source_string}-1} = "=" ]; then end=1 else end=0 fi # 判斷字串長度 len=${#source_string} if [[ 4 = len ]]; then echo "字串長度小於4" else echo "字串長度大於4" m=${#source_string}-4 for((i=0;i<m;)) do get ${source_string:i:4} 0 result=$result $? i = $i + 4 done fi echo "對結尾進行處理..." last=${source_string:${#source_string}-4:4} echo $last case $end in 0) ;; 1) ;; 2) get $last 2 result=$result $?;; esac # 編碼集Wnrm0b7QPpI1FGBYVizZXN84vTJqocOuD9aHdgSlt2jRyAKEe6kCxhsfwL5M3U+/ # BASE64_CODE_TABLE=(W n r m 0 b 7 Q P p I 1 F G B Y V i z Z X N 8 4 v T J q o c O u D 9 a H d g S l t 2 j R y A K E e 6 k C x h s f w L 5 M 3 U + /) # 第一個字元取前六位,所以是對0100取整去掉最後兩位,第二個是前一個字元的後兩位和這個字元的 FIRST_SOURCE_BYTE_DIVIDEND=0X04 SECOND_SOURCE_BYTE_DIVIDEND=0X10 THIRD_SOURCE_BYTE_DIVIDEND=0X40 # 標記 encode_state=1 # last_source_byte="" # 結果 result="" # 將字元轉化成ASCII碼值 for((i=0;i<${#source_string};++i)){ #curChar='printf "%d" "${#source_string:i:1}";' curChar=`printf "%d" "'${source_string:i:1}";` echo curChar=$curChar case $encode_state in 1) index=$(( $curChar / $FIRST_SOURCE_BYTE_DIVIDEND )) echo "INDEX IN STATE 1 IS : $index" result="$result${BASE64_CODE_TABLE[$index]}" encode_state=2;; 2) index_high=$(( ($last_source_byte % $FIRST_SOURCE_BYTE_DIVIDEND)* 0X10 )) index_low=$(( $curChar / $SECOND_SOURCE_BYTE_DIVIDEND )) index=$(( $index_high + $index_low )) echo "index in state 2 is: $index" result="$result${BASE64_CODE_TABLE[$index]}" encode_state=3;; 3) index_high=$(( ($last_source_byte % $SECOND_SOURCE_BYTE_DIVIDEND) * 0X04 )) index_low=$(( $curChar / $THIRD_SOURCE_BYTE_DIVIDEND )) index=$(( $curChar % $THIRD_SOURCE_BYTE_DIVIDEND )) echo "index2 in state 3 is: $index" result="$result${BASE64_CODE_TABLE[$index]}" encode_state=1;; esac last_source_byte=$curChar } # process pading case $encode_state in 2) echo $FIRST_BYTE_DIVIDEND index=$(( ($last_source_byte % $FIRST_SOURCE_BYTE_DIVIDEND) * 0X10 )) #echo "index in pading state 2 is: $index" result="$result${BASE64_CODE_TABLE[$index]}==";; 3) index=$(( ($last_source_byte % $SECOND_SOURCE_BYTE_DIVIDEND) * 0X04 )) #echo "index in pading state 3 is: $index" result="$result${BASE64_CODE_TABLE[$index]}=";; esac str=$result } # main函式 $1輸入檔案 $2輸出檔案 echo "開始解密..." # 第二種 echo "-------------------" get TSkr 0 read m cat $1 |while read line do from=$line echo "輸入引數:$from" base64_encode_string $from # 寫入檔案 echo "$str" >> $2 done echo "解密結束..."
BaseTo有點問題,十六進位制取高兩位會報錯,Base暫時沒問題,應該