当前位置: 首页 > 工具软件 > JSFuck > 使用案例 >

编码基础-hex,urlencode,morsecode,jsfuck,uuencode,base家族

那鹏
2023-12-01

前言

编码不是为了让别人看到后解不出来,而是代表信息的另一种表达方式。将原始信息转化为编码信息进行传输,可以解决一些特殊字符、不可见字符的传输问题。

hex

对于中英文以及可见不可见的信息,我们可以在传输前将信息都编码为十六进制的hex,使传输信息的过程更加规范。
常用于:要进行各类编码的转化,或者是要将信息在计算机存储中最为本质的一面表现出来的时候。

正向编码

使用python进行hex的变换,代码如下:

s="想要转换的字符"
print s.encode("hex")

一般密码学操作都是数学计算过程。我们可以通过hex编码将原始的字符串转化为十六进制字符后的拼接后,再进行进一步的数学计算。Python实现代码如下:

s="flag"
t=s.encode("hex")
print int(t,16)//结果为1718378855
  • 补充:python的int() 函数用于将一个字符串或数字转换为整型。int() 方法的语法:
    class int(x, base=10)
    x – 字符串或数字。
    base – 进制数,默认十进制。
    含义为:视 x 为 base 类型数字,并将其转换为 10 进制数字

在s被hex编码时,int函数将其hex编码后的字符串转化为对应的十进制数字,这样就可以进行数学计算。上述过程是将字符串转化为十进制数的最好办法。对于单字符,ord函数更为简单。如:

print int("a".encode("hex"),16)
print ord("a")

执行结果都是97

反向解密

  • 当解密运算结束后,需要将数字转化为原字符串,代码:
 num=....
 print hex(num)//得到数字对应的hex码
 print hex(num)[2:-1]//将hex码首尾的0x和L去掉
 print hex(num)[2:-1].decode("hex")//解hex码为原字符串

hex函数可以将十进制转换为十六进制字符串,并且会自动补“0x”。如果是long型,还会在末尾自动补“L”。但此方法并不适合所有情况,一是因为并不是所有的数字在hex之后都会补“L”;二是因为decode要保证编码的字符串都是偶数位,奇数位会在前面补“0”.所以我们自己编一个解码的代码:

def num2str(num):
	tmp=hex(num)[2:].replace("L","")//得到0x后的,用空格替代掉L的hex码
	if len(tmp)%2==0://判断hex码的位数并实施不同操作后解码
		return tmp.decode("hex")
	else:
		return("0"+tmp).decode("hex")
print num2str(要解码的数字串)//调用函数解自己想要解的数字码
  • 实际问题可以通过PyCrypto库进行更为方便的转换操作。如下:
from Crypto.Util.number import long_to_bytes,bytes_to_long//从库中引入两个函数
flag="flag{123}"
print bytes_to_long(flag)//将原字符转化为十进制long型数字串
print long_to_bytes(bytes_to_long(flag))//将原字符转化为十进制long型字符串后再反编码为原字符串

总结

要理解encode(“hex”)是为了将字符串编码为hex十六进制字符,int(t,16)是为了把十六进制字符进一步转换为十进制字符。那么逆向,由十进制字符的到hex十六进制字符需要hex(num)函数,由hex十六进制字符得到原字符串需要decode(“hex”)。

urlencode

此编码用于浏览器和网址之间的数据交换,主要功能是解决一些特殊字符再传输过程中造成的问题。此编码易于理解,在特殊字符hex的基础上,每个字符前加上一个“%”即可。

正向编码

如下:

flag{url_encode_1234_!@#$}
flag%7Burl_encode_1234_%21@%23%2457D

反向解码

在url编码于解码的时候,只需要关注%的内容,每当遇到%,连带%的三个字符对应着明文的一个字符。python中可以urllib中的两个函数来进行urlencode:

import urllib
print urllib.quote("flag{url_encode_1234_!@#$}")//可以使用quote函数进行url编码,对应用unquote函数进行解码
d={'name':'bibi@flappypig.club','flag{url_encode_1234_!@#$}'}//urlencode函数能对字典模式的键值对进行url编码
print urllib.urlencode(d)

morsecode

摩斯电码被很多人误以为是一种加密方式,但他实际上是一种编码,因为它并不存在密钥。用于短音长音传递消息。
使用".“表示短音,使用”-“表示长音,使用”/"表示分隔符。通常会将摩斯电码与MISC音频结合出题。最为典型的是“滴滴滴滴”的摩斯电码的音频。耳力好可以直接听、抄、解,求稳可以用cool edit等音频剪辑软件。可以抄录后上传到解码网站进行解码。
如:
http://www.atool.org/morse.php
http://www.zhongguosou.com/zonghe/moErSiCodeConverter.aspx
http://www.bejson.com/enc/morse/
http://www.jb51.net/tools/morse.html

jsfuck

该编码方式比较有趣,仅用六种字符“()+[]!”就表示了全部的javascript语句。因此也比较好识别。在线解码网站如下:
http://www.jsfuck.com
http://utf-8.jp/public/jsfuck.html

uuencode

该种编码是将二进制文件转化为可见字符文本的一种编码,转换后的文本可以通过纯文本的emai进行传输,因为转换后的字符仅包含可见字符。uuencode的运算法则是将连续的3字节扩展成4字节,这一点与base64很像。编码效率高于hex。
在线编码网站:http://www.qqxiuzi.cn/bianma/uuencode.php
如何识别uuencode编码?借助编码字符取值:32(空白)-95(底线),也就是没有小写字母。

base家族

很多人知道base64,但是除了base64还有base16,base32等多种隶属于base家族的编码方式。
与前面几种编码的功能类似,base64以及base家族其他各种类型的编码的功能,主要还是将特殊字符和不可见字符转化为常见字符,用于网络传输。我们在使用hex时可以看到,一个字符变成了两个字符,这是因为我们需要用4bit的内容去表达16bit的内容导致的,也就是用16个字符去表达256个字符导致的。如果我们用更多的字符去表达呢?比如32个字符和64个字符。因此base32和base64应运而生,base16就是hex。

base编码字符集

如何判断一个编码是不是base家族编码呢?如果末尾有“=”,则一定是base编码,如果没有,再看一下编码中包含的字母,是否都在base家族对应的字符集上,如果完全对应,则证明是base家族的编码。
base64 使用的字符集:a-z,A-Z,0-9,+,/共64个,以及补位的“=”
base32 使用的字符集:A-Z,2-7共32个,以及补位的“=”
base16 使用的字符集:A-F,0-9共16个,以及补位的“=”
如果使用python进行base编码,如果只是base64,则可以很方便地使用字符串的encode和decode进行编码解码,但如果是base32以及base16,那么就需要用到base64库中的函数来进行编码解码。

import base64
print "字符串".encode("base64")
print base64.bxxencode("字符串")//xx可以是,16,32,也可以是64
print "字符串".decode("base64")
print base64.bxxdecode("字符串")//xx可以是,16,32,也可以是64

对base64的理解

这里需要注意,在python中使用字符串的encode时,会多出一个空行。
如何理解base64编码?
我们都知道字符大小是1byte,也就是8bit,3byte就有24bit。然后我们将这24bit切成4份,每份6bit,转换成数字后,在 base64编码表(正常用的原始base64编码表,有时候可能遇到私有表)中找到对应字母表示出来就行了,6bit刚好能表达64个字符,正好对应base64字符集的取值范围,也就是说,通过这种变换方式,每3个字符变成了4个字符。
如AST三个字符,每个字符的8位二进制码组合成为24位二进制码,平均分成4份后,对照base64原始表或者私有表,转换为四个字母。

 类似资料: