Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一日一技:如何给中文加密?

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

作者头像
青南
发布于 2020-03-26 03:43:31
发布于 2020-03-26 03:43:31
5.6K00
代码可运行
举报
文章被收录于专栏:未闻Code未闻Code
运行总次数:0
代码可运行
在看各类加密文章的时候,你一般会看到作者总是使用对一个数字进行加密来举例。但是现实生活中,我们使用中文进行交流,那如何对中文进行加密呢?

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 形式完全一样:

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import base64
code = 'yZany7S3FcqvlMKRocWtrMixncu7lMqPnciJmQ=='

encrypted_msg = base64.b64decode(code.encode())

bytes_list = [x ^ 45 for x in encrypted_msg]

msg_bytes = bytes(bytes_list)
msg = msg_bytes.decode()
print(msg)

运行效果如下图所示:

成功解密。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
A xor B xor B = A

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

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

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 未闻Code 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
别怕,我们的聊天消息,没人能偷看
由于众所周知的原因,国内的各大邮箱、聊天 App 都会监控你接收和发送的信息。如果你需要传递一些绝密内容,显然你需要对你的内容进行加密。
青南
2020/02/26
9600
别怕,我们的聊天消息,没人能偷看
一日一技:Python的bytes型数据的迭代特征
Bytes类型是Python 3引入的一个基本数据类型。调用Bytes类型的 .decode()方法可以把它变成Python 3的 str类型。调用 str类型的 .encode()方法,可以把它变成Bytes类型。
青南
2019/07/10
2.1K0
一日一技:Python的bytes型数据的迭代特征
攻防世界-Crypto-进阶
解密摩斯电码得到flag:ALEXCTFTH15O1SO5UP3RO5ECR3TOTXT
小简
2022/12/28
1.3K0
攻防世界-Crypto-进阶
2018年7月21日python中的加密和解密
·在函数调用执行过程中: 如果出现return,return中的函数执行完则本函数就运行结束,return下面的语句不会再继续执行,所以return使 用时也应该注意,如果是调用函数的下面还有要输出的东西,可以不用写return,直接写函数名调用
武军超
2018/09/27
1.1K0
python实现AES/DES/RSA/MD5/SM2/SM4/3DES加密算法模板汇总
都是作者累积的,且看其珍惜,大家可以尽量可以保存一下,如果转载请写好出处https://www.cnblogs.com/pythonywy
小小咸鱼YwY
2020/11/24
5K0
【爬虫知识】爬虫常见加密解密算法
本文总结了在爬虫中常见的各种加密算法、编码算法的原理、在 JavaScript 中和 Python 中的基本实现方法,遇到 JS 加密的时候可以快速还原加密过程,有的网站在加密的过程中可能还经过了其他处理,但是大致的方法是一样的。
K哥爬虫
2021/08/03
8.6K0
【爬虫知识】爬虫常见加密解密算法
常见的加密方式之python实现
编码与解码 通常所说的加密方式,都是对二进制编码的格式进行加密的,对应到Python中,则是我们的Bytes。所以当我们在Python中进行加密操作的时候,要确保我们操作的是Bytes,否则就会报错。将字符串和Bytes互相转换可以使用encode()和decode()方法。
MIKE笔记
2023/03/23
1.5K0
常见的加密方式之python实现
国密 SM2 公钥加密密文格式记录
最近发现,使用外部开源的国密库(https://github.com/duanhongyi/gmssl)进行 SM2 加密之后无法在腾讯云 KMS 系统上做解密,于是笔者针对这个问题做了一些调研、分析,最后解决了这个问题,这篇文章用来记录解决此问题的一些关键步骤和分析思路。
密码学人CipherHUB
2024/12/18
2.3K3
国密 SM2 公钥加密密文格式记录
你试过用 Python 加密文件吗?
生活中,有时候我们需要对一些重要的文件进行加密,Python 提供了诸如 hashlib,base64 等便于使用的加密库。
崔庆才
2019/06/21
1.3K0
你试过用 Python 加密文件吗?
Android 逆向 | 不是加密的 Base64
Base 系列还有 16/32/62/64/85/36/58/91/92 等,分别表示用不同个数的可打印字符表示二进制数据
咸鱼学Python
2020/12/02
1.1K0
Android 逆向 | 不是加密的 Base64
Golang:加密解密算法
在项目开发过程中,当操作一些用户的隐私信息,诸如密码,帐户密钥等数据时,往往需要加密后可以在网上传输.这时,需要一些高效地,简单易用的加密算法加密数据,然后把加密后的数据存入数据库或进行其他操作;当需要读取数据时,把加密后的数据取出来,再通过算法解密.
OwenZhang
2021/12/08
1.8K0
Golang:加密解密算法
Android常用加密方式
加密技术是最常用的安全保密手段,利用技术手段把重要的数据变为乱码(加密)传送,到达目的地后再用相同或不同的手段还原(解密)。加密技术包括两个元素:算法和密钥。算法是将普通的信息或者可以理解的信息与一串数字(密钥)结合,产生不可理解的密文的步骤,密钥是用来对数据进行编码和解密的一种算法。在安全保密中,可通过适当的钥加密技术和管理机制来保证网络的信息通信安全。
全栈程序员站长
2022/08/29
1.6K0
Android常用加密方式
Go加密算法总结
它是一种数据编码方式,虽然是可逆的,但是它的编码方式是公开的,无所谓加密。本文也对Base64编码方式做了简要介绍。
iginkgo18
2020/12/22
1.7K0
加密与安全_使用Java代码操作RSA算法生成的密钥对
在数字化时代,网络通信的安全性是必须关注的重要问题之一。非对称加密算法作为现代密码学的重要组成部分,为保护通信的隐私提供了一种可靠的解决方案。
小小工匠
2024/05/26
2390
加密与安全_使用Java代码操作RSA算法生成的密钥对
Python的RSA加密和PBE加密
最近在写接口的时候,遇到了需要使用RSA加密和PBE加密的情况,对方公司提供的DEMO都是JAVA的,我需要用python来实现。 在网上搜了一下,python的RSA加密这块写的还是比较多的,但是PBE较少。所以我就讲讲我在RSA加密上面遇到的坑,大家权当一乐。PBE加密里面的盐、密钥。
py3study
2020/01/06
1.8K0
一日一技:在Python中使用过滤函数filter
有一个列表 [1,2,False,'','test',0],现在需要把里面所有非空、非False,非0的数据取出来。
青南
2019/05/17
9400
接口数据使用了 RSA 加密和签名?一篇文章带你搞定
接下来我们就来使用 python 来实现 RSA 加密与签名,使用的第三方库是 Crypto:
程序员白楠楠
2021/08/27
2.1K0
AES 高级加密标准
The Advanced Encryption Standard (AES), also known by its original name Rijndael, is a specification for the encryption of electronic data established by the U.S. National Institute of Standards and Technology (NIST) in 2001.
vanguard
2020/03/14
1.5K0
网络安全&密码学—python中的各种加密算法
数据加密是一种保护数据安全的技术,通过将数据(明文)转换为不易被未经授权的人理解的形式(密文),以防止数据泄露、篡改或滥用。加密后的数据(密文)可以通过解密过程恢复成原始数据(明文)。数据加密的核心是密码学,它是研究密码系统或通信安全的一门学科,包括密码编码学和密码分析学。
小羽网安
2024/07/02
6220
网络安全&密码学—python中的各种加密算法
30余种加密编码类型的密文特征分析(建议收藏)
一般MD5值是32位由数字“0-9”和字母“a-f”所组成的字符串,如图。如果出现这个范围以外的字符说明这可能是个错误的md5值,就没必要再拿去解密了。16位值是取的是8~24位。
爱国小白帽
2020/11/16
88K3
相关推荐
别怕,我们的聊天消息,没人能偷看
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验