CTF-Crypto-第一天-常见编码and古典密码(入门学习笔记)(详)

news2024/11/14 20:06:34

文章目录

  • 前言
  • 0x1 常见编码
    • 0x01 编码
    • 0x02 ASCII码
    • 0x03 Base系列编码
    • 0x04其他编码
      • - URL编码
      • -莫尔斯电码(Morse Code)
      • -HTML实体编码
      • -其他中的其他...
    • 0x05编码与加密的关系
  • 古典密码
    • 凯撒密码
    • 简单替换密码
    • 维吉尼亚密码
    • 栅栏密码
    • 其他古典密码
      • 替换加密
      • 移位加密

前言

学习笔记撒;总结一下;

0x1 常见编码

0x01 编码

编码是信息按照预定的规则从一种形式或格式转换为另一种形式的过程;

例如:

  • 文本文件通过ASCII编码的形式存储在计算机中
  • HTTP协议通过Base64编码传输二进制数据

0x02 ASCII码

简述:
ASCII (American Standard Code for Information Interchange):美国信息交换标准代码是基于拉丁字母的一套电脑编码系统,是最通用的信息交换标准;

三个部分:

  • 不可打印的控制字符(0 ~ 31)
  • 可打印的字符(32 ~ 127)
  • 扩展ASCII字符(128 ~ 255)

标准的ASCII码表:
在这里插入图片描述

0x03 Base系列编码

这个之前总结过了~
看一看呗 Base系列编码详解

0x04其他编码

- URL编码

简述:
url编码又叫百分号编码,是统一资源定位(URL)编码方式。URL地址(常说网址)规定了常用地数字,字母可以直接使用,另外一批作为特殊用户字符也可以直接用(/,:@等),剩下的其它所有字符必须通过%xx编码处理。

**特征:**编码前面都有%

例子:

(Hel10 Crypto!)

编码后’

%EF%BC%88Hel10%20Crypto%EF%BC%81%EF%BC%89

在线网站:
站长工具URL编码解码

-莫尔斯电码(Morse Code)

简述:
摩尔斯电码(英语:Morse code)是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母、数字和标点符号。

摩尔斯电码主要由以下5种它的代码组成:

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

基础拉丁字母表:
在这里插入图片描述
数字表:
在这里插入图片描述
其余还有标点符号希腊字母一系列编码表,查看

在线编码:莫斯电码

-HTML实体编码

​ 字符实体是用一个编号写入HTML代码中来代替一个字符,在使用浏览器访问网页时会将这个编号解析还原为字符以供阅读。
在这里插入图片描述

在线网站:实体编码互转

-其他中的其他…

  • Quoted-printable编码
  • XXencode编码
  • UUencode编码
  • 敲击码
  • ……

CTF中常见编码

0x05编码与加密的关系

在密码学中,经常提及编码和加密这个术语,大部分人会混用编码和加密,但是,编码不是加密!
通俗来说:编码的目的是转换格式,并不是为了让你读不懂,而加密是对数据进行隐藏和保护,让你识别不了明文。
所以,要说base编码而不是base加密。

古典密码

凯撒密码

简述:
凯撒密码是一种移位密码,通过把字母移动一定的位数来实现加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。
例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推X将变成A,Y变成B,Z变成C。由此可见,位数就是凯撒密码加密和解密的密钥。

例如:
明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ
密文字母表:DEFGHIJKLMNOPQRSTUVWXYZABC

解密:

  • 暴力破解法
    因为凯撒密码位数的范围是0~25(偏移0和偏移26一样),最终的情况并不多,可以用python写个脚本将所有情况罗列出来,找到密文即可
def caesar_decrypt(ciphertext, shift):
    decrypted_text = ""

    for char in ciphertext:
        if char.isalpha():
            is_upper = char.isupper()
            char = char.lower()
            decrypted_char = chr(((ord(char) - ord('a') - shift) % 26) + ord('a'))
            if is_upper:
                decrypted_char = decrypted_char.upper()
            decrypted_text += decrypted_char
        else:
            decrypted_text += char

    return decrypted_text

def caesar_brute_force(ciphertext):
    for shift in range(1, 26):
        decrypted_text = caesar_decrypt(ciphertext, shift)
        print(f"Shift {shift}: {decrypted_text}")

if __name__ == "__main__":
    ciphertext = "Your encrypted text goes here"  # 你的密文在这里替换
    caesar_brute_force(ciphertext)

  • 字频分析法
    明文加密后得到密文,并不会改变每个字母的出现频率,因此可是通过计算出现在明文和密文中出现最多的俩个字母,计算其偏移,即是位数(密钥)。

在线网站:凯撒密码加密/解密

简单替换密码

简述:
简单替换密码(Simple Substitution Cipher)加密时,将每个明文字母替换为与之唯一对应且不同的字母。它与恺撒密码之间的区别是其密码字母表的字母不是简单的移位,而是完全是混乱的,这也使得其破解难度要高于凯撒密码。

例如:

明文字母 : abcdefghijklmnopqrstuvwxyz
密钥字母 : phqgiumeaylnofdxjkrcvstzwb

a 对应 p,d 对应 h,以此类推;

明文:the quick brown fox jumps over the lazy dog
密文:cei jvaql hkdtf udz yvoxr dsik cei npbw gdm

解密:
因为加密的密钥个数是 26!26!个,所以基本不可能用暴力破解,一般采用字频分析法。

  • 字频分析法:
    • 第一步要先统计字母频率:对密文进行字母频率分析。计算每个字母在密文中出现的次数。
    • 确定常用字母:找出在所使用的语言中最常见的字母。英语中,E是最常用的字母
    • 根据字母频率猜测有可能的替代关系,例如字频最高的字母可能对应最常见的字母E
    • 初步解密,根据猜想初步解出一部分密文
    • 根据语言特性或者单词,进一步猜测替代关系
    • 慢慢修正猜想,直到整个密文都被解密,验证一下猜想;

在线网站: 字频分析

维吉尼亚密码

简述:
维吉尼亚密码(又译维热纳尔密码)是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式。
维吉尼亚密码以其简单易用而著称,同时初学者通常难以破解,因而又被称为“不可破译的密码”(法语:le chiffre indéchiffrable)。这也让很多人使用维吉尼亚密码来加密的目的就是为了将其破解。
“第一次遇到维吉尼亚密码题目就叫做le chiffre indéchiffrable,hhhh”

加密过程:
在一个凯撒密码中,字母表中的每一字母都会作一定的偏移,例如偏移量为3时,A就转换为了D、B转换为了E……而维吉尼亚密码则是由一些偏移量不同的凯撒密码组成。
为了生成密码,需要使用表格法。这一表格包括了26行字母表,每一行都由前一行向左偏移一位得到。具体使用哪一行字母表进行编译是基于密钥进行的,在过程中会不断地变换。
例如,假设明文为:

ATTACKATDAWN

如果关键词为LEMON,先将其填充到明文同等长度,得到密钥

LEMONLEMONLE

对于明文的第一个字母A,对应密钥的第一个字母L,于是使用表格中L行字母表进行加密,得到密文第一个字母L。类似地,明文第二个字母为T,在表格中使用对应的E行进行加密,得到密文第二个字母X。以此类推,可以得到:

明文:ATTACKATDAWN
密钥:LEMONLEMONLE
密文:LXFOPVEFRNHR

解密的过程则与加密相反。例如:根据密钥第一个字母L所对应的L行字母表,发现密文第一个字母L位于A列,因而明文第一个字母为A。密钥第二个字母E对应E行字母表,而密文第二个字母X位于此行T列,因而明文第二个字母为T。以此类推便可得到明文。

在这里插入图片描述

用数字0-25代替字母A-Z,维吉尼亚密码的加密文法可以写成同余的形式:
在这里插入图片描述
解密方法则能写成:
在这里插入图片描述

解密:
关于维吉尼亚的密码解密,一般都是以字母频率为基础的,但不是直接的字频分析;有三个著名的试验可以破译维吉尼亚密码;

  • 卡西斯基试验
  • 弗里德曼试验
  • 柯克霍夫方法

感兴趣的可以自行查阅;(其实是博主也还学,就学了点爆破;以后学了有空再总结)

这里介绍一下,如果维吉尼亚密码的key较短,可以采用爆破的方式得到明文。
因为英文字母一共26个,如果key长度为1,那就只有26种情况;key长度为2,有325种;到长度5有六万多种;再长一些就很难爆破了,可以用来解密一些简单的题目;

爆破脚本:

def vigenere_decrypt(ciphertext, key):
    decrypted_text = ""
    key_length = len(key)
    key_index = 0

    for char in ciphertext:
        if char.isalpha():
            is_upper = char.isupper()
            char = char.lower()
            key_char = key[key_index % key_length].lower()
            shift = (ord(char) - ord(key_char)) % 26
            decrypted_char = chr((ord(char) - shift) % 26 + ord('a'))
            if is_upper:
                decrypted_char = decrypted_char.upper()
            decrypted_text += decrypted_char
            key_index += 1
        else:
            decrypted_text += char

    return decrypted_text

def vigenere_brute_force(ciphertext, max_key_length):
    for key_length in range(1, max_key_length + 1):
        for key in itertools.product("abcdefghijklmnopqrstuvwxyz", repeat=key_length):
            key = "".join(key)
            decrypted_text = vigenere_decrypt(ciphertext, key)
            print(f"Key: {key}\nDecrypted Text: {decrypted_text}\n")

if __name__ == "__main__":
    import itertools

    ciphertext = "Your encrypted text goes here"  # 你的密文在这里替换
    max_key_length = 5  # 设置密钥的最大长度
    vigenere_brute_force(ciphertext, max_key_length)

栅栏密码

简述:
所谓栅栏密码,就是把要加密的明文分成N个一组,然后把每组的第1个字连起来,形成一段无规律的话。 不过栅栏密码本身有一个潜规则,就是组成栅栏的字母一般不会太多。(一般不超过30个,也就是一、两句话)。

  • 传统栅栏密码

    传统栅栏密码的密钥是密文长度的因数。
    如密文长度为n,加密密钥为x,则有n%x==0。且解密密钥即为n/x。

'''
遍历所有可能的栏数,并得到加/解密结果
'''
s = 'KYsd3js2E{a2jda}'
factors = [fac for fac in range(2, len(s)) if len(s)%fac == 0] #取得密文长度的所有因数
for fac in factors:
    flag = ''
    for i in range(fac): #按一定的步长取几组字符,并连接起来,这里组数就等于步长数
        flag += s[i::fac]
    print(str(fac)+'栏:'+flag)

在这里插入图片描述

  • W型栅栏密码

    W型栅栏密码是栅栏密码的变种,
    将明文按w型排列,然后将每一行的字母依次连起来组成密文,行数就是密钥。
    解密则同样画出这个w型图案,将每一列的字母依次连接起来组成明文。
    W型栅栏密码的密钥不只是密文长度的因数,任何小于密文长度大于1的整数都有可能。

'''
若知道栏数,则使用decode解密,若不知道,则使用crack_cipher遍历所有可能性
'''
def generate_w(string, n): 
    '''将字符排列成w型'''
    array = [['.']*len(string) for i in range(n)] #生成初始矩阵
    row = 0
    upflag = False
    for col in range(len(string)): #在矩阵上按w型画出string
        array[row][col] = string[col]
        if row == n-1:
            upflag = True
        if row == 0:
            upflag = False
        if upflag:
            row -= 1
        else:
            row += 1
    return array

def encode(string, n):
    '''加密'''
    array = generate_w(string, n)
    msg = []
    for row in range(n): #将每行的字符连起来
        for col in range(len(string)):
            if array[row][col] != '.':
                msg.append(array[row][col])
    return array, msg

def decode(string, n):
    '''解密'''
    array = generate_w(string, n)
    sub = 0
    for row in range(n): #将w型字符按行的顺序依次替换为string
        for col in range(len(string)):
            if array[row][col] != '.':
                array[row][col] = string[sub]
                sub += 1
    msg = []
    for col in range(len(string)): #以列的顺序依次连接各字符
        for row in range(n):
            if array[row][col] != '.':
                msg.append(array[row][col])
    return array, msg

