一日一技:如何给中文加密?

简介: 一日一技:如何给中文加密?

摄影:产品经理
这家烤串店总算是开张了

在看各类加密文章的时候,你一般会看到作者总是使用对一个数字进行加密来举例。但是现实生活中,我们使用中文进行交流,那如何对中文进行加密呢?

在文章《别怕,我们的聊天消息,没人能偷看》中,我们对一段中文进行加密,有这样一个段代码:

msg = '今晚8点,老地方碰头'
encryptd_msg = rsa.encrypt(msg.encode(), public_key)

其中,msg.encode()把中文信息转换为了 bytes 型数据。我们来看一下这段 bytes 型数据型数据长什么样:

看起来一长串的十六进制值,似乎很难读懂。不过没关系,我们把这个 bytes 型的数据再转成列表看看:

这就变成了一个包含数字的列表。并且,如果你多次测试,你会发现,这些数字的范围是0-255.恰好对应了十六进制的00ff

现在我们就可以对数字进行加密了。由于00-ff对应了8位的二进制数,所以我们假设现在密钥是45,它的二进制值为00101101,我们把这个列表里面的每一个数字对45取异或,得到一个新的数字列表:

注意,这里实际上当你使用 for 循环展开时,不用提前把 bytes 型字符串转换为列表,直接循环展开效果一致,如下图所示:

现在,我们再来把这段包含数字的列表转换为 bytes 型数据:

需要注意的是,并非所有 bytes 都能重新转换回字符串,现在新的 bytes 型密文就已经无法转换回去了:

所以,这个时候我们就需要使用 base64来把它编码为字符串:

base64的b64encode方法返回的也是一个 bytes 型数据,但是这次可以成功转回普通字符串了,并且普通字符串跟它的 bytes 形式完全一样:

现在,你可以把这一段密文通过公开的聊天软件发给你的朋友。

你的朋友只需要把整个过程反向操作,就能解析出正确的信息,我们来写一段代码:

import base64
code = 'yZany7S3FcqvlMKRocWtrMixncu7lMqPnciJmQ=='
encrypted_msg = base64.b64decode(code.encode())
bytes_list = [x ^ 45for x in encrypted_msg]
msg_bytes = bytes(bytes_list)
msg = msg_bytes.decode()
print(msg)

运行效果如下图所示:

成功解密。

其中的数字45就是密码。异或操作有一个性质:

A xor B xor B = A

一个数字A,先对另一个数字 B 执行异或操作得到密文 C,然后 C 再对 B 进行一次异或操作,又能还原为 A。

我们正是使用了这样一个性质,实现了加密和解密。

可能有同学会问,为什么这里你选择异或,而不是列表里面的所有数字同时乘以或者加上某个数来加密呢?这是因为,如果要把一个包含数字的列表转成 bytes 型数据,那么列表里面的所有数字都必须在0-255的范围内,否则就会导致报错,如下图所示:

我们无法保证加法或者乘法执行以后的数字仍然在0-255这个范围内,但用其他复杂的算法又不一定可逆。所以我们选择了异或算法。

从本文可以看到,对中文进行加密,本质上还是对数字加密。

目录
相关文章
|
2月前
|
存储
阿里云轻量应用服务器收费标准价格表:200Mbps带宽、CPU内存及存储配置详解
阿里云香港轻量应用服务器,200Mbps带宽,免备案,支持多IP及国际线路,月租25元起,年付享8.5折优惠,适用于网站、应用等多种场景。
755 0
|
10月前
|
负载均衡 网络协议 算法
OSPF与其他IGP协议的比较:全面解析与应用场景
OSPF与其他IGP协议的比较:全面解析与应用场景
307 0
|
10月前
|
存储 监控 算法
请详细介绍内存池的最佳实践
请详细介绍内存池的最佳实践
|
数据采集 监控 数据挖掘
ERP系统中的数据分析与报表生成
【7月更文挑战第25天】 ERP系统中的数据分析与报表生成
913 2
|
存储 关系型数据库 MySQL
MySQL 中的 BLOB 数据类型深入解析
【8月更文挑战第31天】
1629 0
|
人工智能 供应链 算法
人工智能(AI)在工业生产中的应用已经成为一种趋势
人工智能(AI)在工业生产中的应用已经成为一种趋势
|
网络协议 网络安全 虚拟化
VMware 主IP地址:网络信息不可用
VMware 主IP地址:网络信息不可用
9593 0
|
存储 算法 Python
基于pythonA*算法两种搜索算法求解八数码问题
基于pythonA*算法两种搜索算法求解八数码问题
469 0
基于pythonA*算法两种搜索算法求解八数码问题
|
负载均衡 前端开发 Java
项目实战典型案例3——fegin调用404情况
项目实战典型案例3——fegin调用404情况
1090 0
|
关系型数据库 MySQL 数据库
【MySQL速通篇001】MySQL主键,自增列,各类索引,外键及变种,分组,连表,数据行操作等知识点 1
【MySQL速通篇001】MySQL主键,自增列,各类索引,外键及变种,分组,连表,数据行操作等知识点
518 0