见到你的第一眼聊天记录

由于众所周知的原因,国内的各大邮箱、聊天 App 都会监控你接收和发送的信息。如果你需要传递一些绝密内容应,显然你需要对你的内容进行加密。

但是加密的密码你怎么告诉别人呢?打电话说吗?如果是一对一的沟通,这种方式确实没有问题。

但如果现在是单向联系,多个人给你发信息。你想让所有联系你的人,都把信息加密以后才能发给你,并且只有你能解密怎么办?如果只使用一个密码,那么 A 发给你的消息可能会被 B 偷看。难道你需要和每个人都设置一个各自的专用密码?

为了解决这个问题,我们就可以使用非对称加密。非对称加密的加密密钥与解密密钥是分开的。加密密钥可以公开,所有人都能看到。所有人都能使用同一个加密密钥加密信息发送给你。但只有你自己手上的解密密钥能把这个密文解开。

RSA 算法就是一种非对称加密算法。

这种算法非常可靠,密钥越长,它就越难破解。根据已经披露的文献,目前被破解的最长RSA密钥是768个二进制位。也就是说,长度超过768位的密钥,还无法破解(至少没人公开宣布)。因此可以认为,1024位的RSA密钥基本安全,2048位的密钥极其安全。 ——《RSA算法原理(一)》

RSA 算法中的加密密钥,我们称为公钥(Public Key),解密密钥,称为私钥(Private Key)。你只需要保管好私钥即可。公钥可以放在博客上,想给你发信息的人, 只需要用公钥加密信息再发给你即可。

在 Python 中我们如何使用 RSA 算法进行加密解密呢?可以安装一个第三方库,叫做rsa:

pip install rsa复制代码

安装完成以后,我们试着交密一段中文:今晚8点老地方碰头.

第一步,创建公钥和私钥

import rsapublic_key, private_key = rsa.newkeys(1024)复制代码

我们现在打印一下这两个密钥,如下图所示:

见到你的第一眼聊天记录图1

其中的数字1024表示生成1024位的密钥。你也可以写2048或者4096……,只要是2的n此方

且 n>4即可。位数越多越安全,但是加密解密速度越慢。

生成的密钥是 Python 对象,不方便发送给别人。所以我们可以把它们转换为pem格式:

public_key_str = public_key.save_pkcs1()private_key_str = private_key.save_pkcs1()复制代码

如下图所示:

见到你的第一眼聊天记录图2

现在,我们得到了两个字符串。这是 pem 格式的公钥和私钥,公钥以BEGIN RSA PUBLIC KEY开头,较短;私钥以BEGIN RSA PRIVATE KEY开头,较长。

其中,私钥你自己保管好不要泄露。公钥你可以用 QQ 微信邮箱短信等等任意通信工具发送给别人。

密钥只需要生成一次,以后就不需要执行上面的代码了。

有了公钥和私钥以后,我们就可以开始发送信息了。

注意以下代码都是使用 pem 格式的公钥和私钥。

首先我们使用公钥加密信息。

public_key_str = '''-----BEGIN RSA PUBLIC KEY-----MIGJAoGBAIWmLWCvb3kSJ7+ys9JZ/rqqgIcYwf9bcEl9/BQd4XnsSHHoyAyG+bPI1YRGaAnmKLGeEcgrJE1sQIqIMdeHLHVTWUNh4Wr8o+1fyTrlpK0fCNmLb3qRabsgwRxoSEflXAchBLlHWQoHkaMjcfR7zTFe5I/ogx5gtSX0TQCSmLANAgMBAAE=-----END RSA PUBLIC KEY-----'''msg = '今晚8点老地方碰头'public_key = rsa.PublicKey.load_pkcs1(public_key_str.encode())encryptd_msg = rsa.encrypt(msg.encode(), public_key)复制代码

加密以后,我们获得是一个 bytes 型的数据,如下图所示:

见到你的第一眼聊天记录图3

