✨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暂时没问题,应该
✨Shell脚本实现Base64 加密解密的更多相关文章
- django删除表重建&修改用户密码&base64加密解密字符串&ps aux参数说明&各种Error例子
1.django的queryset不支持负索引 AssertionError: Negative indexing is not supported. 2.django向前端JavaScript传递列 ...
- JS实现base64加密解密
JS实现base64加密解密 转载自http://blog.csdn.net/fengzheng0306/archive/2006/04/25/676055.aspx 方法一: <HTML> ...
- 【代码笔记】iOS-3DES+Base64加密解密
一,工程目录. 二,代码. RootViewController.m #import "RootViewController.h" #import "NSString+T ...
- 实现Base64加密解密
using System; using System.Text; namespace Common { /// <summary> /// 实现Base64加密解密 /// </ ...
- Java中使用BASE64加密&解密
package com.bao.tools.encryption; import java.io.IOException; import org.junit.Test; import sun.misc ...
- Base64加密解密原理以及代码实现(VC++)
Base64加密解密原理以及代码实现 转自:http://blog.csdn.net/jacky_dai/article/details/4698461 1. Base64使用A--Z,a--z,0- ...
- Java Base64 加密解密
使用JDK的类 BASE64Decoder BASE64Encoder package test; import sun.misc.BASE64Decoder; import sun.misc.BA ...
- php使用base64加密解密图片
php使用base64加密解密图片的实例代码. 例子: <?php //文件名:base64.php $data="/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAB ...
- Base64加密解密
/// <summary> /// 实现Base64加密解密 /// </summary> public sealed class Base64 { /// <summa ...
随机推荐
- Android studio 使用夜神模拟器
首先参考这个:http://blog.csdn.net/jssongwei/article/details/50771441 然后我发现就是一个端口问题
- MongoDB快速入门教程 (3.3)
3.4.聚合 3.4.1.什么是聚合? MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*) 例如上图 ...
- C#状态机Stateless
最近在折腾一些控制相关的软件设计,想起来状态机这个东西,对解决一些控制系统状态切换还是挺有用的. 状态机(有限状态自动机)网上有很多介绍.简单理解就是定义一系列状态,通过一系列的事件,可以使得状态可以 ...
- 一.5.序列化应用之服务器制造厂与型号app功能
1.环境准备: (python36env) [vagrant@CentOS7 apps]$ django-admin startapp manufacturer (1)激活:'manufacturer ...
- Fiddler和JMeter测试需要主要的地方
Fiddler里面设置请求头的时候ContentType和Content-Type这两种写法都可以: 这两种写法都可以. 但是在JMeter中必须要用Content-Type才行,如下图所示: (完)
- Android 伤敌一千自损八百之萤石摄像头集成(三)
说一下萤石原生播放 先上代码 private MyOrientationDetector mOrientationDetector; @Override protected void onCreate ...
- SEO:前端优化网站,提高排名
最近优化网站排名,记录一下过程及注意的东西. 1.查询方法 百度:site:+网站名 例如:site:realtour.cn360: 直接输入网址:www.realtour.cn 2.网站优化方式 ...
- Flask路由中使用正则表达式匹配
1.说明 由于flask并不支持直接使用正则表达式来匹配路由,我们可以使用werkzeug.routing的BaseConverter来实现 2.代码 from flask import Flask ...
- SpringBoot集成MyBatis小记
SpringBoot集成MyBatis小记 参考MyBatis官网 1. 添加maven依赖 添加到pom.xml <dependency> <groupId>org.myba ...
- Yii2源码分析(一):入口
写在前面,写这些随笔是记录下自己看Yii2源码的过程,可能会有些流水账,大部分解析放在注释里说明,由于个人水平有限,有不正确的地方还望斧正. web入口文件Index.php // 定义全局的常量,Y ...