• 热门专题

shell解密base64加密的文本的过程

作者:jjg6256308  发布日期:2012-04-29 09:59:52
Tag标签:解密base64  加密文本  
  • 今天应一网友需要,要把一个用base64 加密的文本解密出来,本来觉得这个应该比较简单,但当拿到这个文本的时候,觉得并不像想象中的那么简单。这个文本是这样的,我截取了其中的一小部分出来:
    2|数据库概要|c2VsZWN0IGEubmFtZSAiREIgTmFtZSIsIA0KICAgICAgIGUuZ2xvYmFsX25hbWUgIkdsb2JhbCBO 
    YW1lIiwgDQogICAgICAgYy5ob3N0X25hbWUgIkhvc3QgTmFtZSIsIA0KICAgICAgIGMuaW5zdGFu 
    Y2VfbmFtZSAiSW5zdGFuY2UgTmFtZSIgLCANCiAgICAgICBERUNPREUoYy5sb2dpbnMsJ1JFU1RS 
    SUNURUQnLCdZRVMnLCdOTycpICJSZXN0cmljdGVkIE1vZGUiLA0KICAgICAgIGEubG9nX21vZGUg 
    ICJBcmNoaXZlIExvZyBNb2RlIiAgDQpGUk9NIHYkZGF0YWJhc2UgYSwgdiR2ZXJzaW9uIGIsIHYk 
    aW5zdGFuY2UgYyxnbG9iYWxfbmFtZSBlICANCldIRVJFIGIuYmFubmVyIExJS0UgJyVPcmFjbGUl 
    Jzs=|0||0||1|1|| 
    3|参数文件(是spfile还是pfile)|c2VsZWN0IG52bCh2YWx1ZSwncGZpbGUnKSAiUGFyYW1ldGVyX0ZpbGUiIA0KZnJvbSB2JHBhcmFt 
    ZXRlciB3aGVyZSBOYW1lPSdzcGZpbGUnOw==|0||0||1|1|| 
    4|非默认的参数|c2VsZWN0IG5hbWUsIHJ0cmltKHZhbHVlKSAicHZhbHVlIiANCmZyb20gdiRwYXJhbWV0ZXIgIA0K 
    d2hlcmUgaXNkZWZhdWx0ID0gJ0ZBTFNFJyANCm9yZGVyIGJ5IG5hbWU7|0||0||1|1|| 
    5|控制文件及其状态|c2VsZWN0IE5hbWUsU3RhdHVzIGZyb20gdiRjb250cm9sZmlsZTs=|0||0||1|1||
    
    

    观察以上文本,我们首先需要把这个文本的一些行给合并掉,就是每行都是应该以数字打头,例如: 2|数据库概要|c2VsZWN0IGEubmFtZSAiREIgTmFtZSIsIA0KIC,这种形式,然后再抽取每行中那个加密了的域。而现在的文本中,大多数行都不是这种形式,这就需要把不是这种形式行往上合并,合成一个完整的行。

    为此我写了个脚本,既合并行,脚本如下:


     

    #! /bin/bash 
    
    #FILE=/root/test.txt 
    NEWFILE=/root/script/newfile 
    TEMPFILE=/root/script/temp 
    LINENUM=`wc -l $NEWFILE | awk '{ print $1 }'` 
    LINE1=1 
    
    while read LINE 
    do 
    echo $LINE1 | grep '^[0-9]\{1,\}|' 
    FLAG1=$? 
    echo $LINE | grep '^[0-9]\{1,\}|' 
    FLAG2=$? 
    if [ $FLAG1 -eq 0 ] 
    then 
    if [ $FLAG2 -eq 0 ] 
    then 
    echo $LINE1 >> $NEWFILE 
    else 
    echo -n $LINE1 >> $NEWFILE 
    fi 
    else 
    if [ $FLAG2 -eq 0 ] 
    then 
    echo $LINE1 >> $NEWFILE 
    else 
    echo -n $LINE1 >> $NEWFILE 
    fi 
    fi 
    LINE1=$LINE 
    
    done < $TEMPFILE
    
    
    

    其中 TEMOFILE  既要处理的文本,NEWFILE 为处理以后的文本,此脚本运行原理就是每次截取一行,判断这一行的前一行的开头是不是以数字打头,数字后面是‘|’,如果是就是换行输入到NEWFILE,如果不是,就接着输入到上一行的末尾。

    处理过后的文本如下:

     

    2|数据库概要|c2VsZWN0IGEubmFtZSAiREIgTmFtZSIsIA0KICAgICAgIGUuZ2xvYmFsX25hbWUgIkdsb2JhbCBO^MYW1lIiwgDQogICAgICAgYy5ob3N0X25hbWUgIkhvc3QgTmFtZSIsIA0KICAgICAgIGMuaW5zdGFu^MY2VfbmFtZSAiSW5zdGFuY2UgTmFtZSIgLCANCiAgICAgICBERUNPREUoYy5sb2dpbnMsJ1JFU1RS^MSUNURUQnLCdZRVMnLCdOTycpICJSZXN0cmljdGVkIE1vZGUiLA0KICAgICAgIGEubG9nX21vZGUg^MICJBcmNoaXZlIExvZyBNb2RlIiAgDQpGUk9NIHYkZGF0YWJhc2UgYSwgdiR2ZXJzaW9uIGIsIHYk^MaW5zdGFuY2UgYyxnbG9iYWxfbmFtZSBlICANCldIRVJFIGIuYmFubmVyIExJS0UgJyVPcmFjbGUl^MJzs=|0||0||1|1|| 
    3|参数文件(是spfile还是pfile)|c2VsZWN0IG52bCh2YWx1ZSwncGZpbGUnKSAiUGFyYW1ldGVyX0ZpbGUiIA0KZnJvbSB2JHBhcmFt^MZXRlciB3aGVyZSBOYW1lPSdzcGZpbGUnOw==|0||0||1|1|| 
    4|非默认的参数|c2VsZWN0IG5hbWUsIHJ0cmltKHZhbHVlKSAicHZhbHVlIiANCmZyb20gdiRwYXJhbWV0ZXIgIA0K^Md2hlcmUgaXNkZWZhdWx0ID0gJ0ZBTFNFJyANCm9yZGVyIGJ5IG5hbWU7|0||0||1|1||
    

        可以看出需要合并的行已经给合并了!
    一下步,就是要提取需要加密的域, 命令如下:

    Awk –F’|’ ‘{print $3}’ NEWFILE >> file1  把域3输入到file1:

       截取了file1 文件的第一行:

     

    c2VsZWN0IGEubmFtZSAiREIgTmFtZSIsIA0KICAgICAgIGUuZ2xvYmFsX25hbWUgIkdsb2JhbCBO^MYW1lIiwgDQogICAgICAgYy5ob3N0X25hbWUgIkhvc3QgTmFtZSIsIA0KICAgICAgIGMuaW5zdGFu^MY2VfbmFtZSAiSW5zdGFuY2UgTmFtZSIgLCANCiAgICAgICBERUNPREUoYy5sb2dpbnMsJ1JFU1RS^MSUNURUQnLCdZRVMnLCdOTycpICJSZXN0cmljdGVkIE1vZGUiLA0KICAgICAgIGEubG9nX21vZGUg^MICJBcmNoaXZlIExvZyBNb2RlIiAgDQpGUk9NIHYkZGF0YWJhc2UgYSwgdiR2ZXJzaW9uIGIsIHYk^MaW5zdGFuY2UgYyxnbG9iYWxfbmFtZSBlICANCldIRVJFIGIuYmFubmVyIExJS0UgJyVPcmFjbGUl^MJzs=
    
    

       这个就是加了base64密的字符,现在我们还不能直接把base64 来解密,因为文本字符中有大量 ^M ,我们需要把^M  去掉,

    命令如下:cat –v file1 | sed  ‘s/\^M//g’ >> file2

    截取了file2文件的第一行:

     

    c2VsZWN0IGEubmFtZSAiREIgTmFtZSIsIA0KICAgICAgIGUuZ2xvYmFsX25hbWUgIkdsb2JhbCBOYW1lIiwgDQogICAgICAgYy5ob3N0X25hbWUgIkhvc3QgTmFtZSIsIA0KICAgICAgIGMuaW5zdGFuY2VfbmFtZSAiSW5zdGFuY2UgTmFtZSIgLCANCiAgICAgICBERUNPREUoYy5sb2dpbnMsJ1JFU1RSSUNURUQnLCdZRVMnLCdOTycpICJSZXN0cmljdGVkIE1vZGUiLA0KICAgICAgIGEubG9nX21vZGUgICJBcmNoaXZlIExvZyBNb2RlIiAgDQpGUk9NIHYkZGF0YWJhc2UgYSwgdiR2ZXJzaW9uIGIsIHYkaW5zdGFuY2UgYyxnbG9iYWxfbmFtZSBlICANCldIRVJFIGIuYmFubmVyIExJS0UgJyVPcmFjbGUlJzs=
    
    

    可以发现^M 已经被处理掉了。

    现在我们已经把前期所有的准备工作做好了,现在就可以开始解密了,脚本如下:

     

    #!/ bin/bash 
    CURRPATH=/root/script 
    
    while read LINE 
    do 
    echo $LINE | base64 -d >> $CURRPATH/sql.sql 
    echo >> $CURRPATH/sql.sql 
    echo >> $CURRPATH/sql.sql 
    done < /root/script/file2
    
    

    解密出来的语句就是(截取了解密出来的文件第一条语句):

     

    select a.name "DB Name", 
    
           e.global_name "Global Name", 
    
           c.host_name "Host Name", 
    
           c.instance_name "Instance Name" , 
    
           DECODE(c.logins,'RESTRICTED','YES','NO') "Restricted Mode",
    
           a.log_mode "Archive Log Mode" 
    
    FROM v$database a, v$version b, v$instance c,global_name e 
    
    WHERE b.banner LIKE '%Oracle%';
    
    

    总结:其实这次工作最有乐趣的还是用shell 对文本的处理,在处理的过程中也走了不少弯路,尤其是在合并行的时候,但最终还是把文本给处理好了!我觉得最重要的还是要理清怎么来处理这个文本,shell 只不过是几个命令的组合,而命令的组合就需要我们对文本处理的思路了!

延伸阅读:

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规