CRYPTO 密码学-笔记

一、古典密码学

1.替换法:用固定的信息,将原文替换成密文

        替换法的加密方式:一种是单表替换,另一种是多表替换

        单表替换:原文和密文使用同一张表

        abcde---》sfdgh

        多表替换:有多涨表,原文和密文进行对比

        表单1:abcde---》sfdgh  表单2:abcde---》chfhk   表单3:abcde---》jftou

       原文:adc

        密钥:312

        密文:jgf 

2.位移法:对照字母在字母表上的位置,进行移动

        凯撒加密:

               abce---》向后位移量为2---》cefg

加密:

str=input("请输入明文:")
n=int(input("请输入密钥:"))
str_encrypt=""
for letter in str:
    if letter==" ":  #遇到空格选择不加密
        letter_encrypt=" "
    else:
        letter_encrypt=chr((ord(letter)-ord("a") +n) %26 +ord("a"))
    str_encrypt += letter_encrypt
print("密文为:",str_encrypt)

解密:

str=input("请输入密文:")
n=int(input("请输入密钥:"))
str_decrypt=""
for word in str:
    if word==" ":  #遇到空格选择不解密
        word_decrypt=" "
    else:
        word_decrypt=chr((ord(word)-ord("A") -n) %26 +ord("A"))
    str_decrypt = str_decrypt+word_decrypt
print("明文为:",str_decrypt)

 暴力破解凯撒:

LETTERS="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
LETTERS1="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LETTERS2="abcdefghijklmnopqrstuvwxyz"

text=input("请输入密文:")
for key in range(len(LETTERS)):
    str=""
    for i in text:
        if i in LETTERS:
            if i.isupper():  #密文字母为大写
                num = LETTERS1.find(i)  #在字母里搜索到密文字符的位置
                num = num - key
                if num<0:
                    num = num + len(LETTERS1)
                str = str + LETTERS1[num]  #将解密后字符追加到字符串末尾
            elif i.islower():  #密文字母为小写
                num = LETTERS2.find(i)  #在字母里搜索到密文字符的位置
                num = num - key
                if num<0:
                    num = num + len(LETTERS2)
                str = str + LETTERS2[num]  #将解密后字符追加到字符串末尾
        else:
            str = str + i  #如果密文中内容不在字母里则不解密,直接追加
    print('第%d把钥匙的结果是%s' %(key, str))  #显示每一个可能的值

3.凯撒密码的破解方法:

        频率分析法:在不确定密钥的情况下,根据明文中出现频率最高的单词和密文中出现频率最高的单词进行比较,来获得密钥

统计密文中字符出现频率:

def count_each_char_sort_value(str):
    dict = {}
    for i in str:
        dict[i] = dict.get(i, 0) + 1
    
    # sorted 方法会生成一个排序好的容器
    # operator.itemgetter(1)  获取字典第一维的数据进行排序
    # reverse 表示倒序排列
    dict=sorted(dict.items(),key= operator.itemgetter(1),reverse=True)
    return dict
 
if __name__ == "__main__":
    res = count_each_char_sort_value("abdefdcsdf")
    print(res)

英文中单词e出现的频率最高,出现最高的字符的ASCII码与e的ASCII的差值就是key

通过频率分析法得到的密钥,是对大篇幅的密文进行的,密文越长解密的明文越准确

 4.栅栏密码

栅栏密码将原始字符串分成N个一组,然后把每组的第一个字连接起来,形成一段无规律的话

以2栏栅栏加密为例:

原始明文:Do you know People fall in love with sunsets when they are sad.

去空格并分组:Do yo uk no wP eo pl ef al li nl  ov ew it hs un se ts wh en th ey ar es ad .(单独一组)

第一组:Dyunwepealnoeihustweteaea.

第二组:ookoPolflilvwtsneshnhyrsd

密文:Dyunwepealnoeihustweteaea.ookoPolflilvwtsneshnhyrsd

5.ROT5/13/18/47

ROT5/13/18/47编码是具有可逆性的,可以自我解密,主要用于快速浏览或者机器读取

ROT13是rotate by 13 places的简写,意思是旋转13个位置。rot13是凯撒密码的一个特例,即k=13.

ROT5/13/18/47加密和解密算法完全相同。

ROT5:只对数字进行加密,用当前数字往前数的第5个数字替换当前数字

ROT18:这是个异类,本来没有,它是rot5和rot13的组合,为了更好的称呼,命名为rot18

ROT47:对数字、字母、常用符号加密,按ASCII值进行位置替换(可显示的ascii共有94个),将字符ascii往前数的第47位就是对应的替换字符

例题:synt{ebg13_vf_sha}

总结:

凯撒加密:结果只有英文字母,因为是按字母表位置替换的

