Scratch例题:穷举法解密码——从零构建密码破解器
Scratch例题:穷举法解密码
密码破解是编程学习中的经典应用,而穷举法(暴力破解)是最直观的算法之一。在Scratch中,我们可以通过循环和列表实现一个简单的密码破解器。本例假设密码是一个3位字符,每位可以是数字0-9或小写字母a-z,总共有36种可能,因此组合数为36^3=46656种。我们将用Scratch逐一尝试,直到找到正确密码。
设计思路
- 定义字符集:将数字0-9和字母a-z存入列表“字符集”。
- 嵌套循环:使用三重循环遍历所有可能的组合(第一位、第二位、第三位)。
- 拼接字符串:将三个字符拼接成密码字符串。
- 判断匹配:将生成的密码与预设的正确密码(例如“abc”)对比,若相等则停止并输出。
Scratch代码实现
当绿旗被点击
初始化:删除列表“字符集”的全部项,依次添加0-9和a-z
设置变量“密码”为“abc”(正确密码)
设置变量“尝试次数”为0
设置变量“破解结果”为“未找到”
重复执行直到(破解结果 = “找到”)
对列表“字符集”的每一项(作为第一位)
对列表“字符集”的每一项(作为第二位)
对列表“字符集”的每一项(作为第三位)
将“尝试次数”增加1
设置变量“生成密码”为(第一位 + 第二位 + 第三位)
如果(生成密码 = 密码)那么
将“破解结果”设为“找到”
说(拼接“密码是 ”和“生成密码”)
说(拼接“尝试次数 ”和“尝试次数”)
停止全部脚本
否则
继续循环
结束循环
结束循环
结束循环
结束重复注意:在实际Scratch中,列表项索引从1开始,需要先用变量表示索引。上图省略了细节,但核心逻辑如上。
运行效果
程序启动后,会在后台快速枚举所有组合,直到命中正确密码。本例中正确密码为“abc”,程序会在尝试若干次后输出“密码是 abc”和尝试次数。测试中,由于字母顺序靠前,尝试次数较少(约在1000次以内)。如果密码复杂,可能需要数万次,Scratch运行速度较慢,建议将密码设短或缩小字符集。
拓展与优化
- 动态密码长度:利用递归或使用“积木”自定义模块处理可变长度。
- 性能提升:用剪枝策略(如已知部分字符)减少尝试次数。
- 真实应用:理解穷举法的局限性,仅适用于简单密码,实际中应使用更安全的算法。
通过这个例题,你可以掌握Scratch中的循环嵌套、列表操作和条件判断,为学习更高级的算法打下基础。试试修改字符集或密码长度,观察程序行为吧!