工具

Ascii码

ASCII 码是对英语字符与二进制位之间的关系,做了统一规定。

基本的 ASCII 字符集共有 128 个字符,其中有 96 个可打印字符,包括常用的字母、数字、标点符号等,

​如:空格SPACE 是32(二进制:00100000)。数字0 是48(二进制:00110000)。大写字母A 是65(二进制:01000001)。另外还有 32 个控制字符(不能打印出来)。

这128个符号,只占用了一个字节的后面7位,最前面的一位统一规定为0。

特征

只含有数字

字符范围十进制范围 (10进制)二进制范围 (2进制)十六进制范围 (16进制)
0-948 - 5700110000 - 001110010x30 - 0x39
A-Z65 - 9001000001 - 010110100x41 - 0x5A
a-z97 - 12201100001 - 011110100x61 - 0x7A

举例

明文:hello,world.
十六进制:0x680x650x6c0x6c0x6f0xff0c0x770x6f0x720x6c0x640x2e
十进制:1041011081081112551211911111410810046
二进制:011010000110010101101100011011000110111100101100011101110110111101110010011011000110010000101110

Base系列编码

  • Base16编码是将二进制文件转换成由16个字符组成的文本
  • Base32的编码表是由(A-Z、2-7)32个可见字符构成,“=”符号用作后缀填充。
  • Base64的编码表是由(A-Z、a-z、0-9、+、/)64个可见字符构成,“=”符号用作后缀填充。
  • Base58的编码表相比base64少了数字0,大写字母I,O,小写字母 l (这个是L),以及符号‘+’和‘/’
  • Base91的密文由91个字符(0-9,a-z,A-Z,!#$%&()*+,./:;<=>?@[]
  • Base100编码/解码工具(又名:Emoji表情符号编码/解码),可将文本内容编码为Emoji表情符号;同时也可以将编码后的Emoji表情符号内容解码为文本。

举例

密文为hello,world.123456的编码

  • base16: 68656C6C6F2C776F726C642E313233343635 不用‘=’补齐,使用0-9,a-f共16个字符。
  • base32: NBSWY3DPFR3W64TMMQXDCMRTGQ3DK=== 不满5的倍数,用‘=’补齐。
  • base64: aGVsbG8sd29ybGQuMTIzNDY1 不满3的倍数,用‘=’补齐。
  • base58: 2smDFYXWKE8vc8XA8dadEYcSqcQb 不用‘=’补齐。
  • base85: BOu!rDst>tGAhM<A1fSl1GgsI 特点是奇怪的字符比较多,但是很难出现等号
  • base91: TPwJh>go2Tv!_,aRA2IbLmA
  • base100: 👟👜👣👣👦📦💳💃👮👦👩👣👛🐥🐨🐩🐪🐫🐬🐭

工作原理

Base64

  1. 分组处理

    • 每 3 个字节(3 × 8 = 24 位)为一组。
    • 将这 24 位分成 4 组,每组 6 位。
  2. 编码映射

    • 每个 6 位的值(范围 0~63)映射为 Base64 字符表中的一个字符。
    • Base64 字符表包含:
      A-Z a-z 0-9 + /
      
      共 64 个字符。
  3. 填充规则

    • 如果原始数据不是 3 的倍数:
      • 多出 1 个字节 ⇒ 补 2 个 =
      • 多出 2 个字节 ⇒ 补 1 个 =

Base32

  1. 分组处理
    • 每 5 个字节(5 × 8 = 40 位)为一组。
    • 将这 40 位分成 8 组,每组 5 位。
  2. 编码映射
    • 每个 5 位的值(范围 0~31)映射为 Base32 字符表中的一个字符。
    • Base32 字符表包含: text A-Z 2-7 共 32 个字符(不含 0189)。
  3. 填充规则
    • 如果原始数据不是 5 的倍数:
      • 多出 1 个字节 ⇒ 补 6 个 =;
      • 多出 2 个字节 ⇒ 补 4 个 =;
      • 多出 3 个字节 ⇒ 补 3 个 =;
      • 多出 4 个字节 ⇒ 补 1 个 =.

MD5

简述

​一般MD5值是32位由数字“0-9”和字母“a-f”所组成的字符串,字母大小写统一。如果出现这个范围以外的字符说明这可能是个错误的md5值。

特征

有固定长度,一般是32位或者16位 由数字“0-9”和字母“a-f”组成

举例

明文:hello, world.123456

md5("hello, world.123456",32) = 5189503aae1b1c0a6fbf7ea9e3128ab0
md5("hello, world.123456",16) = ae1b1c0a6fbf7ea9

SHA1

简述

SHA1是一种密码散列函数,SHA1可以生成一个被称为消息摘要的160位,20字节的散列值,散列值通常的呈现形式为40位十六进制数。这种加密和MD5类似。

特征

​有固定长度,为40位的字符串。

举例

明文:hello, world.123456

sha1(hello, world.123456) = 0179303b8f08fbc3d16cd23a4be5828790e12375

Unicode编码

简述

Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。 它用两个字节来编码一个字符,字符编码一般用十六进制来表示。

特征

有特殊前缀:&#x,&#,\U,\U+ 由两个字节,即4个16进制字符表示(一个字节=8位,例如(0000 0000),一个16进制字符=4位,例如(0000))

举例

明文:hello, world.

&#104;&#101;&#108;&#108;&#111;&#32;&#119;&#111;&#114;&#108;&#100;

URL编码

简述

  • url编码又叫百分号编码,是统一资源定位(URL)编码方式。
  • url地址(常说网址)规定了常用地数字,字母可以直接使用,另外一批作为特殊用户字符也可以直接用(/,:@等),剩下的其它所有字符必须通过%xx编码处理。
  • 编码方法很简单,在该字节ascii码的的16进制字符前面加%. 如 空格字符,ascii码是32,对应16进制是’20’,那么urlencode编码结果是:%20。

特征

编码前面都有%

举例

明文:hello,world.

hello%EF%BC%8Cworld.

摩尔斯密码

简述

摩尔斯电码(Morse Code)是由美国人萨缪尔·摩尔斯在1836年发明的一种时通时断的且通过不同的排列顺序来表达不同英文字母、数字和标点符号的信号代码,摩尔斯电码主要由以下5种它的代码组成:

  • 点(.)
  • 划(-)
  • 每个字符间短的停顿(通常用空格表示停顿)
  • 每个词之间中等的停顿(通常用 / 划分)
  • 以及句子之间长的停顿

摩尔斯密码对应表

.--…-.-.-.....-.—....---
-.-.-..-.---.—.—.-.-.-
..-…-.—-..--.——..-----.----..---…—
…--…—…---..----..-.-.-—..—..—..-…-
-…----…-.-.-.-.—.-.—.--..-.” .-..-.…-..-’ .----.¶ .-.-..
..—.-.—.-.---.-.-.—.-.-..-……-.-. …⁄ -..-.

进制转换

简述

十进制

十进制是Decimal,简写为D 都是以0-9这九个数字组成。

二进制

二进制是Binary,简写为B 由0和1两个数字组成。

八进制

八进制是Octal,简写为O 由0-7数字组成,为了区分与其他进制的数字区别,开头都是以0开始。

十六进制

十六进制为Hexadecimal,简写为H 表示方式常以0x开头 计数到F后,再增加1个,就进位。 由0-9和A-F组成,英文字母A,B,C,D,E,F分别表示数字10~15。

uudecode

UUencode编码起先用在unix网络中,先是Unix系统下将二进制的资料借由uucp邮件系统传输的一个编码程式,也是一种二进制到文字的编码。

特征

酷似base系列字符,但末尾有 ` 。

例子

$86)C"@`
`

解密脚本

#!/usr/bin/env python3
import sys, binascii
 
if len(sys.argv) < 2:
    print("用法: python uudecode.py 输入文件.uue")
    sys.exit(1)
 
infile = sys.argv[1]
out = None
outname = None
 
with open(infile, 'r', encoding='latin1') as f:
    for line in f:
        if line.startswith('begin '):
            parts = line.split()
            if len(parts) >= 3:
                outname = parts[2].strip()
            else:
                outname = 'decoded.bin'
            out = open(outname, 'wb')
            continue
        if line.strip() == 'end':
            break
        if out:
            # 忽略空行或非 uu 行可能抛出的错误
            try:
                data = binascii.a2b_uu(line.rstrip('\n'))
                out.write(data)
            except (binascii.Error, ValueError):
                # 跳过无法解码的行(例如空行)
                pass
if out:
    out.close()
    print(f'写入:{outname}')
else:
    print('没有找到 begin 行,或文件格式不对。')

<<<<<<< HEAD

import uu
uu.decode('a.txt')

=======

8584d5ecb81c7bb09b23a53162f6ec0a335575be

云影密码

有1,2,4,8这四个数字,可以通过加法来用这四个数字表示0-9中的任何一个数字,列如0=28, 也就是0=2+8,同理7=124, 9=18。这样之后再用1-26来表示26个英文字母,就有了密文与明文之间的对应关系。引入0来作为间隔,以免出现混乱。

特征

只有01248这5种数字。

加密脚本

mcode = input()
dic = [chr(i) for i in range(ord("A"), ord("Z") + 1)]
m = [i for i in mcode]
tmp = [];flag = []
for i in range(len(m)):
    for j in range(len(dic)):
        if m[i] == dic[j]:
            tmp.append(j + 1)
for i in tmp:
    res = ""
    if i >= 8:
         res += int(i/8)*"8"
    if i%8 >=4:
        res += int(i%8/4)*"4"
    if i%4 >=2:
        res += int(i%4/2)*"2"
    if i%2 >= 1:
        res += int(i%2/1)*"1"
    flag.append(res + "0")
print ("".join(flag)[:-1])

解密脚本

c = input () 
c = c.split("0") 
m = ''
for i in range(0, len(c)):
    str = c[i]
    sum = 0
    for i in str:
        sum += int(i)
    m += chr(sum + 64)
print(m)