注意,这里的这个 bytes 型数据是不能.decode()成字符串的。那么应该如何把它发送给别人呢?

这个时候,就可以在它的外层套一层 base64编码,让他变成字符串:

import base64encryptd_msg_str = base64.b64encode(encryptd_msg).decode()复制代码

如下图所示:

见到你的第一眼聊天记录图4

现在,你可以把密文

RzwfgCFUhLKYiXM7frOcBL7VyLIh1M7pJ8Gpaz9j7HksjYqsw8DzreFziBNi/S0GGciIfWsvr5pUvYFA7wacOjHqluZ7KVx1oEOdg/x6wyeb1UdQ9cR6PzMlgpidpzUknhsGIAmxjtt6EUL+tJVUbzfXHgs5wETxFZQtRHLcKag=

通过任何一个公开渠道发送给别人了。这就是密文。

拥有私钥的人,拿到密文以后如何解密呢?也很简单:

import rsaimport base64encryptd_msg_str = '''RzwfgCFUhLKYiXM7frOcBL7VyLIh1M7pJ8Gpaz9j7HksjYqsw8DzreFziBNi/S0GGciIfWsvr5pUvYFA7wacOjHqluZ7KVx1oEOdg/x6wyeb1UdQ9cR6PzMlgpidpzUknhsGIAmxjtt6EUL+tJVUbzfXHgs5wETxFZQtRHLcKag='''private_key_str = '''-----BEGIN RSA PRIVATE KEY-----MIICXwIBAAKBgQCFpi1gr295Eie/srPSWf66qoCHGMH/W3BJffwUHeF57Ehx6MgMhvmzyNWERmgJ5iixnhHIKyRNbECKiDHXhyx1U1lDYeFq/KPtX8k65aStHwjZi296kWm7IMEcaEh***j/1BIgJwFRMh3cty/StRaKar862+qPk9Yg8EAZjv16nAZjRcVQ031/F57FGR3JdZ43fuT/no0gV+mEIc72ypNuhUlM9iccyhEq0xX4eixex3nUALBcPY17ElhvaD8cDZoW2QGFAECRQCHR4RHmgOzoyuMWnov7/WetV8Eqxy1/XQOkvSTWEv6Gyc1vlc/xsRGLwXiUt0BFoOnMRCOAQJwjxSnEbbRzey3YdzX4QI9APzqPCqiEZ4eNnh8F7eOmQYSRurx2b5eyEg3zrVgJHCNOE1i8uidT4mLBx4nfIwV8/ttw7TjzvhQtnBtrQJEaAzyCcDEqB8RF9tfsA95dKE8fHLAmppf8fXGeK6pga3w8r18jmlr/i+c7v+dTYDrsmVivla4casbz4UogSdKs6JqIwECPGkUdO0Nqx4z1VPX0w7Lq15vZ5Gj7GEBBlui/Do1eM5ejj7w1pW5DlvKLKnlpASb9mPHZiGY6NwYxMQPfQJEGg5vG+TN7G4PxbCzeInxxIScpmDE8TBPixrIy9qM/cjbExcc1vCiR8+Kbhr/RhYveaGuKIKaXrVBhzQJZDYd8298mmA=-----END RSA PRIVATE KEY-----'''private_key = rsa.PrivateKey.load_pkcs1(private_key_str.encode())encryptd_msg = base64.b64decode(encryptd_msg_str.encode())msg = rsa.decrypt(encryptd_msg, private_key).decode()print(msg)复制代码

运行效果如下图所示:

见到你的第一眼聊天记录图5

RSA 加密对被加密的内容(明文)是有长度限制的。因为最终的密文中会有11 bytes 的内容用来存放加密相关的元信息,所以对于1024位的密钥来说,能加密的明文长度为1024➗8—11=117

bytes。

如果计算一个字符串的字节长度呢?可以使用如下代码:

msg = '今晚8点老地方碰头'print(len(msg.encode()))复制代码

运行效果如下图所示:

见到你的第一眼聊天记录图6

说明这8个汉字加1个数字长度为25bytes(因为在 Python 里面,一个汉字占3bytes,数字和字母占1bytes,

3✖8+1=25)

如果要发送一段很长的字符串,就需要把字符串先转成 bytes 型数据,再按照117 bytes 一组拆分成很多组,对每一组分别加密。解密的时候,以密钥位数/8bytes一组先切分密文,再逐一解密,最后拼出明文的 bytes 型数据以后再.decode()转成字符串。

我们先来实现加密的代码:

def encrypt(msg, public_key): msg_bytes = msg.encode() encryptd_msg = b'' chunk_size = len(msg_bytes) // 117 + 1 for chunk_index in range(chunk_size + 1): chunk = msg_bytes[chunk_index * 117: (chunk_index + 1) * 117] encryptd_msg += rsa.encrypt(chunk, public_key) encryptd_msg_str = base64.b64encode(encryptd_msg).decode() return encryptd_msg_str复制代码

在这段代码中,我们是先把明文转成 bytes 型的数据后,再进行切片。这里有可能会把一个中文对应的三个 bytes 从中切开。不过这影响不大。以117bytes 为一个明文块进行加密。把加密后生成的 bytes 型数据拼接成长字符串,再整体使用 Base64进行编码。最后把编码生成的密文发送给别人即可。如下图所示:

见到你的第一眼聊天记录图7

我们在这里生成的密文为:

K2Tb9tDQPXBiuCBuWxOR9zBTbDSN2WaF+n+P2RUA9CHdIKvIHvqfMZ60xTsJ7UqZlB4ykzu/ccsTEmp8vqiVaJSSwg5TgDYLdPmk5/6leZaBW4BqyJ2g0PcyCcUvhjxc7P4AIC6MKYZ+74qTgm+Pf8qnY/riOeEZUuxoq0KaFZQOpvGpwnAgpCad8a6MJ7TbyZpepkZr+GbFDdbmegrA6HN9zCIw30c4g0RCiD01PwerUtbK9YXr/aO8hrFEim8bWDos3bpNrQtk8ST4fM9OczXKEoTSuv+f+Ue2s1YFJ00tAyD4GF8QeZ5mUc2ydNyovkvEfhwhy1eOcI/HQQZn2DPxLb3gB4tgE/Hoo4Xblj8ZWpeMe5BrAdT4Dk1qduOJ/A3RnfvhEbojwx30pEU+JipW4AqCPxK26Q+WsYyqVCBM29vWWgxttthxBidpM0GYII1OIfZvWG8GAAMPvotTwrdGOF/Nk355qLlwiHJhsjz0uN0p9PjyUY+xHobDrmuggBHejM69PwelnG5ubxjhBoqKtbBttU4IWfDZq+d3LZdhwZMp2PsXkSzu+IIgpAn0+F/5bZkRAv8XTAv1YFnYLwJI9vyXfMIyoo4wcqDpNmJrMoaW0hvpJ8jMPna0lI9/Up2JO8GRhq+C+pgeM37OUE70UGrqw1R25yO8Y60of69HqfdFgLalhD7egJ42gRt9Lman7dsokWrpySp6Tq7jFJ/h/OL2Kma8Tqeodd1B0/bINNBkK2hb5EIq7cu6xEd5LevieYllEw0LNK03aWERMfkIuOSabzDfn1kedZnK4PlZ+DiXaoe8uUlAlfZsWNBNV94C3+Ji/a1jYk+ZEUZMxA==

接下来我们来编写解密程序:

def decrypt(encryptd_msg_str, private_key): encryptd_msg = base64.b64decode(encryptd_msg_str.encode()) chunk_size = len(encryptd_msg) // 128 msg_bytes = b'' for chunk_index in range(chunk_size): chunk = encryptd_msg[chunk_index * 128: (chunk_index + 1) * 128] msg_bytes += rsa.decrypt(chunk, private_key) return msg_bytes.decode()复制代码

在解密程序中,我们先把 Base64编码的字符串解码为 bytes 型的数据,然后以128bytes 为一组进行拆分。分别对每一组进行解密。再把每次解密生成的 bytes 型数据拼接。最后把拼接完成的数据使用.decode()转换为字符串。

特别要注意,对每一块密文,在解密完成以后不能直接.decode()。因为它末尾可能只有半个中文,直接转字符串会导致报错,必需先拼接完解密后的所有 bytes 数据,再转成字符串。更多关于 bytes 型数据切片的问题,请参阅我以前的公众号:一日一技:Python 的 bytes 型数据的迭代特征一文。

解密程序运行效果如下图所示:

见到你的第一眼聊天记录图8

大家注意,如果你的密钥是2048位的,那么加密时一个明文会以245bytes 一组先切分再加密;解密时,密文会以256bytes 一组先切分再解密。

最后,大家如果有任何不希望被众所周知的组织看到的信息想发送给我,可以使用下面这个公钥对信息进行加密,然后把密文发送给我:

-----BEGIN RSA PUBLIC KEY-----MIIBCgKCAQEApQSWvu/C5NH3aEGMqFTeiJrXbOM2Qi+uXc+FiApEWDYdyEMPQWKHexJiFoyAa+JJ8OfmkTIVktkx0VqEcvfjfKxrGPk9JuQ6WL4/UUYs8/F+2ArDnMyRlWcqaf1658QjrWYbFHxQ0eEOZ6RcRKME3p431mDMqeDpQtqlDyeMKGp7hSv5gnpdQjlyl1Jgoa4lAzyPv66IM1PD207qjLFCTY0udiWSFDiUlvgXcBHDypUqWGOUUSLEvVXIE+KYNbR2g23iRa1IJGSCEz1xllt7QpygCwwd+vVGD8zaCHOEE7Fex0K/ybhiNvdt19qgxE8aIwGt0ln71DNpn+yZsq4fIwIDAQAB-----END RSA PUBLIC KEY-----复制代码

密钥是2048位。


最后,小编想说:我是一名python开发工程师,

整理了一套最新的python系统学习教程,

版权声明:本文来自用户投稿,不代表【爱生活网】立场,本平台所发表的文章、图片属于原权利人所有,因客观原因,或会存在不当使用的情况,非恶意侵犯原权利人相关权益,敬请相关权利人谅解并与我们联系(邮箱:youzivr@vip.qq.com)我们将及时处理,共同维护良好的网络创作环境。

(0)
上一篇 2023年01月21日 15:33
下一篇 2023年01月21日 15:34