rot13:结果也只有英文字母被替换

rot5:只有数字被替换

rot47:字符也被替换

二、近代密码学

对称加密:

采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。
示例
        我们现在有一个原文3要发送给B
        设置密钥为108, 3 * 108 = 324, 将324作为密文发送给B
        B拿到密文324后, 使用324/108 = 3 得到原文
常见加密算法

  • DES : Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。
  • AES : Advanced Encryption Standard, 高级加密标准 .在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。

特点

  • 加密速度快, 可以加密大文件
  • 密文可逆, 一旦密钥文件泄漏, 就会导致数据暴露
  • 加密后编码表找不到对应字符, 出现乱码
  • 一般结合Base64使用,解决乱码的问题

 1.DES加密

使用的密钥key(密钥长64位),需要是8字节

明文按64位进行分组

2.AES加密

是DES的高级版

使用的密钥key(密钥长128位),需要是16字节

DES加密和AES加密都属于对称加密

3.base64

在DES加密和AES加密的过程中,加密的编码会出现负数,在ascii码表中找不到对应的字符,就会出现乱码。为了解决乱码的问题,一般结合base64使用

所谓Base64,即是说在编码过程中使用了64种字符:大写A到Z、小写a到z、数字0到9、“+”和“/”

Base58是Bitcoin(比特币)中使用的一种编码方式,主要用于产生Bitcoin的钱包地址 相比Base64,Base58不使用数字"0",字母大写"O",字母大写"I",和字母小写"i",以及"+"和"/"符号

Base64特点:

  • Base64是网络上最常见的用于传输8bit字节码的可读性编码算法之一
  • 可读性编码算法不是为了保护数据的安全性,而是为了可读性
  • 可读性编码不改变信息内容,只改变信息内容的表现形式

CRYPTO 密码学-笔记_第1张图片

Base64算法原理:

  1. 将原始数据每三个字节作为一组,每个字节是8个bit,所以一共是 24 个 bit
  2. 将 24 个 bit 分为四组,每组 6 个 bit
  3. 在每组前面加补 00,将其补全成四组8个bit
  4. 根据Base64码表得到扩展后每个字节的对应符号

base64算法原理,特别的理解

抽象的理解就是,对原始字符串削皮,削成两层,得到最内层的东西,再平均分成4组,最后再把削的两层皮贴回去,变成原来的模样

1.在整个原始字符串中每次拿出一组进行编译,一组三个字节

2.第一次削去英文字母的形式,露出ascii码形式

3.第二次削去ascii码的形式,露出二进制形式

4.再将这一组所有的二进制,平均分4小组,即每组6位

 5.最后针对每小组的6位编码,逆着原来的步骤,一步一步把皮贴回去,

就是将二进制形式变成十进制形式,再将十进制对照base64表,变成英文字母的形式

CRYPTO 密码学-笔记_第2张图片

 上面的表格中是对Man进行编码,Man正好是3组8位的字符串

对于M,首先ascii编码是77,再将77转换成二进制形式,之后以6个字节为一组,分成4组

每组形成的编码对照base64对照表,写出编码后的字符串

有时我们会在Base64字符末尾会看到=,有时1个,有时2个

通过上面的我们知道了Base64编码过程是3个字符一组的进行,如果原文长度不是3的倍数怎么办呢? 例如我们的原文为Ma,它不够3个,那么只能在编码后的字符串中补=了。缺一个字符补一个,缺两个补两个即可,所以有时候你会看见base64字符串结尾有1个或者2个=

CRYPTO 密码学-笔记_第3张图片

可以根据这些特点,判断一串编码是由base64编码的

  • 编码的字符只含有A到Z、小写a到z、数字0到9、“+”和“/“
  • 结尾有一个或两个“=”的

三、现代密码学:

1.消息摘要

简介

  • 对一份数据,进行一个单向的 Hash 函数,生成一个固定长度的 Hash 值,这个值就是这份数据的摘要,也称为指纹。
  • 消息摘要算法的主要特点是加密过程不需要私钥,并且加密的数据不可逆。只有输入是相同的明文数据并且采用相同的消息摘要算法,得出来的密文才是一样的。其加密过程的计算量是比较大的
  • 消息摘要算法目前主要应用在"数字签名"领域,作为对明文的摘要算法,著名的摘要算法有 RSA 公司的 MD5 算法和 SHA-1 算法及其大量的变体。

特点

  • 无论输入的消息有多长,计算出来的消息摘要的长度总是固定的

         MD5 算法摘要的消息有 128bit,用 SHA-1 算法摘要的消息最终有 160bit 的输出,SHA-1 的变体可以产生 192bit 和 256bit 的消息摘要

  • 只要输入的消息不同,对其进行摘要以后产生的摘要消息也必不相同;但相同的输入必会产生相同的输出
  • 消息摘要是单向、不可逆的

