第40课 暴力破解
暴力破解(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