def crack_cipher(string):
    '''破解密码'''
    for n in range(2,len(string)): #遍历所有可能的栏数
        print(str(n)+'栏:'+''.join(decode(string, n)[1]))

if __name__ == "__main__":
    string = "ccehgyaefnpeoobe{lcirg}epriec_ora_g"
    n = 5 #栏数

    #若不知道栏数,则遍历所有可能
    # crack_cipher(string)

    #若知道栏数
    array,msg = decode(string, n)
    # array,msg = encode(string, n)
    for i in array: print(i)
    print(''.join(msg))

在这里插入图片描述
在这里插入图片描述

其他古典密码

替换加密

1.ROT5/13/18/47
2.埃特巴什码(Atbash Cipher)
3.希尔密码(Hill Cipher)

移位加密

1.曲路密码(Curve Cipher)
2.列移位密码

在线网站:

http://www.atoolbox.net/Category.php?Id=27
http://www.hiencode.com/

文献来源:

https://zh.wikipedia.org/wiki/%E5%8F%A4%E5%85%B8%E5%AF%86%E7%A2%BC
https://www.cnblogs.com/lnjoy/p/railfence.html
https://ruoli-s.github.io/posts/a36c.html#toc-heading-3
https://zh.wikipedia.org

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1134595.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c语言从入门到实战——分支和循环

分支和循环 前言1. if语句1.1 if1.2 else1.3 分支中包含多条语句1.4 嵌套if1.5 悬空else问题 2. 关系操作符3. 条件操作符4. 逻辑操作符:&& , || , !4.1 逻辑取反运算符4.2 与运算符4.3 或运算符4.4 练习:闰年的判断4.5 短路 5. swit…

net::ERR_BLOCKED_BY_ADMINISTRATOR 问题定位与解决

本文基于谷歌浏览器调试手机应用 chrome://inspect/#devices 我有一个非常简单的广告页面,页面中有一张背景图,和一个按钮 他本应该是这样的 但实际上只显示了最下方的按钮,整个图片是空白的 页面仅在小米浏览器不显示背景图片,…

责任链模式应用案例

前几天系统商品折扣功能优化,同事采用了责任链模式重构了代码,现整理如下。 一、概念 责任链模式是为请求创建一个处理者对象的链条,所有处理者(除最末端)都含有下一个对象的引用从而形成一条处理链,该模…

怎么防止文件夹被删除、复制?

当文件夹中存放重要数据时,我们需要严格保护文件夹的安全,避免文件夹被复制、删除。那么,该怎么防止文件夹被删除、复制呢?下面我们就一起来了解一下。 ​文件夹隐藏 当文件夹被隐藏时,其他人无法发现文件夹&#xff…

Redis两种持久化方案RDB 和 AOF

Redis 作为一种非常流行的内存数据库,通过将数据保存在内存中,Redis 得以拥有极高的读写性能。但是一旦进程退出,Redis 的数据就会全部丢失。 为了解决这个问题,Redis 提供了 RDB 和 AOF 两种持久化方案,将内存中的数据…

排序算法-堆积树排序法(HeapSort)

目录 排序算法-堆积树排序法(HeapSort) 1、说明 2、算法分析 3、C代码 排序算法-堆积树排序法(HeapSort) 1、说明 堆积树排序法是选择排序法的改进版,可以减少在选择排序法中的比较次数,进而减少排序…

禾匠旧版对接微信小程序发货系统(发货信息管理 接口)

最近小程序如果是商家交易需要再小程序后台点击一下发货,特别麻烦,但是旧版的禾匠又没有这个功能,所以只能手动增加这个功能,但是每一个版本发货逻辑都不一样,大家只能自己手动去兼容一下,下面只是写了一个…

NewStarCTF2023week4-RSA Variation II

题目提示:"Schmidt Samoa" Schmidt-Samoa密码系统,像rabin加密一样,其安全性基于整数因式分解的难度。但 Rabin 解密时会得到四个解,而 Schmidt-Samor 得到的是唯一解。 N p*p*q,知道c、n、d 上脚本&…

