为什么大家要学这个模块?
什么,你觉得我这个是念ppt?
老铁我这个是2024下半年最新款好吧,谁会有时间跟我一样花七天搞一个这样子的东西而且还很费脑写脚本。
嗯....好吧那个人就是我hhhh。
这个模块是让大家初入学习ctf常见的密码固有特点,以便大家在日后学习过程中方便解密。
base家族
base16
- 使用16个ASCII可打印字符(即数字0-9和字母A-F),对任意字节数据进行编码。
- 先获取输入字符串每个字节的二进制值(不足8比特在高位补0),然后将其串联进来,再按照4比特一组进行切分,将每组二进制数分别转换成十进制。
- Base16编码后的数据量是原数据的两倍:1000比特数据需要250个字符(即 250*8=2000 比特).
由于4bit就可以表示2^4 = 16个字符。所以用4bit可以表示所有的十六进制数。
1byte=8bit 所以1byte = 俩个十六进制数据。
编码符号表如下:
0000 -> 0
0001 -> 1
0010 -> 2
0011 -> 3
0100 -> 4
0101 -> 5
0110 -> 6
0111 -> 7
1000 -> 8
1001 -> 9
1010 -> A
1011 -> B
1100 -> C
1101 -> D
1110 -> E
1111 -> F
补充:二进制数据不是4的倍数,就在后面填充0;
下面是base16的py脚本大家可以参考一下(含加密解密):
def encrypt_to_base16(data):
"""将输入数据加密为 Base16(十六进制)格式"""
if isinstance(data, str):
data = data.encode('utf-8') # 转换为字节
return data.hex() # 进行十六进制编码
def decrypt_from_base16(encoded_data):
"""将 Base16(十六进制)格式的数据解密为原始数据"""
if isinstance(encoded_data, str):
return bytes.fromhex(encoded_data).decode('utf-8') # 解码回字符串
raise ValueError("输入数据必须是字符串格式的十六进制")
if __name__ == "__main__":
# 输入原始文本
original_text = input("请输入需要加密的文本: ")
# 加密
encrypted_text = encrypt_to_base16(original_text)
print(f"加密后的数据: {encrypted_text}")
# 解密
decrypted_text = decrypt_from_base16(encrypted_text)
print(f"解密后的数据: {decrypted_text}")
总结一下:这里大家记住base16的格式 数字0-9和字母A-F的方式,1比特等于8字符。
base16加密解密压缩包:
base32
Base32编码是一种将二进制数据转换为使用32个不同字符表示的文本编码方式。
由于5bit就可以表示2^5 = 32个字符。所以base32就是将二进制数据分割成5个一组,如果结尾不满足5的倍数,就用“=”填充,之后再根据base32索引表,进行编码。
编码符号表如下:
00000 -> A
00001 -> B
00010 -> C
00011 -> D
00100 -> E
00101 -> F
00110 -> G
00111 -> H
01000 -> I
01001 -> J
01010 -> K
01011 -> L
01100 -> M
01101 -> N
01110 -> O
01111 -> P
10000 -> Q
10001 -> R
10010 -> S
10011 -> T
10100 -> U
10101 -> V
10110 -> W
10111 -> X
11000 -> Y
11001 -> Z
11010 -> 2
11011 -> 3
11100 -> 4
11101 -> 5
11110 -> 6
11111 -> 7
简单的base加密解密py:
import base64
def base32_encode(data: bytes) -> str:
"""对输入的字节数据进行 Base32 编码"""
return base64.b32encode(data).decode('utf-8')
def base32_decode(data: str) -> bytes:
"""对 Base32 编码的数据进行解码"""
return base64.b32decode(data)
if __name__ == "__main__":
while True:
user_input = input("请输入文本进行编码或解码(输入exit退出): ")
if user_input.lower() == 'exit':
print("退出程序.")
break
try:
# 尝试解码
decoded_data = base32_decode(user_input)
print("解码后的数据:", decoded_data.decode('utf-8'))
except Exception:
# 如果解码失败,则说明用户输入的是普通文本,进行编码
encoded_data = base32_encode(user_input.encode('utf-8'))
print("编码后的数据:", encoded_data)
base32字母转二进制的py
def letter_to_base32_index(letter):
"""将字母转换为对应的 Base32 索引"""
base32_alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'
if letter in base32_alphabet:
return base32_alphabet.index(letter)
else:
raise ValueError(f"字母 '{letter}' 不在 Base32 字母表中")
def index_to_binary(index):
"""将 Base32 索引转换为 5 位二进制字符串"""
return f"{index:05b}"
if __name__ == "__main__":
# 输入一串字母
input_letters = input("请输入一串字母(A-Z 或 2-7): ").upper()
# 存储所有的二进制表示
binary_representations = []
# 转换每个字母并添加到列表中
for letter in input_letters:
try:
index = letter_to_base32_index(letter)
binary_representation = index_to_binary(index)
binary_representations.append(binary_representation)
except ValueError as e:
print(e)
continue
# 输出所有二进制表示,一行排列
print(" ".join(binary_representations))
base32加密解密压缩包:
base58
- Base58是用于Bitcoin中使用的一种独特的编码方式,主要用于产生Bitcoin的钱包地址。
- 相比Base64,Base58不使用数0,字母大写O,字母大写I,和字母小写l,以及+和/符号。
设计Base58主要的目的是:
-
避免混淆。在某些字体下,数字0和字母大写O,以及字母大写I和字母小写l会非常相似。
-
不使用+和/的原因是非字母或数字的字符串作为帐号较难被接受。
-
没有标点符号,通常不会被从中间分行。
编码符号表如下:
下面是简单的base58加密解密py:
import string
# Base58 字符集
BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
def encode_base58(input_string):
"""将输入字符串编码为 Base58."""
# 将字符串转换为字节
byte_array = input_string.encode('utf-8')
num = int.from_bytes(byte_array, 'big')
# 编码过程
encoded = ''
while num > 0:
num, remainder = divmod(num, 58)
encoded = BASE58_ALPHABET[remainder] + encoded
# 处理前导零
for byte in byte_array:
if byte == 0:
encoded = BASE58_ALPHABET[0] + encoded
else:
break
return encoded
def decode_base58(encoded_string):
"""将 Base58 编码字符串解码为原始字符串."""
num = 0
for char in encoded_string:
num *= 58
num += BASE58_ALPHABET.index(char)
# 将十进制数转换为字节
combined = num.to_bytes((num.bit_length() + 7) // 8, 'big')
# 解码为字符串
decoded = combined.decode('utf-8', errors='ignore')
return decoded
# 主程序
def main():
while True:
action = input("请选择操作 (1: 编码, 2: 解码, 3: 退出): ")
if action == '1':
user_input = input("请输入需要编码的字符串: ")
encoded_string = encode_base58(user_input)
print(f"Base58 编码: {encoded_string}")
elif action == '2':
user_input = input("请输入需要解码的 Base58 字符串: ")
decoded_string = decode_base58(user_input)
print(f"解码结果: {decoded_string}")
elif action == '3':
print("退出程序.")
break
else:
print("无效的选择,请重新输入.")
if __name__ == '__main__':
main()
base58加密解密压缩包:
base64
Base64是一种用于将二进制数据编码为ASCII字符的编码方法。它广泛用于在需要通过文本传输的场景中,如电子邮件、网页数据传输等。Base64文字符合标准ASCII字符集,通常使用字母(A-Z, a-z)、数字(0-9)以及+和/这两个符号,编码后的数据通常以=作为填充字符,使数据长度是4的倍数。
1. 基本原理:
Base64编码会将每3个字节(即24位)分为4组,每组6位(2^6=64),对应Base64字符集中的一个字符。
如果输入数据不是3的倍数,会在末尾用`=`号进行填充,从而使最后一组的长度补齐到4的倍数。
2.编码过程:
将待编码的数据转换为二进制表示。
每24位二进制数据分为4组,每组6位,查找Base64字符表,将这4组6位二进制数转换为对应的Base64字符。
3. 解码过程:
反向操作:先将Base64字符转换回6位的二进制,然后将每3组6位合并为24位的二进制,最后将这些二进制数据转回原始的字节数据。
编码符号表如下:
下面是简单的base64加密解密py:
import base64
def base64_encode(data):
# 将数据编码为 bytes
bytes_data = data.encode('utf-8')
# 进行 Base64 编码
base64_bytes = base64.b64encode(bytes_data)
# 将编码后的 bytes 转为字符串
base64_string = base64_bytes.decode('utf-8')
return base64_string
def base64_decode(base64_string):
# 将 Base64 字符串编码为 bytes
base64_bytes = base64_string.encode('utf-8')
# 进行 Base64 解码
bytes_data = base64.b64decode(base64_bytes)
# 将解码后的 bytes 转为字符串
data = bytes_data.decode('utf-8')
return data
if __name__ == "__main__":
while True:
action = input("请选择操作: 1 - 编码, 2 - 解码, q - 退出: ")
if action == '1': # 编码
original_data = input("请输入要进行 Base64 编码的字符串: ")
encoded_data = base64_encode(original_data)
print("Encoded:", encoded_data)
elif action == '2': # 解码
base64_string = input("请输入要进行解码的 Base64 字符串: ")
decoded_data = base64_decode(base64_string)
print("Decoded:", decoded_data)
elif action == 'q': # 退出
print("退出程序。")
break
else:
print("无效的输入,请重新选择。")
base64加密解密压缩包:
base85
Base85(也称为Ascii85)是一种用于将二进制数据编码为可打印 ASCII 字符的编码方法,其主要特点是能够以更高的效率将数据编码为文本形式。Base85 编码通常用于 Adobe PDF 文件等场景中,用于将二进制数据转换为可嵌入文本的数据。
Base85 编码将每 4 字节(32 位)的二进制数据转换为 5 个 ASCII 字符。这个编码过程可分为以下几个步骤:
1. 输入数据:将待编码的二进制数据分成每 4 字节一组。
2. 数值转换:将这 4 字节合并为一个 32 位的整数。
3. 除法与余数:对这个整数进行除数和余数的操作,用 85 作为基数进行多次除法,得到 5 个对应的字符。
4. 字符映射:根据计算结果查找 ASCII 字符,例如,将数值 0 映射到字符 !, 1 映射到字符 ", 依此类推,直到字符 u。
编码符号表如下:
下面是简单的base64加密解密py:
import base64
def base85_encode(data):
# 将数据编码为 bytes
bytes_data = data.encode('utf-8')
# 进行 Base85 编码
base85_bytes = base64.b85encode(bytes_data)
# 将编码后的 bytes 转为字符串
base85_string = base85_bytes.decode('utf-8')
return base85_string
def base85_decode(base85_string):
# 将 Base85 字符串编码为 bytes
base85_bytes = base85_string.encode('utf-8')
# 进行 Base85 解码
bytes_data = base64.b85decode(base85_bytes)
# 将解码后的 bytes 转为字符串
data = bytes_data.decode('utf-8')
return data
if __name__ == "__main__":
while True:
action = input("请选择操作: 1 - 编码, 2 - 解码, q - 退出: ")
if action == '1': # 编码
original_data = input("请输入要进行 Base85 编码的字符串: ")
encoded_data = base85_encode(original_data)
print("Encoded:", encoded_data)
elif action == '2': # 解码
base85_string = input("请输入要进行解码的 Base85 字符串: ")
try:
decoded_data = base85_decode(base85_string)
print("Decoded:", decoded_data)
except Exception as e:
print("解码出错:", e)
elif action == 'q': # 退出
print("退出程序。")
break
else:
print("无效的输入,请重新选择。")
base85加密解密压缩包:
凯撒大帝的常见解密
凯撒加密(Caesar Cipher)是一种最简单的加密技术,属于替换加密的一种。它的原理主要是通过对字母进行位移来达到加密的目的。
加密过程:
- 对于每一个字母,将其在字母表中的位置向后移动偏移量个位置。例如,如果偏移量是3,字母A变成D,B变成E,以此类推。(简单来说就是位置偏移)
- 当字母表的末尾被超出时,循环回到字母表的开头。
下面是简单的凯撒解密py:
def caesar_decode(ciphertext, shift):
decoded_text = ""
# 遍历每个字符
for char in ciphertext:
if char.isalpha(): # 判断字符是否为字母
# 计算偏移
shifted = ord(char) - shift
# 当字符越界时,循环回到字母表开始
if char.islower():
if shifted < ord('a'):
shifted += 26
elif char.isupper():
if shifted < ord('A'):
shifted += 26
decoded_text += chr(shifted)
else:
# 非字母字符保持不变
decoded_text += char
return decoded_text
# 用户输入的密文
ciphertext = input("请输入需要解码的密文:")
# 遍历偏移量从1到25
for shift in range(1, 26):
decoded = caesar_decode(ciphertext, shift)
print(f"偏移量 {shift}: {decoded}")
凯撒解密解密压缩包:
https://download.csdn.net/download/m0_73951999/89829289https://download.csdn.net/download/m0_73951999/89829289这个zip加上了高亮显示 特殊字符:
栅栏加密解密
栅栏加密(Rail Fence Cipher)是一种古老的加密方法,它通过将明文按照特定的模式排列,然后按照相同的模式读取来加密信息。解密过程则是通过反向操作来恢复原始信息。
加密原理
- 选择栅栏的行数:首先,选择一个数字作为栅栏的行数。例如,选择5行。
- 排列明文:将明文按照从上到下、从左到右的顺序填入栅栏中。当到达最后一行时,返回到第一行继续填入。
- 读取加密信息:按照相同的顺序读取栅栏中的字符,形成加密后的信息。
加密:
最简单的:
常见的:
解密步骤:
- 确定栅栏数和密文长度:首先需要知道栅栏的数量和密文的长度(一般比赛会提示要不然就爆破)。
- 构建栅栏框架:创建一个 N 行的框架,按照加密方式标记出每个字符在密文中的位置。
- 填充密文:将密文字符按照标记的顺序填入框架中。
- 读取明文:再按照之字形的方式从框架中读取字符,恢复明文。
常见的那个flag为:F_LCATGF{_FYLEASG}
分为9栏时,解密结果为:FLAG{FLAG_CTF_YES}
栅栏加密解密压缩包: 太难我自己搞了两三天搞不出来哈哈
培根加密解密
培根加密(Bacon's Cipher)是一种古老的隐写术,由英国哲学家弗朗西斯·培根(Francis Bacon)于 17 世纪发明。它主要通过将明文转换为特定的符号(通常是格式或字体的变化)来隐藏信息,而不改动原始文本的可读性。
加密原理
-
字母映射:每一个字母(通常是 A-Z)映射为一组五个二进制数字(0 和 1)。在培根的原始版本中,字母是用两个不同的符号来表示的:
A
和B
,但后来的变种通常使用更易于实现的 0 和 1 或其他符号。
2、培根密码加密规则,将明文中的每个字母,转换成一组五个英文字母,即可得到密文,转换规则表如下:
A AAAAA G AABBA N ABBAA T BAABA
B AAAAB H AABBB O ABBAB U-V BAABB
C AAABA I-J ABAAA P ABBBA W BABAA
D AAABB K ABAAB Q ABBBB X BABAB
E AABAA L ABABA R BAAAA Y BABBA
F AABAB M ABABB S BAAAB Z BABBB
解密原理
解密过程基本上是加密过程的逆过程:
-
提取信息:从文本中提取出隐藏的字符(通常是能够用于识别的字符样式),得到一个二进制串(
A
和B
的形式)。 -
映射回字母:将提取出来的二进制串按照预定的字母映射表转换回明文。
培根加密解密压缩包:
猪圈加密解密
猪圈密码(亦称朱高密码),是一种以格子为基础的简单替代式密码,曾经是美国内战时盟军使用的密码,目前仅在密码教学、各种竞赛中使用。
猪圈密码,一种简单的替换加密方法通常被称为一种“简单的加密形式”。它的基本原理是通过将原始文本中的字符替换为其他字符来隐藏信息。这种加密方法通常是对称的,也就是说,加密和解密使用相同的规则。
加密步骤
- 创建替换规则:首先,定义一个字符替换的规则。例如,可以选择将字母“a”替换为“b”,“b”替换为“c”,以此类推,形成一个简单的字母偏移。
- 应用替换规则:遍历原始文本中的每个字符,按照预先定义的规则进行替换。非字母字符(如空格、数字和标点符号)通常保持不变。
解密步骤
- 建立反向替换规则:解密时需要建立与加密相反的替换规则。例如,如果加密时将“a”替换为“b”,那么解密时应将“b”替换回“a”。
- 应用反向替换规则:与加密相似,遍历加密后的文本,根据反向替换规则将字符替换回原本的字符,从而恢复原始文本。
示例
我们选择一个简单的替换规则(要根据实际情况而定我这个只是示范):
- a -> b
- b -> c
- c -> d
- ...
- z -> a
加密示例:
原始文本:"abc"
加密后文本:"bcd"
解密示例:
加密文本:"bcd"
解密后文本:"abc
加密原理(朱高密码):
下面是密码表:
猪圈加密解密(朱高密码)压缩包:这种鬼画符的加密解密我做不出来啊。
猪圈加密解密压缩包:哈哈要根据实际情况来(遍历太麻烦我懒得写hhhh)。
摩斯加密解密
摩斯密码是一种用点和划来表示字母、数字及其他字符的编码系统。其原理基于不同的符号组合来传达信息,每个字母或数字都对应一个特定的点和划的组合。具体如下:
-
符号定义:
- 点(·)表示短音或短信号。
- 划(−)表示长音或长信号。
- 点和划的组合用于表示字母、数字和一些标点符号。
-
字母和数字的编码:
- 每个字母或数字都有独特的摩斯密码编码。例如,字母“A”表示为“·−”,字母“B”表示为“−···”,数字“1”表示为“·−−−−”,数字“0”表示为“− − − − −”。
-
间隔:
- 字母之间的间隔通常用一个短暂的停顿来区分(一般为一个点的时间长度)。
- 单词之间的间隔则更长,通常是三个点的时间长度。
摩斯加密解密压缩包:
社会主义核心价值观解密
import random
import string
def count_core_values(text):
# 定义一个包含社会主义核心价值观的列表
core_values = ['富强', '民主', '文明', '和谐', '自由', '平等', '公正', '法治', '爱国', '敬业', '诚信', '友善']
# 使用字典来统计每个价值观出现的次数
value_counts = {value: text.count(value) for value in core_values}
return value_counts
def generate_random_string(length):
# 生成包含字母和数字的随机字符串
characters = string.ascii_letters + string.digits
return ''.join(random.choice(characters) for _ in range(length))
def format_flag(counts):
# 将统计结果转换为字符串
counts_str = ''.join(f"{value}{count}" for value, count in counts.items())
# 生成随机字符串
random_string = generate_random_string(32)
return f"flag{{{random_string}}}"
# 输入文本
text = "公正公正公正诚信文明公正民主公正法治法治诚信民主自由敬业公正友善公正平等平等法治民主平等平等和谐敬业自由诚信平等和谐平等公正法治法治平等平等爱国和谐公正平等敬业公正敬业自由敬业平等自由法治和谐平等文明自由诚信自由平等富强公正敬业平等民主公正诚信和谐公正文明公正爱国自由诚信自由平等文明公正诚信富强自由法治法治平等平等自由平等富强法治诚信和谐"
# 统计每个价值观出现的次数
counts = count_core_values(text)
# 格式化为flag形式
flag = format_flag(counts)
# 输出结果
print(flag)
-
功能:
- 代码能够统计并输出给定文本中社会主义核心价值观出现的次数,并生成一个包含随机字符的标识符(flag),便于进一步处理或记录。
- 在text后面输入社会主义核心价值观即可
- 这个知道怎么使用就行不需要记