最近有很多读者朋友对Nuallan酒店是北京哪家酒店有疑问。有网友整理了相关内容,希望能回答你的疑惑。关于nuo酒店北京,这个网站已经为你找到了问题的答案,希望对你有所帮助。
由于众所周知的原因,中国的主要邮箱和聊天 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)复制代码
我们现在打印这两个密钥,如下图所示:
数字1024表示生成1024位密钥。也可以写2048或4096……,只要是2的n这边
且 n>4即可。也可以写2048或4096……,只要是2的n这边
且 n>4.位数越多越安全,但加密解密速度越慢。
生成的密钥是 Python 对象,送给别人不方便。因此,我们可以将其转换为pem格式:
public_key_str=public_key.save_pkcs1()private_key_str=private_key.save_pkcs()复制代码
现在,我们得到了两个字符串。这是 pem 公钥和私钥的格式,公钥BEGIN RSA PUBLIC KEY开头,短;私钥BEGIN RSA PRIVATE KEY开头,长。这是 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 类型数据如下图所示:
请注意,这里的这个 bytes 模型数据是不可能的.decode()成字符串。那怎样才能把它发给别人呢?
这时,你可以在它的外层一层覆盖 base64编码,把他变成字符串:
import base64encryptd_msg_str=base64.b64encode(encryptd_msg).decode()复制代码
如下图所示:
现在,你可以把密文写下来
RzwfgCFUhLKYiXM7frOcBL7VyLIh1M7pJ8Gpaz9j7HksjYqsw8DzreFziBNi/S0GGciIfWsvr5pUvYFA7wacOjHqluZ7KVx1oEOdg/x6wyeb1UdQ9cR6PzMlgpidpzUknhsGIAmxjtt6EUL tJVUbzfXHgs5wETxFZQtRHLcKag=
通过任何公共渠道发送给他人。这就是密文。这就是密文。
拿到密文后,拥有私钥的人如何解密?也很简单:
import rsaimport base64encryptd_msg_str='''RzwfgCFUhLKYiXM7frOcBL7VyLIh1M7pJ8Gpaz9j7HksjYqsw8DzreFziBNi/S0GGciIfWsvr5pUvYFA7wacOjHqluZ7KVx1oEOdg/x6wyeb1UdQ9cR6PzMlgpidpzUknhsGIAmxjtt6EUL tJVUbzfXHgs5wETxFZQtRHLcKag='''private_key_str='''—–BEGIN RSA PRIVATE KEY—–MIICXwIBAAKBgQCFpi1gr295Eie/srPSWf66qoCHGMH/W3BJffwUHeF57Ehx6MgMhvmzyNWERmgJ5iixnhHIKyRNbECKiDHXhyx1U1lDYeFq/KPtX8k65aStHwjZi296kWm7IMEcaEhH5VwHIQS5R1kKB5GjI3H0e80xXuSP6IMeYLUl9E0AkpiwDQIDAQABAoGAYNu2N0PtfcjylbNlLyWZvp6i10XSEsap8hkj/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)复制代码
运行效果如下图所示:
RSA 加密对加密内容(明文)有长度限制。因为最后的密文中会有11篇 bytes 内容用于存储加密相关元信息,因此对于1024位密钥,可加密的明文长度为1024因为最后的密文中会有11篇 bytes 内容用于存储与加密相关的元信息,因此对于1024位密钥,可加密的明文长度为1024-8-11=117
bytes。
如何计算字符串的字节长度?可使用以下代码:
msg=';今晚8点在老地方见面;'print(len(msg.encode())复制代码
运行效果如下图所示:
这意味着8个汉字加1个数字长度为25bytes(因为在 Python 里面,一个汉字占3bytes,数字和字母占1bytes,
3?8+1=25)
如果要发送长字符串,需要先将字符串转换成 bytes 类型数据,然后根据117 bytes 一组分成多组,分别对每组进行加密。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 从中切开。这里有可能对应一个中文的三个 bytes 从中切开。但影响不大。以117bytes 加密一个明文块。加密后生成的 bytes 型数据拼接成长字符串,然后整体使用 Base64进行编码。最后,将编码生成的密文发送给他人。如下图所示:
我们在这里生成的密文是:
}
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 型数据的迭代特征一文。
解密程序运行效果如下图所示:
大家注意,如果你的密钥是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系统学习教程,想要这些资料的可以关注私信小编“01”即可(免费分享哦)希望能对你有所帮助
主题测试文章,只做测试使用。发布者:艾迪号,转转请注明出处:https://www.cqaedi.cn/baike/44902.html