【数据结构初阶】顺序表和链表(1)

顺序表和链表(1) 1.线性表2.顺序表2.1概念以及结构2.1.1静态顺序表2.1.2动态顺序表3.顺序表的实现3.1初始化内容3.2初始化函数3.3销毁函数3.4打印函数3.5扩容函数3.6尾插3.6尾删函数3.7头插函数3.8头删函数3.9查找函数3.10插入函数3.11删除函数3.12修改函…

Linux msend.pl配置

1.概述 1.1.说明​​​​​ 本文细描述Linux环境下(arm架构x64)基于perl的msend.pl配置,以实现根据msend.pl进行告警事件的发送。 1.2.环境说明 OS Version:RHEL7.6(arm架构x64) Perl Version: v5.16.3 1.3.msend.pl架构图 2.msend.pl配置 2.1.msend.pl配置 前提:以r…

基于机器学习与大数据的糖尿病预测 计算机竞赛

文章目录 1 前言1 课题背景2 数据导入处理3 数据可视化分析4 特征选择4.1 通过相关性进行筛选4.2 多重共线性4.3 RFE(递归特征消除法)4.4 正则化 5 机器学习模型建立与评价5.1 评价方式的选择5.2 模型的建立与评价5.3 模型参数调优5.4 将调参过后的模型重…

什么是React中的有状态组件(stateful component)和无状态组件(stateless component)?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

2022年09月 Python(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 表达式len(“学史明理增信 ,读史终生受益”) > len(" reading history will benefit you ")的结果是?( ) A: 0 B: True C: False D: 1 答案:C 中文字符串"…

Spark【Spark Streaming】

1、基本数据源 1.1、文件流 在spark Shell 下运行: [lyhhadoop102 spark-yarn-3.2.4]$ spark-shell Setting default log level to "WARN". To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel). 2022-09-…

自动驾驶,从“宠儿”走进“淘汰赛”

从“一步到位”到场景、技术降维。从拼落地路径,到拼雷达、算力,再到如今的性价比之争,自动驾驶似乎变得愈发“接地气”。 作者|斗斗 编辑|皮爷 出品|产业家 比起去年,黄文欢和张放今年显得更加忙碌。 “自动驾驶赛道&…

Redis 配置文件(redis.conf)中文注释及说明

文章目录 一、概述二、觉见基础配置1.1 导入另一个配置文件1.2 添加Redis扩展1.3 绑定Redis服务在那些网卡上,也就是远程可以通过那个的IP地址访问。1.2 指定Redis服务监听端口1.2 最大分配内容大小1.2 后台服务方式运行1.2 日志记录文件1.2 添加扩展 三、完整配置文…

网络协议--DNS:域名系统

14.1 引言 域名系统(DNS)是一种用于TCP/IP应用程序的分布式数据库,它提供主机名字和IP地址之间的转换及有关电子邮件的选路信息。这里提到的分布式是指在Internet上的单个站点不能拥有所有的信息。每个站点(如大学中的系、校园、…

XTU-OJ 1227-Robot

题目描述 假设在一个XOY坐标的平面上,机器人一开始位于原点,面向Y轴正方向。 机器人可以执行向左转,向右转,向后转,前进四个指令。 指令为 LEFT:向左转RIGHT:向右转BACK:向后转FORWORD n:向前走n(1≤n≤100)个单位 现在…

边缘计算:云计算的延伸

云计算已经存在多年,并已被证明对大大小小的企业都有好处;然而,直到最近边缘计算才变得如此重要。它是指发生在网络边缘的一种数据处理,更接近数据的来源地。 这将有助于提高效率并减少延迟以及设备和云之间的数据传输成本。边缘…

金融领域:怎么保持电力系统连续供应?

银行作为金融领域的关键机构,依赖于高度可靠的电力供应,以保持银行操作的连续性。在电力中断或电力质量问题的情况下,银行可能面临严重的风险,包括数据丢失、交易中断和客户满意度下降。 UPS监控系统在这一背景下变得至关重要&…