相关推荐

  • 意大利国家德比指的是尤文图斯和哪支足球队的比赛

    国家德比现在广义主要泛指一个国家内最强的两只队伍PK,所以现在的意大利德比就被誉为是国际米兰和尤文图斯了。尤文图斯不用多讲,多年以来一直是意甲的头牌,基本格局就属于老大座椅稳当当,老二老三多晃荡。在金融危机以前,意甲依然还是欧洲赛场最有人气的联赛。米兰双雄也是大牌云集,青年人才辈…

    2023-05-24
  • 东亚杯一战未胜的国足你怎么评价

    东亚杯这种级别比赛要什么成绩?尤其实在新老接替的时期。成绩重要?还是考察队员重要?以后国家队还指着那些老队员,俺可也想指着他们,可毕竟年龄不饶人,大一点年龄他的反应速度就会明显下降,郑智就是个例子,在国内联赛他37岁还行,因为我国联赛水平低。但在国家队明显就看出了差距非常大。多努…

    生活百科 2023-05-24
  • 为什么现在的餐饮店线上订单越来越少了

    外卖经历过疯狂扩张期,如今已是红海市场,无论什么品类,竞争都非常激烈,以茶饮市场为例,茶饮是典型的消费者既看品牌又看价格的品类。“蜜雪冰城”柠檬水5元/杯,“一点点”柠檬水8元/杯,茶百道、cooc等在10元以上,我们综合看单量,由于价格实惠,冰雪冰城的柠檬水销量长居同商圈第一。…

    2023-05-24
  • 一个拥有一万块钱的人给了你一千块和一个只有一千块的人给了你九百块你会选择和哪一个在一起生活

    我会选择一个只有一千块钱却愿意给我九百块钱的人一起生活跟谁在一起要看你自己的心意。为啥来这问?一个有一万给你一千,一个有一千给你九百。跟你跟谁在一起真没多大关系。因为这一千九百的,你自己可以挣到,没必要等着谁给你。也就是说,你问问自己的心,你更爱谁,而不是谁更爱你。因为,只有你爱…

    2023-05-24
  • 美国疫情会使美国衰退吗,美国会因为疫情而衰落吗

    美国在世界上的地位,由于资本主义的矛盾和冲突和政治制度的局向性,已经越过了顶峰。西方强行在世界推行其所谓的“价值观”,就象黑社会集团的强买强卖,杀人越货,干得越多,对立情绪越大。对立情绪的增加,实质上是地位的下降,只不过是没直接暴力对立时,有的会为了既得利益,委屈求全,把它埋在心…

    生活百科 2023-05-24
  • 你觉得哪些功夫明星是有真功夫呢

    以下是我认为有真功夫(能打)的明星:一、李小龙龙哥还需要解释么?没有特技的年代,拍摄的动作就如同实际!1.速度2.爆发力3.器械4.腿法2、梁小龙(腿法极度变态)图1:带你看看梁小龙的手(有功夫的手)图2:没有特技的年代,看动作就知道功夫感受一下什么是腿法,这是高科技合成不了的!…

    2023-05-24
  • 忠臣一定是好人吗

    在历代广大人民的普遍认识当中,忠臣的定义就是好人。忠臣不一定只是忠君,忠臣忠于的是国家民族。为国家民族矢志不渝,舍生忘死的人才叫真正的忠臣。张骞是忠臣,他出使西域十几年始终不辱使命,极尽千难万险最后抱着脱了毛的旌节,回到大汉朝复命。此时的汉朝武帝已经逝世文帝早已继位。所以张骞忠于…

    2023-05-24
  • 国足主教练李铁是哪里人

    他怎样想的,只有他知道。关于专业的问题,他肯定学过足球教练的课程,并且职教过中超球队,取得一定的成绩。虽然说中国足协啥都不是,但选教练不会选个门外汉吧,比如不会选我,虽然我只要求一个月3万就好,。足球运动是个复杂的体系,教练负责战术,球员负责执行。这里面涉及太多东西了,教练选球员…

    生活百科 2023-05-24
  • 月薪六千多就可以买一辆奥迪a4l

    导读:“月薪6000元,分期买一台低配的奥迪A4L有没有压力呢?”这是一位粉丝在后台给我的留言。我相信有很多的读者看完题目之后会和我有着相同的想法,那就是月薪6000元买奥迪A4L肯定是有压力的,如果说你是我自己的朋友我还真的不介意你去购买这款车,我直接建议你购买一台10万元左右…

    2023-05-24
  • 乾隆为什么让纪晓岚和珅留在身边

    乾隆皇帝的确让纪晓岚留在身边了。当初廷议外放纪晓岚的时候,乾隆以其文学优长留京。乾隆这年将纪晓岚留京后,提拔他为侍学士。但终其一生,也就给了他一个协办大学士身份,没让他当大学士,成为真正实权人物。乾隆欣赏纪晓岚的文学才干,但对他并不看重。乾隆三十三年,纪晓岚的亲家卢见曾犯事,纪晓…

    2023-05-24