关键词:
crypto必知必会
最近参加了个ctf比赛,在i春秋,南邮方面刷了一些crypto密码学题目,从中也增长了不少知识,在此关于常见的密码学知识做个小总结!
Base编码
Base编码中用的比较多的是base64,首先就说一下Base64编码方式
- 将字符串以字节的方式进行分组,每三个字节一组,每组共24个二进制位。(不满3个字节的用‘=’填充)
- 对以上的分组,每一组又分为4个小组,即24bits分为4小组,每小组6个bits。
- 对每小组前加上00,将其拓展成32个二进制(4个字节)
- 每小组将其转化为ascii字符,根据以下图表进行转换
base64转换表
码值 | 字符 | 码值 | 字符 | 码值 | 字符 | 码值 | 字符 | |||
---|---|---|---|---|---|---|---|---|---|---|
0 | A | 16 | Q | 32 | g | 48 | w | |||
1 | B | 17 | R | 33 | h | 49 | x | |||
2 | C | 18 | S | 34 | i | 50 | y | |||
3 | D | 19 | T | 35 | j | 51 | z | |||
4 | E | 20 | U | 36 | k | 52 | 0 | |||
5 | F | 21 | V | 37 | l | 53 | 1 | |||
6 | G | 22 | W | 38 | m | 54 | 2 | |||
7 | H | 23 | X | 39 | n | 55 | 3 | |||
8 | I | 24 | Y | 40 | o | 56 | 4 | |||
9 | J | 25 | Z | 41 | p | 57 | 5 | |||
10 | K | 26 | a | 42 | q | 58 | 6 | |||
11 | L | 27 | b | 43 | r | 59 | 7 | |||
12 | M | 28 | c | 44 | s | 60 | 8 | |||
13 | N | 29 | d | 45 | t | 61 | 9 | |||
14 | O | 30 | e | 46 | u | 62 | + | |||
15 | P | 31 | f | 47 | v | 63 | / |
用处: 一般不用于加密,主要把二进制数转成普通字符串进行网络传输,因为某些二进制字符在传输协议属于控制字符,不能直接传输。
而base32与base64类似。
base32转换表
值 | 符号 | 值 | 符号 | 值 | 符号 | 值 | 符号 | |||
---|---|---|---|---|---|---|---|---|---|---|
0 | A | 8 | I | 16 | Q | 24 | Y | |||
1 | B | 9 | J | 17 | R | 25 | Z | |||
2 | C | 10 | K | 18 | S | 26 | 2 | |||
3 | D | 11 | L | 19 | T | 27 | 3 | |||
4 | E | 12 | M | 20 | U | 28 | 4 | |||
5 | F | 13 | N | 21 | V | 29 | 5 | |||
6 | G | 14 | O | 22 | W | 30 | 6 | |||
7 | H | 15 | P | 23 | X | 31 | 7 | |||
填充 | = |
Base32将任意字符串按照字节进行切分,并将每个字节对应的二进制值(不足8比特高位补0)串联起来,按照5比特一组进行切分,并将每组二进制值转换成十进制来对应32个可打印字符中的一个。
base16转换表
值 | 编码 | 值 | 编码 |
---|---|---|---|
0 | 0 | 8 | 8 |
1 | 1 | 9 | 9 |
2 | 2 | 10 | A |
3 | 3 | 11 | B |
4 | 4 | 12 | C |
5 | 5 | 13 | D |
6 | 6 | 14 | E |
7 | 7 | 15 | F |
Base16编码使用16个ASCII可打印字符(数字0-9和字母A-F)对任意字节数据进行编码。Base16先获取输入字符串每个字节的二进制值(不足8比特在高位补0),然后将其串联进来,再按照4比特一组进行切分,将每组二进制数分别转换成十进制,在下述表格中找到对应的编码串接起来就是Base16编码。可以看到8比特数据按照4比特切分刚好是两组,所以Base16不可能用到填充符号“=”。
需要注意的是Base各种编码秘文的区分。
比如base16没有F之后的字母以及没有[a-zG-Z],base32没有[a-z0-1+/],快速区分base编码有助于解码。
python3里实现base64加解密有 base64.b64decode()等各种方法。
RSA解密
关于RSA加密原理请看这里传送门:RSA算法原理(一)
以及RSA简单理解请看这里传送门:RSA算法原理(二)
这里我简单说说CTF题目中的RSA
一般RSA题目会给出n,e,c,有时候也会给出p,q(c一般就是指密)
一般计算过程是先计算phi,有了phi和e可以求出d(密钥)再根据c,d,n就可以求得明文!
具体python3实现代码(需要安装第三方库gmpy2)
import gmpy2
import binascii
n =
p =
q =
c =
e =
phi = (p-1) * (q-1)
d = gmpy2.invert(e, phi)
n = p * q
print(pow(c, d, n))
print(binascii.a2b_hex(hex(pow(c, d, N))[2:]))
不过很多时候会只给出n而没有给出p,q这种情况要求通过n而求出q和p。这里提供一个可以分解n的网站
而且要注意e=1或者2,3这种情况,仔细看传送门:RSA算法原理(二)你会发现如果e=1,明文plain = c + n*k(k=0,1,2,3....),这种情况在题目中也遇到过,要注意!
恺撒密码
基本思想: 通过把字母移动一定的位数来实现加解密。如果移动的位数是13,加解密的算法一样。如下一个简单demo。
# -*- coding: utf-8 -*-
from string import ascii_uppercase, ascii_lowercase
__author__ = ‘lateink‘
cryptoMessage = ‘synt5pq1004q-86n5-46q8-o720-oro5on0417r1‘
message = ‘‘
for i in cryptoMessage:
if i in ascii_uppercase:
x = (ord(i) - ord(‘A‘) + 13) % 26
message += chr(x + ord(‘A‘))
elif i in ascii_lowercase:
x = (ord(i) - ord(‘a‘) + 13) % 26
message += chr(x + ord(‘a‘))
else:
message += i
print(message)
变异恺撒
变异恺撒并不是简单把字母移动一定的位数,而是每个字母根据密码字典进行加密,这种必须要有密码字典才能解密。如果没有密码字典,如果爆破的话,数量级大概是26!但是一般情况并不会真的通过爆破去获取密码字典。一般密文是英文单词,而英文单词的话,可以通过词频分析这攻击手段破解。这里提供一个词频分析解密网站quipquip.
奇偶位变化
恺撒密码中有一种套路是,字符串的奇数位加,偶数位减(或者相反),如果解密过程中没什么头绪的时候不妨试试这种方式。
md5
md5采用hash算法加密数据,不可逆,不能从密文推算出明文。有些网站提供md5解密,大概都是使用一个比较大密码字典爆破md5密文,搜索密码字典里是否有对应的密码加密后与要解密的密文相等。感觉没啥用。
密文特征
32个或者16个16进制字符串
其他奇奇怪怪的加密
猪圈密码
‘a‘: ‘j‘, ‘b‘: ‘k‘, ‘c‘: ‘l‘, ‘d‘: ‘m‘, ‘e‘: ‘n‘, ‘f‘: ‘o‘, ‘g‘: ‘p‘, ‘h‘: ‘q‘, ‘i‘: ‘r‘,
‘s‘: ‘w‘, ‘v‘: ‘z‘, ‘t‘: ‘x‘, ‘u‘: ‘y‘
猪圈密码就是根据上面密文字典加解密
异或
ctf题中还有一种常见的密文解密是用到疑惑,需要明文和密文异或才能得到一串有意义的字符串。
目前遇到的CTF中所需要的加解密总结大致如此,之后遇到新的问题新的套路再更新
continue updating...
hive必知必会(代码片段)
hive: 基于hadoop,数据仓库软件,用作OLAPOLAP:onlineanalyzeprocess 在线分析处理OLTP:onlinetransactionprocess在线事务处理 事务: ACID A:atomic 原子性 C:consistent 一致性 I:isolation 隔离性 D:durability 持久性 1读未提交 脏读 //事务... 查看详情
mysql必知必会(代码片段)
姊妹篇——Hive必知必会(数据仓库):https://hiszm.blog.csdn.net/article/details/119907136文章目录第一章:数据库基础基本概念什么是SQL第二章:MySQL简介第三章:了解数据库和表第四章:检索数据SELECT语句第五章:... 查看详情
springmvc--必知必会(代码片段)
SpringMVC基于模型--视图--控制器(Model-View-Controller,MVC)模式实现,属于SpringFrameWork的后续产品,已经融合在SpringWebFlow里面。它通过一套注解,让一个简单的Java类成为处理请求的控制器,而无需实现任何接口。同时它还支持... 查看详情
h5系列之history(必知必会)(代码片段)
H5系列之History(必知必会)目录概念兼容性属性方法H5方法概念理解HistoryApi的使用方式目的是为了解决哪些问题作用:ajax获取数据时,可以改变历史记录,从而可以使用浏览器的后退和前进。【】规范地址:http://www.w3.org/TR/html5... 查看详情
scala必知必会(代码片段)
文章目录入门概述安装JavaVSScalaval和var基本数据类型lazy在Scala中的应用开发工具IDEAMaven函数方法定义默认参数命名参数可变参数条件语句循环语句面向对象概述类的定义和使用抽象类伴生类和伴生对象case和trait集合数组ListSetMapOpt... 查看详情
必知必会的设计原则——合成复用原则(代码片段)
设计原则系列文章 必知必会的设计原则——单一职责原则必知必会的设计原则——开放封闭原则必知必会的设计原则——依赖倒置原则必知必会的设计原则——里氏替换原则必知必会的设计原则——接口隔离原则必知必... 查看详情
读书笔记sql必知必会(代码片段)
章节标题页数进度完成时间1了解SQL1~9100%2022-04-08 2检索数据SELECT10~22100%2022-04-103排序检索数据ORDERBY23~30100%2022-04-114过滤数据WHERE31~38100%2022-04-115高级数据过滤(组合WHERE,NOT,IN)39~49100%2022-04-166用 查看详情
大数据必知必会:hadoop单机环境安装(代码片段)
(大数据必知必会:Hadoop(1)单机环境安装)安装前准备操作系统准备本次安装采用的操作系统是Ubuntu20.04。更新一下软件包列表。sudoapt-getupdate安装Java8+使用命令安装Java8。sudoapt-getinstall-yopenjdk-8-jdk配置环境变量。vi~/.bashrcexportJAVA... 查看详情
大数据必知必会:hadoop高可用集群安装(代码片段)
(大数据必知必会:Hadoop(4)高可用集群安装)安装前准备高可用集群环境下,至少需要3台服务器,这里准备5台。IP地址主机名称角色10.0.0.5node1JournalNode、NameNode、ResourceManager10.0.0.6node2JournalNode、NameNode、ResourceManager10.0.0.7node3Journa... 查看详情
13条必知必会&&测试(代码片段)
1.13条必知必会<1>all():查询所有结果<2>filter(**kwargs):它包含了与所给筛选条件相匹配的对象<3>get(**kwargs):返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛... 查看详情
大数据linux必知必会-02(代码片段)
8网络配置8.1静态ip设置配置文件地址:/etc/sysconfig/network-scripts/ifcfg-ens33修改如下原来改成reboot重启下生效8.2修改linux主机名修改配置文件下的主机名/etc/hostname[root@hadoop~]#vim/etc/hostname修改映射文件/etc/sysconfig/network[root@hadoop~]#vim/etc 查看详情
mysql必知必会(初级篇)(代码片段)
mysql1.基本概念2.SQL语言2.1DCL(数据控制语言)2.1.1创建用户2.1.2使用grant命令给用户授权2.1.3使用revoke命令撤销权限2.2DDL(数据定义语言)2.2.1mysql常用约束类型2.2.2使用alter命令修改表结构2.2.3使用drop命令删除表2.3DML(数据操纵语言)2.3.1使... 查看详情
大数据必知必会:hadoop伪分布式安装(代码片段)
(大数据必知必会:Hadoop(2)伪分布式安装)安装前准备操作系统准备本次安装采用的操作系统是Ubuntu20.04。更新一下软件包列表。sudoapt-getupdate安装Java8+使用命令安装Java8。sudoapt-getinstall-yopenjdk-8-jdk配置环境变量。vi~/.bashrcexportJAVA... 查看详情
promise必知必会经典题(代码片段)
题目转载来自:https://github.com/nswbmw/node-in-debugging/blob/master/3.1Promise.md如何写出清晰优雅的代码也是调试重要的一部分,而在过去很长一段时间内,JavaScript最令人吐槽的就是回调地狱(callbackhell)了。先看一段... 查看详情
必知必会-使用kafka之前要掌握的知识(代码片段)
必知必会系列之kafka前记kafka特性kafka实现顺序写高速读概念介绍分区和分组队列还是分发消费方式API前记消息队列是分布式系统架构中不可或缺的基础组件,它主要负责服务间的消息通信和数据传输。市面上有很多的开源消... 查看详情
es6必知必会——generator函数(代码片段)
Generator函数1.Generator函数是ES6提供的一种异步编程解决方案,语法行为与传统函数完全不同,通常有两个特征:function关键字与函数名之间有一个星号;函数体内部使用yield表达式,定义不同的内部状态//一个简单的Generator函数func... 查看详情
elasticsearch必知必会的干货知识二:es索引操作技巧(代码片段)
该系列上一篇文章《Elasticsearch必知必会的干货知识一:ES索引文档的CRUD》讲了如何进行index的增删改查,本篇则侧重讲解说明如何对index进行创建、更改、迁移、查询配置信息等。仅创建索引:PUTindexPUT/index添加字段设置(mappings... 查看详情
android必知必会-app常用图标尺寸规范汇总(代码片段)
1.程序启动图标(iconlauncher) 放在mipmap-*dpi下,文件名为ic_launcher.pngL DPI(LowDensityScreen,120DPI),其图标大小为36x36pxM DPI(MediumDensityScreen,160DPI),其图标大小为48x48pxH DPI(HighDensityScr 查看详情