1. 程式人生 > 實用技巧 >Shell指令碼實現Base64 加密解密✨

Shell指令碼實現Base64 加密解密✨

加密演算法


# !/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暫時沒問題,應該