zoukankan      html  css  js  c++  java
  • ✨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暂时没问题,应该

  • 相关阅读:
    inline-block 文字与图片不对齐
    js去除数组重复项
    react2
    kfaka windows安装
    sigar 监控服务器硬件信息
    Disruptor
    Servlet 3特性:异步Servlet
    jvmtop 监控
    eclipse如何debug调试jdk源码
    一致性hash算法
  • 原文地址:https://www.cnblogs.com/charlottepl/p/13361673.html
Copyright © 2011-2022 走看看