标签搜索

CTF-Crypto

Augenstern
2024-06-09 / 0 评论 / 2 阅读 / 正在检测是否收录...

密码学(Cryptography)一般可分为古典密码学现代密码学。一般来说,密码设计者的基本想法是确保密码框架的。

  • 保密性
  • 完整性
  • 可用性
  • 不可否认性

其中,前三者又称为 CIA 三元组。

古典加密

古典密码是指在现代密码学发展之前使用的一类加密方法。它们通常基于简单的数学原理和替换、重排、置换等操作来对明文进行加密。

置换

学习视频 杨兰娟:古典密码-置换密码

把明文中的字母重新排列,字母本身不变,但其位置改变了,这样编成的密码称为置换密码。

  • 栅栏技术:按照对角线顺序写出明文,并以行的顺序读出
明文:meet after the toga party
栅栏数:2
m e a t r h t g p r y
e t f e t e o a a t
密文: MEATRHTGPRYETFETEOAAT
  • 列置换:将明文按照行填写在一个矩形中,密文则是以预定的顺序按列读取生成
明文:shesellsseashellsbytheseashore
密钥:351642
矩阵
3 5 1 6 4 2
s h e s e l
l s s e a s
h e l l s b
y t h e s e
a s h o r e
按照密钥顺序读取列,则为ESLHH LSBEE
SLHYA EASSR HSETS SELEO
  • 周期置换:将明文串P按照固定长度m分组,然后对每组中的子串按照1,2,...m的某个置换重新排列得到密文。
加密密钥(置换)K=
1 2 3 4 5 6
3 5 1 6 4 2
明文:shesellsseashellsbytheseashore
分块:shesel lsseas hellsb ythese ashore
根据函数f重新排列
以shesel为例
s->3
h—>5
e->1
s->6
e->4
l->2
最终顺序为ELSEHS,其他块也按照这个方法重新排列
  • 多次列置换:将列置换得到的密文再进行1次或多次列置换,方法与列置换一致

替换

学习视频 杨兰娟:古典密码-替换密码

替换密码是将明文字符替换成其他字母、数字或符号。

  • 凯撒密码:将字母向后偏移3位,如果是移13位则为ROT13加密
    a->D
    b->E
    ...
    x->A
    y->B
    z->C
明文:attack
密文:DWWDFN
  • 维吉尼亚密码:基于串的替换密码,密钥是由多于一个的字符串所组成的串
    Ci = (Pi+ki mod m) mod 26
