2

【编程教室】如何生成乱七八糟的口令

 2 years ago
source link: https://zhuanlan.zhihu.com/p/410643604
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

【编程教室】如何生成乱七八糟的口令

上海交通大学 计算机应用技术硕士

大家好,欢迎来到编程教室~我是Crossin。

这两天有个新闻,说是工信部要求各平台取消对正常外部链接的限制。

吃瓜群众纷纷拍手叫好,毕竟大家都如下情况已经折腾够了:

v2-0ce04a018d6b754e20eaf5e6a445ce00_720w.jpgv2-87c4b64d1f6d89a3b9c37b8965b896db_720w.jpg

出现这种情况,原因在于各平台不想让自己辛苦获取的流量白白被别家薅走,所以限制了其他平台的链接。而其他平台的应对之策,就是弄出火星文一般的口令码,让你复制到其App里打开。(说个冷知识:最初其实是tb主动停止来自wx的跳转链接,也是tb主动禁止bd收录内容的。不清楚的可以搜“杜鹃计划”)

话说回来,如果今天你被监控了,你发的信息都会被人拦截,然后你也想搞个火星文口令躲过自动识别,有什么办法?

我来教大家几个简单的实现。

1. URL Encoding

import urllib.parse
text = 'Crossin的编程教室就是棒啊!就!是!棒!'
secret = urllib.parse.quote(text)
print(secret)

输出结果:

Crossin%E7%9A%84%E7%BC%96%E7%A8%8B%E6%95%99%E5%AE%A4%E5%B0%B1%E6%98%AF%E6%A3%92%E5%95%8A%EF%BC%81%E5%B0%B1%EF%BC%81%E6%98%AF%EF%BC%81%E6%A3%92%EF%BC%81
text = urllib.parse.unquote(secret)
print(text)

这个是URL编码,也叫做百分号编码,可以将中文、符合等非英文字符转成 百分号+字母+数字 的形式,在web开发中经常会用到(比如URL地址里的参数)。不过你也发现了,英文字母是不会动的。

2. Base64

import base64
text = 'Crossin的编程教室就是棒啊!就!是!棒!'
secret = base64.b64encode(text.encode())
print(secret)

输出结果:

b'Q3Jvc3NpbueahOe8lueoi+aVmeWupOWwseaYr+ajkuWViu+8geWwse+8geaYr++8geajku+8gQ=='
text = base64.b64decode(secret)
print(text.decode())

Base64 是一种非常经典的文本编码方式,程序员的最爱。在程序员的聚集地 v2ex 上,你会发现大家留的联系方式都是一串乱码,那些基本都用的是 Base64。

Base64有个特征,就是最后常会用 = 进行补齐(但不是一定会有)。另外,它不能直接对中文进行操作,需要先进行文字编码,通常是 UTF8 或者 GBK。其实这一步本身就让肉身无法直接阅读了,比如上述例子的 UTF8 编码为:

b'Crossin\xe7\x9a\x84\xe7\xbc\x96\xe7\xa8\x8b\xe6\x95\x99\xe5\xae\xa4\xe5\xb0\xb1\xe6\x98\xaf\xe6\xa3\x92\xe5\x95\x8a\xef\xbc\x81\xe5\xb0\xb1\xef\xbc\x81\xe6\x98\xaf\xef\xbc\x81\xe6\xa3\x92\xef\xbc\x81'

但对于计算程序来说,这段编码和原文本几乎是一样的。

3. 移位加密

这是一种很古老的加密方式,据说可以追溯到恺撒在战争中传递密信。原理就是把所有字母都往后移动固定的位数,比如 a->d,b->e, c->f,这样原本的话就看不懂了。

对于中文,虽然没有字母这样的概念,但在计算机里同样也是有一个对应的数值,所以用程序去进行位移计算很容易。

text = 'Crossin的编程教室就是棒啊!就!是!棒!'
secret = ''
key = 5
for i in text:
    secret += chr(ord(i) + key)
print(secret)

输出结果:

Hwtxxns皉缛稐敞宩尶昴棗問&尶&昴&棗&
text = ''
for i in secret:
    text += chr(ord(i) - key)
print(text)

Python 里,内置函数 ord 是把一个字符转成对应的数值,chr 则是发过来,把数值转成对应的字符。

你可以自定义一个 key,用来进行加密解密的计算(记住不要告诉别人 )

你也可以每次用一个随机的 key,然后把 key 藏在你的密文中。比如:
N}z~~ty皏缡稖敤宯尼昺棝啕,尼,昺,棝,@11

解密的时候,先提取 key,然后再进行解密。

使用动态随机key的代码不复杂,就留做今天的作业啦!

------

获取更多教程和案例,

欢迎搜索及关注:Crossin的编程教室

每天5分钟,轻松学编程。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK