密码学(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...kn∈u{0,1}n
加密: Ci = Pi⨁Ki
解密: Pi = Ci⨁Ki Playfair密码:1854 年由英国人查尔斯·惠斯通发明,基本算法如下:
- 选取一串英文字母,除去重复出现的字母,将剩下的字母逐个逐个加入 5 × 5 的矩阵内,剩下的空间由未加入的英文字母依 a-z 的顺序加入。注意,将 q 去除,或将 i 和 j 视作同一字。
- 将要加密的明文分成两个一组。若组内的字母相同,将 X(或 Q)加到该组的第一个字母后,重新分组。若剩下一个字,也加入 X 。
在每组中,找出两个字母在矩阵中的地方。
- 若两个字母不同行也不同列,在矩阵中找出另外两个字母(第一个字母对应行优先
- 使这四个字母成为一个长方形的四个角。
- 若两个字母同行,取这两个字母右方的字母(若字母在最右方则取最左方的字母)
- 若两个字母同列,取这两个字母下方的字母(若字母在最下方则取最上方的字母)。
新找到的两个字母就是原本的两个字母加密的结果。
密钥: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)