浅析数据加密

浅析数据加密

什么是加密?

加密的目的:

对数据的一种保护措施;核心是密码学

加密的类型:

常见的加密分以下三种类型:

  1. 单项加密 --> md5, base64
  2. 对称加密 --> DES, AES
  3. 非对称加密 --> RSA

加密过程:

明文的文件或数据按照某种(加密)算法进行处理,使其变为不可读的(密文)

被加密的数据对象必须是二进制类型, 我们可以使用encode()decode(), 在字符串和字节串之间相互转换


三大加密类型

单向加密–>md5(不可逆):

目前破解方式:穷举法
MD5算法的过程分为四步:处理原文,设置初始值,循环加工,拼接结果。

处理原文:
计算出原文长度(bit)对 512 求余的结果,如果不等于 448,就需要填充原文使得原文对 512 求余的结果等于 448。填充的方法是第一位填充 1,其余位填充 0。填充完后,信息的长度就是 512*N+448。

设置初始值:
MD5 的哈希结果长度为 128 位,按每 32 位分成一组共 4 组。这 4 组结果是由 4 个初始值 A、B、C、D 经过不断演变得到。

import hashlib
import base64

# 单向加密
temp = '哈哈哈'
# 声明MD5加密算法对象
h = hashlib.md5()
# 将数据更新到加密算法的对象
h.update(temp.encode())

# 十六进制
print(h.hexdigest())    # : bf17f4ab50fe9cb9e90ac041351d3946
# 二进制
print(h.digest())   # : b'\xbf\x17\xf4\xabP\xfe\x9c\xb9\xe9\n\xc0A5\x1d9F'

# base64加密
s = h.hexdigest()
print(base64.b64decode(s.encode())) # : b'm\xfd{\x7f\x86\x9b\xe7G\xde\xf5\xc6\xfd{\xdd\x1asN5\xdf\x9d]\xdf\xde:'

对称加密–>DES AES:

过程:

明文——>加密(加密算法)——>密文
密文——>解密(相同算法逆运算)——>明文

特点:
  • 算法公开、计算量小、加密速度快、加密效率高。
  • 加密/解密使用相同的密钥
  • 加密和解密的过程是可逆的
  • 对称加密, 被加密的数据的长度必须是8的倍数

密钥:是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数

AES与DES不同的是, 在使用时需要额外设置一个伪随机码(偏移量), 在加密时也会多一个参数

安装Cryptodome

windows:pip install pycryptodomex
ubuntu:pip install pycryptodome

DES加密:
from Cryptodome.Cipher import DES


# 定义密钥
key = b'qwerasdf'
# 字符字段, 长度必须为8的倍数
temp = 'Hello World !!!!'
# 声明des对象
des = DES.new(key, DES.MODE_ECB)

# 加密, 被加密的对象必须为二进制类型
en_temp = des.encrypt(temp.encode())
print(en_temp)      # : b'9\x82H0\xbd\xb6ZW\x98\xec\x96$*\x1bXp'

# 解密, 使用相同的des对象解密
de_temp = des.decrypt(en_temp)
print(de_temp)     # : b'Hello World !!!!'

# 解密, 不同的对象, 但密钥相同
des2 = DES.new(key, DES.MODE_ECB)
de2_temp = des2.decrypt(en_temp)
print(de2_temp)     # : b'Hello World !!!!'

# 解密, 不同的对象和密钥
new_key = b'abcdefgh'
des3 = DES.new(new_key, DES.MODE_ECB)
de3_temp = des3.decrypt(en_temp)
print(de3_temp)     # 解密失败: b'\xe1@OLv\xf1t\xeb\xb8\x9d\x18(\xc7|\t>'

DES加密/解密对象必须使用相同的密钥

AES加密:
from Cryptodome.Cipher import AES
from Cryptodome import Random


# 数据
temp = 'Hello World!'
# 密钥, 长度只能是16,24,32, 受限于key_size = (16, 24, 32)
key = b'asdfghjasdfghjac'
# 伪随机码(偏移量)
iv = Random.new().read(AES.block_size)

