课程首页 › 第3部分 › 第40课

第40课 暴力破解

第3部分 不辞辛苦 · 循环结构· 知识点:while循环、条件设计、break

暴力破解(while循环、条件设计、break)

面对6位数的数字密码,黑客们最常使用的破解之法就是暴力破解。所谓暴力破解,就是一种情况一种情况地尝试。

6位数字的密码从000000~999999,一共有多少种可能呢?逐一尝试密码,直到验证到正确密码。这种尝试列举所有可能的情况或选项,以找到解决问题的正确答案或者最优解的方法被称为“穷举”。

暴力破解

现在我们通过编程穷举6位数字密码,找到正确密码并输出。

插图
插图
插图

运行程序:

终于破解了,密码是:002023

程序思路

(1)因为是6位数字密码,在整数类型中无法表示类似000009这样的数字,所以改用字符串对密码进行存储。

(2)定义一个字符串password,它表示要破解的目标密码,初始值为“002023”,这个6位数字密码可以由你设定。

(3)定义一个整数num,用于尝试破解密码。初始值为0,表示从0开始尝试破解密码,直到增加至999999或者找出正确密码。

(4)定义一个整数discuss,它表示一个用于提取num每一位数字的除数,初始值为100000。

(5)定义一个整数numCopy,用于在内部循环中存储num的副本(使得内层循环不改变num),通过不断进行取模运算numCopy % discuss来更新numCopy和执行discuss /=10,拆解出一个6位数字的各位上的数字。

(6)定义一个空字符串guess,用于存储当前尝试的密码组合。将numCopy拆解出来的数字,使用switch语句将对应的字符串拼接到guess

中。例如,如果当前位的数字是3,那么我们将“3”拼接到guess。

(7)使用外层的while循环不断增加num的值,同时在内层循环中提取num的每一位数字,将它转换为字符串,并添加到guess中,直到找到与password相匹配的密码或尝试完所有可能的密码组合,结束循环输出结果。

双重循环

外层循环判断条件是num要小于或等于999999,如果满足就进入循环。这可以实现暴力破解,将所有可能的密码穷举一遍。

通过if语句进行组合密码与真实密码的比对,如果相等就跳出循环,否则num继续自增。

插图

内层循环实现num各位数的提取以及密码guess的组合。条件discuss !=0用于判断numCopy的每一位数字是否提取以及是否与字符串匹配。

划重点

循环中的break通常与if条件一起使用。当某个条件满足时,break会立即终止当前循环的执行,使程序跳出循环体,继续执行循环后的代码。

插图

程序中满足密码匹配后,立即执行break跳出循环。

巩固练习

(1)假设有一个整数num=12345,要提取它的千位数字,应该使用哪个操作?()

A.num % 10

B.num / 10

C.(num % 10000)/ 1000

D.num / 1000

(2)break关键字的主要作用是什么?()

A.继续执行循环内的下一次迭代

B.中止当前循环或switch语句的执行

C.声明变量

D.打印信息到控制台

(3)编写一个C++程序,接收用户输入的一组整数,并计算用户输入的数字之和,当和大于1000时,停止输入并且输出求和结果。

示例:

请输入一个整数:100

请输入一个整数:2

请输入一个整数:200

请输入一个整数:800

数字之和为:1102