crypto必知必会

最近参加了个ctf比赛,在i春秋,南邮方面刷了一些crypto密码学题目,从中也增长了不少知识,在此关于常见的密码学知识做个小总结!

Base编码

Base编码中用的比较多的是base64,首先就说一下Base64编码方式

  1. 将字符串以字节的方式进行分组,每三个字节一组,每组共24个二进制位。(不满3个字节的用‘=’填充)
  2. 对以上的分组,每一组又分为4个小组,即24bits分为4小组,每小组6个bits。
  3. 对每小组前加上00,将其拓展成32个二进制(4个字节)
  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转换表

RFC 4648 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转换表

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)

  1. import gmpy2
  2. import binascii
  3. n =
  4. p =
  5. q =
  6. c =
  7. e =
  8. phi = (p-1) * (q-1)
  9. d = gmpy2.invert(e, phi)
  10. n = p * q
  11. print(pow(c, d, n))
  12. 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。

  1. # -*- coding: utf-8 -*-
  2. from string import ascii_uppercase, ascii_lowercase
  3. __author__ = 'lateink'
  4. cryptoMessage = 'synt{5pq1004q-86n5-46q8-o720-oro5on0417r1}'
  5. message = ''
  6. for i in cryptoMessage:
  7. if i in ascii_uppercase:
  8. x = (ord(i) - ord('A') + 13) % 26
  9. message += chr(x + ord('A'))
  10. elif i in ascii_lowercase:
  11. x = (ord(i) - ord('a') + 13) % 26
  12. message += chr(x + ord('a'))
  13. else:
  14. message += i
  15. 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...

crypto必知必会的更多相关文章

  1. 读书笔记汇总 - SQL必知必会(第4版)

    本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...

  2. 读书笔记--SQL必知必会--建立练习环境

    书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL in 10 Minutes - Fourth Edition> MyS ...

  3. 读书笔记--SQL必知必会12--联结表

    12.1 联结 联结(join),利用SQL的SELECT在数据查询的执行中联结表. 12.1.1 关系表 关系数据库中,关系表的设计是把信息分解成多个表,一类数据一个表,各表通过某些共同的值互相关联 ...

  4. 读书笔记--SQL必知必会18--视图

    读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...

  5. 《MySQL 必知必会》读书总结

    这是 <MySQL 必知必会> 的读书总结.也是自己整理的常用操作的参考手册. 使用 MySQL 连接到 MySQL shell>mysql -u root -p Enter pas ...

  6. 《SQL必知必会》学习笔记(一)

    这两天看了<SQL必知必会>第四版这本书,并照着书上做了不少实验,也对以前的概念有得新的认识,也发现以前自己有得地方理解错了.我采用的数据库是SQL Server2012.数据库中有一张比 ...

  7. SQL 必知必会

    本文介绍基本的 SQL 语句,包括查询.过滤.排序.分组.联结.视图.插入数据.创建操纵表等.入门系列,不足颇多,望诸君指点. 注意本文某些例子只能在特定的DBMS中实现(有的已标明,有的未标明),不 ...

  8. .NET程序员项目开发必知必会—Dev环境中的集成测试用例执行时上下文环境检查(实战)

    Microsoft.NET 解决方案,项目开发必知必会. 从这篇文章开始我将分享一系列我认为在实际工作中很有必要的一些.NET项目开发的核心技术点,所以我称为必知必会.尽管这一系列是使用.NET/C# ...

  9. 0005 《SQL必知必会》笔记01-SELECT语句

    1.SELECT基本语句: SELECT 字段名1,···,字段名n FROM 表名 2.检索所有字段,用"*"替换字段名,这会导致效率低下 SELECT * FROM 表名; 3 ...

随机推荐

  1. mysql-proxy实现读写分离

    其中Amoeba for MySQL也是实现读写分离 环境描述:操作系统:CentOS6.5 32位主服务器Master:192.168.179.146从服务器Slave:192.168.179.14 ...

  2. hibernate学习之持久化对象

    Hibernate对其持久化对象实现了缓存管理,来提高系统性能,Hibernate支持两级缓存管理,一级缓存 是由Session提供的,因此它只存在于Session的生命周期中,是Session所内置 ...

  3. [poj2185]Milking Grid_KMP

    Milking Grid poj-2185 题目大意:给出一个字符矩阵,求最小覆盖矩阵(可以残余). 注释:$1\le R\le 10^5$,$1\le C \le 75$ 想法:和bzoj1355不 ...

  4. 如何解决js递归里面出现的堆栈溢出

    16.下面的递归代码在数组列表偏大的情况下会导致堆栈溢出.在保留递归模式的基础上,你怎么解决这个问题? var list = readHugeList(); var nextListItem = fu ...

  5. [福大软工] W班 评测作业对应表

  6. 网络1711c语言第3次作业总结

    作业地址:https://edu.cnblogs.com/campus/jmu/JMUC--NE17111712/homework/1166 总结 1.评分细则 评分注意事项 注意用Markdown语 ...

  7. NO.7 项目需求分析

    NO.7 项目需求分析 由于我们组的第一次选题并没有通过,所以我们又重新选择了一个题目--高校学生征信系统. 结合老师的作业要求,我们对该项目进行了详细的需求分析,软件需求规格说明书地址请点击这里.软 ...

  8. hdu 4553 约会安排

    约会安排 http://acm.hdu.edu.cn/showproblem.php?pid=4553 Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  9. PHP之this和self

    self在对象中自己调用自己使用 $this在实例化后使用$this方法 在访问PHP类中的成员变量或方法时,如果被引用的变量或者方法被声明成const(定义常量)或者static(声明静态),那么就 ...

  10. Python内置函数(33)——any

    英文文档: any(iterable) Return True if any element of the iterable is true. If the iterable is empty, re ...