# 声明aes加密对象
en_aes = AES.new(key, AES.MODE_CFB, iv)
# 执行加密
en_temp = en_aes.encrypt(temp.encode())
print(en_temp)  # : b'\xdcG\xb4\x02E\xfaF4U\x84\xfe4'

# 解密, 必须重新声明aes对象
de_aes = AES.new(key, AES.MODE_CFB, iv)
# 执行解密
de_temp = de_aes.decrypt(en_temp)
print(de_temp)  # : b'Hello World!'

print(key)   # 密钥: b'asdfghjasdfghjac'
print(iv)     # 偏移量: b'\x9c\x13\xa1\xa6xpM\xfe\x14Y\xf1\xe6\x18\xfb\xe6\xf9'

AES加密/解密的对象必须使用相同的秘钥和伪随机码


非对称加密–>RSA:

原理:

加密和解密使用的是不同的秘钥(公钥/publickey,私钥/privatekey)
第一种用法:公钥加密,私钥解密。—用于加解密
第二种用法:私钥签名,公钥验签。—用于签名

特点:

算法强度复杂,安全性依赖于算法与密钥。

优点:

其安全性更好,对称加密的通信双方使用相同的秘钥,如果一方的秘钥遭泄露,那么整个通信就会被破解。而非对称加密使用一对秘钥,一个用来加密,一个用来解密,而且公钥是公开的,秘钥是自己保存的,不需要像对称加密那样在通信之前要先同步秘钥。

缺点:

由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快。

安装:

pip install rsa

RSA加密:
import rsa


# 数据
temp = 'hello world'
# 生成公钥, 私钥
pub_key, priv_key = rsa.newkeys(1024)   # 1024代表需要储存的字节数
print(pub_key)
print(priv_key)

# 公钥加密
en_temp = rsa.encrypt(temp.encode(), pub_key)
print(en_temp)	# : b'co\xed\xc3\xf1^J\xc6\xce\xb2\xd4\x05\xf5\t3O\...

# 私钥解密
de_temp = rsa.decrypt(en_temp, priv_key)
print(de_temp)	# ; b'hello world'

关于二进制转化

import binascii

temp = '哈哈'
# 当我们打印转码后的汉字时, 显示的是二进制数据的十六进制表现形式
print(temp.encode())    # : b'\xe5\x93\x88\xe5\x93\x88'
# 下面这种是以一种比较好看的格式展示上面的数据
print(binascii.b2a_hex(temp.encode()))  # : b'e59388e59388'

# 如何将一个字符串转化为二进制(0,1)
for i in temp:
    for j in i.encode():
        print(bin(j))
        
# 运行结果:
0b11100101
0b10010011
0b10001000
0b11100101
0b10010011
0b10001000

问题:

1. 为什么说单向加密是不可逆,而密钥加密可逆,简单谈谈你的理解
根本原因就是单向加密产生的值的数量是有限的, 如果单向加密可逆,别人得到了你的密文,就可以倒推出你的密码或隐私信息, 这是极不安全的一点。因此, 用户只有通过输入相同的明文, 服务器通过再次加密, 让得到的密文与原来的密文进行比对, 才能安全的完成身份验证, 这就是为什么单向加密不可逆。打个比方, 就像是现在比较流行的刷脸支付, 只有本人站在摄像头前, 且有大部分是可复译的(例如拿到一个MD5密文, 而后台处理相貌特征的算法就类似于单向加密 。
而密钥加密, 生成的是一组毫无规律的密文, 但这串密文是基于定义的密钥生成的, 只有拥有密钥的人, 才可以破译出明文 , 才可以完成身份验证。以对称加密为例, 就像一把锁对应一把钥匙, 只有有钥匙的人才能开锁, 而非对称加密, 就相当于, 锁住需要一把钥匙(公钥), 解锁需要另一把钥匙(私钥),从而使得这种密钥加密是可逆的。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值