应用

可以用于校验数据的完整性。(之所以叫做指纹的原因)

例如我们在下载文件时,数据源会提供一个文件的MD5。文件下载好之后,我们本地计算出文件的MD5,和数据源提供的MD5做对比,如果相同则文件是完整的。但独立使用消息摘要时,无法确保数据没有被篡改,因为无法保证从数据源获取的MD5有没有被中途篡改。

MD算法

MD 算法: Message Digest Algorithm ,目前主流的是 MD5 算法,为第五版算法,之前有 MD2、MD3、MD4 算法。

MD5生成的消息摘要是128位

SHA算法

安全散列算法(英语:Secure Hash Algorithm,缩写为 SHA)是一个密码散列函数家族,是 FIPS 所认证的安全散列算法。能计算出一个数字消息所对应到的长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。

SHA 家族的五个算法,分别是 SHA-1、SHA-224、SHA-256、SHA-384,和 SHA-512,由美国国家安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布;是美国的政府标准。后四者有时并称为 SHA-2。

2.非对称加密

① 非对称加密算法又称现代加密算法、公钥密码体制。

② 非对称加密是计算机通信安全的基石,保证了加密数据不会被破解。

③ 与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey) 和私有密(privatekey)

④ 公开密钥和私有密钥是一对

⑤ 如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密。

⑥ 如果用私有密钥对数据进行加密,只有用对应的公开密钥才能解密。

⑦ 因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

示例


首先生成密钥对, 公钥为(5,14), 私钥为(11,14)
现在A希望将原文2发送给B
A使用公钥加密数据, 2的5次方mod 14 = 4 , 将密文4发送给B
B使用私钥解密数据, 4的11次方mod14 = 2, 得到原文2


特点


加密和解密使用不同的密钥
如果使用私钥加密, 只能使用公钥解密
如果使用公钥加密, 只能使用私钥解密
处理数据的速度较慢, 因为安全级别高


常见算法

RSA
ECC
 

在公钥加密系统中,加密和解密是相对独立的,加密和解密会使用到两把不一样的钥匙。

加密密钥(公钥)向公众公开,解密密钥(私钥)只对解密人自己知道,非法使用者无法根据公钥推算出私钥,顾其可称为公钥密码体制

在CTF中,RSA密码是最常见的公钥密码体制

3.数字签名

摘要经过加密,就得到数字签名

数字签名是公钥加密系统与消息摘要的技术结合应用

数字签名必须保证以下三点:

  • 报文鉴别——接收者能够核实发送者对报文的签名;
  • 报文的完整性——接收者不能伪造对报文的签名或更改报文内容。
  • 不可否认——发送者事后不能抵赖对报文的签名;

CRYPTO 密码学-笔记_第4张图片CRYPTO 密码学-笔记_第5张图片数字签名过程:

CRYPTO 密码学-笔记_第6张图片

 4.数字证书

上面的一切都很完美,你用公钥能够解密,说明确实是私钥方发送的,你很放心……

但有没有想过,万一这把公钥本身,就被人做了手脚???

为了保证“公钥”是可信的,数字证书应运而生。

作用:

确保数据接受者的公钥是没有被篡改过的

数字证书通常包含一下内容:

  1. 证书所有人的公钥
  2. 证书发行者对证书的数字签名
  3. 证书所用的签名算法
  4. 证书发布机构、有效期、所有者的信息等其他信息

 CA证书

数字证书里有个重要概念,CA,发送方先把自己的公钥给CA,CA对其进行加密得到加密后的发送方公钥(用的是CA的私钥和CA加密算法),也就是CA的数字证书。

注意这里有两个不同的非对称算法(对应2个公钥私钥对),一个算法是发送方加密摘要的,用于生成数字签名;另一个算法是CA加密发送方公钥的,用于生成数字证书。两个算法相互独立,没有必然联系。

发送时不仅发送内容、数字签名,还包含发送方的数字证书。接收方拿到后,首先从数字证书中解密出发送方公钥(用的是CA的公钥和CA解密算法),这个公钥必然是可信的。然后就是和前面一样的流程,拿发送方公钥去解密数字证书,得到摘要;最后比对摘要是否一致。

一个问题:既然数字证书是为了保证发送方公钥不是别人伪造的,那怎么保证“CA”的公钥不是伪造的呢?

答:CA是第三方机构,CA公钥是公开的,接收方可以跟别人比对(比如在网上查询),因此不可能伪造。但是发送方公钥,接收方是通过通信得到的,收到后无法验证。

引用【区别】摘要、数字签名、数字证书 - 知乎 (zhihu.com)

你可能感兴趣的:(密码学,笔记)