身为程序猿——这些加密解密以及字符编码原理你真的废吗!熬夜整理万字博文&建议收藏
Posted 孤寒rm-rf*
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了身为程序猿——这些加密解密以及字符编码原理你真的废吗!熬夜整理万字博文&建议收藏相关的知识,希望对你有一定的参考价值。
前言——最近很多粉丝私信我说他们在进行JS渗透的时候总是碰到SHA,MD5,AES,RSA之类的玩意;更有甚者说他们在进行破解一些网站的字体反爬的时候碰到了字符编码啥的,但是他们对这些东西不是很明白,只会跟着网上的资料视频或者书籍一步步破解。
听到粉丝们的这个问题我也是会心一笑,确实现在数据唯尊的世界,有数据者得天下,那些大哥大们肯定会想尽一切办法保护好自己的数据不为外人所嫖。
而本文也是为了带大家走入加密解密的神奇世界,并讲解常见的字符编码方式。拿出小本本仔细听课哦🙄
详解加密解密及编码原理!
引子:
涉及爬虫,可能很多人大都听过加密解密,那么,加密解密这究竟是个啥玩意呢?
下面通过一个例子来实现一个最简单的加密解密:
第一步:比如你想和小明说一句hello world,但是你不希望其他人看得懂,就需要对你发出的信息进行加密。这里就通过使每一个字母都往后移三位,比如:a就加密为d。
for c in 'hello world':
print(chr(ord(c) + 3),end="")
知识补给站:
ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,
它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值。
此处先通过ord()函数得到对应字符的ASCII数值,然后进行加3操作,实现对应字母后移三位,最后再通过
chr()函数得到此ASCII数值对应的字符!
第二步:小明收到了信息,但是也看不懂,就需要对接收到的信息进行解密。相对应的解密方法就是使每一个字母都往前移三位,比如:d就解密为a。
for c in 'khoor#zruog':
print(chr(ord(c) - 3),end="")
一.概念和作用
①概念:
加密解密:其实就是一个信息干扰的过程,保证固定的人才可以看到你的信息。
把重要的数据变为乱码(加密)传送,
到达目的地后再用相同或不同的手段还原(解密)。
②作用:
网络信息传输安全涉及到很多个方面,其中主要有三个要解决的问题:
- 保密性(Confidentiality):信息在传输时不被泄露
- 完整性(Integrity):信息在传输时不被篡改
- 有效性(Availability):信息的使用者是合法的
③常用加密方式:
二.字符编码
①进制:程序猿必备的数电知识之(二进制,八进制,十六进制,原码,补码,反码)
一个字节是计算机内存的最小单位,由8个二进制位组成,2个16进制组成
F=0000 1111 =15
FF=1111 1111 =255
②进制间转换方法:
第一个:十进制与二进制
>>> bin(255) #十进制转二进制
'0b11111111'
>>> int("0b11111111",2) #二进制转十进制
255
第二个:十进制与十六进制
>>> hex(255) #十进制转十六进制
'0xff'
>>> int("0xff",16) #十六进制转十进制
255
第三个:unicode
字符和unicode编号是一一对应的关系,世界上的每个字符都对应着一个unicode编号,根据编号可以进行多种编码。utf-8,utf-16,utf-32…,gbk编码等
>>> ord("中")
20013
>>> chr(20013)
'中'
>>> "中".encode("utf-8") #汉字中utf-8编码
b'\\xe4\\xb8\\xad'
>>> "中".encode("gbk") #汉字中 gbk编码
b'\\xd6\\xd0'
知识补给站:
ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,
它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值。
三.Base64编码原理
①概念:
Base64就是一种基于64个可打印字符来表示二进制数据的方法。
②作用:
- 在参数传输的过程中经常遇到的一种情况:使用全英文的没问题,但一旦涉及到中文就会出现乱码情况。
- 网络上传输的字符并不全是可打印的字符,比如二进制文件、图片等。Base64的出现就是为了解决此问题,它是基于64个可打印的字符来表示二进制的数据的一种方法。
实例:- 电子邮件刚问世的时候,只能传输英文,但后来随着用户的增加,中文、日文等文字的用户也有需求,但这些字符并不能被服务器或网关有效处理,因此Base64就登场了。随之,Base64在URL、Cookie、网页传输少量二进制文件中也有相应的使用。
- 对证书来说,特别是根证书,一般都是作Base64编码的,因为它要在网上被许多人下载。
- 电子邮件的附件一般也作Base64编码的,因为一个附件数据往往是有不可见字符的。
③Base64编码表:
④文本到base64格式的转换:
#ASCII码
>>> ord("M")
77
>>> ord("a")
97
>>> ord("n")
110
#ASCII转二进制
>>> bin(77)
'0b1001101'
>>> bin(97)
'0b1100001'
>>> bin(110)
'0b1101110'
#六个二进制位一组
>>> int("010011",2)
19 19---对应base64表T
>>> int("010110",2)
22 22---对应base64表W
>>> int("000101",2)
5 5---对应base64表F
>>> int("101110",2)
46 46---对应base64表u
⑤BASE64编码补码:(注意点:计算机保存数据是二进制,按字节保存,也就是说保存的二进制位数必须是8的倍数!这也就是为什么此处BASE64编码补码要加’='的原因!)
>>> base64.b64encode(b"A")
b'QQ=='
>>> base64.b64encode(b"BC")
b'QkM='
- 大多数编码都是由字符串转化成二进制的过程,而Base64的编码则是从二进制转换为字符串。与常规恰恰相反;
- Base64编码主要用在传输、存储、表示二进制领域,不能算得上加密,只是无法直接看到明文。也可以通过打乱Base64编码来进行加密。
四.单向加密(主要用于数据的完整性验证!)
①概念:
单向加密是指只能对明文数据进行加密,而不能解密数据。
例:每个人都有不同的指纹,看到这个人,可以得出他的指纹等信息,并且唯一对应,但你只看一个指纹,是不可能看到或读到这个人的长相或身份等信息。
②常见方法:
MD5 (message-digest algorithm) SHA (Secure Hash Algorithm)
- md5的长度默认为128bit,也就是128个0和1的二进制串。
- SHA 的长度默认为256bit,也就是256个0和1的二进制串。
- 使用二进制串很不友好。所以将二进制转成了16进制,每4个bit表示一个16进制,所以128/4 = 32 换成16进制表示后,为32位了。同理256/4=64,64位.
- update 的意思是更新hash值,若同一个MD5对象两次调用update,第二次会保留第一次调用调用的信息,所以算一个字符串的hash值,应该重新生成md5对象
③两种加密的实现(python编写)
第一个:MD5
from hashlib import md5
md5_obj=md5() #创建md5算法加密对象
md5_obj.update("加密数据".encode())#参数:内容是要加密数据 二进制格式
print(md5_obj.hexdigest()) # 使用.hexdigest()将二进制数据转为16进制数据,便于观察!
#结果
'648bfc23726d2e76af569f6fea26c1f8'
md5_obj.update("加密数据".encode())
print(md5_obj.hexdigest()) ##同一个md5对象两次调用update 第二次保留第一次调用的信息
'47c58fbd984d00c4c0c24396be4ed52f'
第二个:SHA
from hashlib import sha256
sha256_obj=sha256()#创建sha算法加密对象
sha256_obj.update("加密数据".encode())#参数:内容是要加密数据 二进制格式
sha256_obj.hexdigest()
#结果
'fc016213ebd4e12fd50ebeee2a074d09aef8b4dffa247401227976cfdec1ebf9'
sha256_obj.update("加密数据".encode())#参数:内容是要加密数据 二进制格式
sha256_obj.hexdigest()
##同一个sha对象两次调用update 第二次保留第一次调用的信息
'5cbb02bfa5153ef91d29c8edcd213ffde626a9e6c0ac6d25e1d9ad6ddbca0078'
五.对称加密
①概念与简介:
概念: 对称加密是指数据加密与解密使用相同密钥。
②简介:
常用的对称加密 DES 3DES AES
第一个:DES: Data Encryption Standard,秘钥长度为56位,8位校验位;
2003年左右被破解–秘钥可以暴力破解。 穷举法
第二个:3DES:DES的改进版本。
第三个:AES: Advanced Encryption Standard,支持的秘钥长度包括 128bits,192bits,258bits,384bits,512bits。
③特点:
- 加密与解密使用的密钥相同。
- 但是由于算法一般都是公开的,因此机密性几乎完全依赖于密钥。
- 通常使用的是相对较小的密钥,一般小于256bit。因为密钥越大,加密越强,但加密与解密的过程越慢。
说明: 秘钥长度越长,数据加密与解密的时间就越久
③重点讲解:DES
①概念:
数据加密算法(Data Encryption Algorithm,DEA)是一种对称加密算法,很可能是使用最广泛的密钥系统,特别是在保护金融数据的安全中,最初开发的DEA是嵌入硬件中的。
②DES加密原理:
③python实现DES加密:
1.安装密码库
windows: pip install pycryptodomex
linux: pip install pycryptodome
2.简单使用
from Cryptodome.Cipher import DES
key = b'12345678' # 秘钥
des = DES.new(key, DES.MODE_ECB)
anywd = '加密'
bwd = anywd.encode()
en_text = anywd+(8-len(bwd)%8)*" " # 补码,如果明文不够64位就用空格补!
# 比如此处: len(bwd)为2,一个汉字长度是16位,len(bwd)%8=6,8-len(bwd)%8=2,所以补两个空格(32位),相加即为64位!
en_data = des.encrypt(en_text.encode())
print(en_data)
de_data = des.decrypt(en_data)
print(de_data)
print(de_data.decode())
④重点讲解:3DES
One、概念:
3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。
由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解。3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。
Two、加密原理:
3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准),加密算法,其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,M代表明文,
C代表密文,这样:
- 3DES加密过程为:C=Ek3(Dk2(Ek1(M)))
- 3DES解密过程为:M=Dk1(EK2(Dk3©))
⑤重点讲解:AES
One、概念:
密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。
Two、加密过程:
AES为分组密码,分组密码也就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文。
在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节(每个字节8位)。
密钥的长度可以使用128位、192位或256位。密钥的长度不同,推荐加密轮数也不同,C = E(K,P)是加密函数,在这个加密函数中会执行10个加密轮函数。
Three、简单使用:
from Cryptodome.Cipher import AES
key = b'123456789abcdefgh'
iv = b'qwertyui12345678'
# 构建对象
aes = AES.new(key, AES.MODE_CBC, iv)
# 1.key秘钥 2.mode AES.MODE_CBC加密方式 3.iv初始化向量,16个字节
六.非对称加密
①概念与简介:
指的是加密和解密使用不同的秘钥。
一把作为公开的公钥,另一把作为私钥。这对密钥中的公钥进行加密,私钥用于解密。反之亦然(被私钥加密的数据也可以被公钥解密)。
在实际使用中私钥一般保存在发布者手中,是私有的不对外公开的,只将公钥对外公布,就能实现只有私钥的持有者才能将数据解密的方法。 这种加密方式安全系数很高,因为它不用将解密的密钥进行传递,从而没有密钥在传递过程中被截获的风险,而破解密文几乎又是不可能的。
但是算法的效率低,所以常用于很重要数据的加密,常和对称配合使用,使用非对称加密的密钥去加密对称加密的密钥。
事实上,公钥加密算法很少用于数据加密,它通常只是用来做身份认证,因为它的密钥太长,加密速度太慢–公钥加密算法的速度甚至比对称加密算法的速度慢上3个数量级(1000倍)。
②非对称加密原理:
- 小蓝与小红想要进行沟通,不能被小黑或其他人看到;(需求)
- 于是小红自己做了个信箱,信箱上有锁,钥匙只有小红自己有;(公钥加密)
- 于是小蓝每次与小红沟通的时候,都会把信放在邮箱中,信箱大家都可以看到,都可以知道小红的信箱位置;(公开公钥)
- 小红想要看信的内容的时候,需要拿着自己保管的私钥,打开锁,读取信箱里的信.(私钥解密)
- 过程2带锁的信箱,就是公钥加密的过程.
- 过程4是私钥解密的过程
- 公钥(锁) 私钥(钥匙)是生成的一对,且私钥不对外,不传递,增加了安全性.
- 同样的小红想要给小蓝发送信息时,小蓝需要告诉小红带锁信箱(公开公钥),并通过钥匙打开信箱
上图来自一个视频:(两位大佬细致入微的讲解!)
https://www.bilibili.com/video/av65017912/
https://blog.csdn.net/jijianshuai/article/details/80582187
③RSA加密算法:
1.概念
三位数学家Rivest、Shamir 和 Adleman 设计了一种算法,可以实现非对称加密
2.RSA加密原理
1)选择一对不同的、足够大的素数p,q。
2)计算n=pq。
3)计算f(n)=(p-1)(q-1),同时对p, q严加保密,不让任何人知道。
4)找一个与f(n)互质的数e作为公钥指数,且1<e<f(n)。一般是65537!
5)计算私钥指数d,使得d满足(d*e) mod f(n) = 1
6)公钥KU=(e,n),私钥KR=(d,n)。
7)加密时,先将明文变换成0至n-1的一个整数M。若明文较长,可先分割成适当的组, 然后再进行交换。 设密文为C,则加密过程为:C=M^e mod n。
8)解密过程为:M=C^d mod n。
3.RSA加密算法的安全性
当p和q是一个大素数的时候,从它们的积pq去分解因子p和q,这是一个公认的数学难题。
4.RSA加密算法的缺点
虽然RSA加密算法作为目前最优秀的公钥方案之一,在发表三十多年的时间里,经历了各种攻击的考验,逐渐为人们接受。但是,也不是说RSA没有任何缺点。由于没有从理论上证明破译RSA的难度与大数分解难度的等价性。所以,RSA的重大缺陷是无法从理论上把握它的保密性能如何。在实践上,RSA也有一些缺点:
产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密;
分组长度太大,为保证安全性,n 至少也要 1024 bits 以上,使运算代价很高,尤其是速度较慢
本文概念性内容居多,需要大家反复认真阅读(建议码住,多翻多看哦!),深入思考。相关加密解密公式及原理如有疑惑点,可以百度或者私聊本博主哦!
以上是关于身为程序猿——这些加密解密以及字符编码原理你真的废吗!熬夜整理万字博文&建议收藏的主要内容,如果未能解决你的问题,请参考以下文章
身为程序猿——这些加密解密以及字符编码原理你真的废吗!熬夜整理万字博文&建议收藏
身为程序猿——谷歌浏览器的这些骚操作你真的废吗!熬夜整理&建议收藏