明文:T  H  E  B  U  T  C  H  E  R
密钥:B  I  G  B  I  G  B  I  G  B
序号:
19 7  4  1  20 19 2  7  4  17
1  8  6  1  8  6  1  8  6  1
密文:UPKCCZDPKS
  • 弗纳姆密码:假定消息是长为n的比特串,密钥也是长为n的比特串
    m=b1b2...bn∈{0,1}n
    k =k1k2...knu{0,1}n
    加密: Ci = Pi⨁Ki
    解密: Pi = Ci⨁Ki
  • Playfair密码:1854 年由英国人查尔斯·惠斯通发明,基本算法如下:

    1. 选取一串英文字母,除去重复出现的字母,将剩下的字母逐个逐个加入 5 × 5 的矩阵内,剩下的空间由未加入的英文字母依 a-z 的顺序加入。注意,将 q 去除,或将 i 和 j 视作同一字。
    2. 将要加密的明文分成两个一组。若组内的字母相同,将 X(或 Q)加到该组的第一个字母后,重新分组。若剩下一个字,也加入 X 。
    3. 在每组中,找出两个字母在矩阵中的地方。

      • 若两个字母不同行也不同列,在矩阵中找出另外两个字母(第一个字母对应行优先
      • 使这四个字母成为一个长方形的四个角。
      • 若两个字母同行,取这两个字母右方的字母(若字母在最右方则取最左方的字母)
      • 若两个字母同列,取这两个字母下方的字母(若字母在最下方则取最上方的字母)。

新找到的两个字母就是原本的两个字母加密的结果。

密钥:telegram
矩阵:
T   E   L   G   R
A   M   B   C   D
F   H  I/J  K   N
O   P   Q   S   U
V   W   X   Y   Z
明文:NEXT TIME
分组:NE XT TI ME
画矩阵:
NE--> HR
XT--> VL
TI--> LF
ME--> HM
  • 希尔密码:希尔密码(Hill)使用每个字母在字母表中的顺序作为其对应的数字,即A=0,B=1,C=2 等,然后将明文转化为 n 维向量,跟一个 n × n 的矩阵相乘,再将得出的结果模 26。注意用作加密的矩阵(即密匙)在 $\mathbb{Z}^n_{26}$(我的markdown不支持latex) 必须是可逆的,否则就不可能解码。只有矩阵的行列式和26互质,才是可逆的。
明文:ACT
矩阵:
0
2
19
密钥:
6   24   1
13  16   10
20  17   15
计算行列式发现不为0,可逆
明文矩阵乘密钥矩阵mod26得到密文矩阵
15
14
7
所以对应的密文为POH

还有其他类型密码,这里简单列举一下,就不详细介绍了。

  • 培根密码:用5位二进制表示,A代表0,B代表1
  • 曲路密码:是一种换位密码,需要事先双方约定密钥(也就是曲路路径)
  • 列移位加密:一种比较简单,易于实现的换位密码,通过一个简单的规则将明文打乱混合成密文
  • 01248密码:该密码又称为云影密码,使用 0,1,2,4,8 这几个数字,其中 0 用来表示间隔,其他数字以加法可以表示出 如:28=10,124=7,18=9,再用 1->26 表示 A->Z。可以看出该密码有以下特点:只有 0,1,2,4,8
  • JSFuck:JSFuck 可以只用 6 个字符 []()!+ 来编写 JavaScript 程序。
[][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]][([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+[[!+[]+!+[]+!+[]]]]+([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]]]+([][[]]+[])[+[[+!+[]]]]+(![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[+!+[]]]]+([][[]]+[])[+[[+[]]]]+([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]((![]+[])[+[[+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]+(!![]+[])[+[[+[]]]]+([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+[[+!+[]]]+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+[+!+[]]+([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+[[+!+[]]]+[[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]]])()
  • BrainFuck:是一种极小化的计算机语言
++++++++++[>+++++++>++++++++++>+++>+<<<<-]
>++.>+.+++++++..+++.>++.<<+++++++++++++++.
>.+++.------.--------.>+.>.
  • 猪圈密码:一种以格子为基础的简单替代式密码
  • 舞动的小人密码:这种密码出自于福尔摩斯探案集。每一个跳舞的小人实际上对应的是英文二十六个字母中的一个,而小人手中的旗子则表明该字母是单词的最后一个字母,如果仅仅是一个单词而不是句子,或者是句子中最后的一个单词,则单词中最后一个字母不必举旗。
  • 键盘密码:这种有很多种,举一个最简单的,观察自己的电脑键盘,给出密文ESXF,得到明文D,因为ESXF围住了D

现代加密

对称加密

  • DES:DES全称为Data Encryption Standard,是典型的块加密,其基本信息如下:
    1、使用64位密钥中的56位,剩余的8位要么丢弃,要么作为奇偶校验位
    2、输入64位
    3、输出64位
    4、明文经过16轮迭代得到密文
  • AES:AES全称为Advanced Encryption Standard,是典型的块加密,被设计来取代DES。其基本信息如下:
    分组长度和密钥长度均可变,可以有以下几种数值:
    128比特
    192比特
    256比特
    经过N轮加密后得到密文,轮数依赖于密钥长度:
    128比特密钥对应10轮
    192比特密钥对应12轮
    256比特密钥对应14轮

非对称加密

  • RSA
    RSA算法的具体描述如下:
    1、选择两个大素数p和q,计算N=p*q。
    2、计算φ(N)=(p-1)*(q-1)。
    3、选择一个整数e,1<e<φ(N),且e与φ(N)互质。
    4、计算d,使得e*d=1 mod φ(N)。
    5、将N和e作为公钥,N和d作为私钥。
    加密数据时,将明文转换为整数M,计算C=M^e mod N。
    解密数据时,将密文转换为整数C,计算M=C^d mod N。

哈希函数

  • MD5
    MD5的输入输出如下:
    输入: 任意长的消息,512比特长的分组。
    输出: 160比特的消息摘要。
  • SHA1
    SHA1的输入输出如下:
    输入: 任意长的消息,分为 512 比特长的分组。首先在消息右侧补比特 1,然后再补若干个比特 0,直到消息的比特长度满足对 512 取模后余数是 448,使其与 448 模 512 同余。
    输出: 160 比特的消息摘要。
0

评论 (0)

取消