专栏首页申龙斌的程序人生用欧拉计划学Rust编程(第79题)

用欧拉计划学Rust编程(第79题)

第79题 密码推断

问题描述:

网上银行常用的一种密保手段是向用户询问密码中的随机三位字符。例如,如果密码是531278,询问第2、3、5位字符,正确的回复应当是317。

在文本文件keylog.txt中包含了50次成功登陆的正确回复。

假设三个字符总是按顺序询问的,分析这个文本文件,给出这个未知长度的密码最短的一种可能。

解题步骤

1)分析keylog.txt

文件中前几个数:319、680、180、690、129、620,根据一个3位数回复,比如319,能够知道3出现在1前面,1出现在9前面。

读文件,把这种信息用元组保存起来。

let data = std::fs::read_to_string("keylog.txt").expect("打开文件失败");
let data2 = data.trim().replace("\r", "");
let lines = data2.split("\n");

let mut set: Vec<(&str, &str)> = vec![];
for line in lines {
    let a = &line[..1];
    let b = &line[1..=1];
    let c = &line[2..];
    if !set.contains(&(a, b)) {
        set.push((a, b));
    }
    if !set.contains(&(b, c)) {
        set.push((b, c));
    }
}

2)GraphViz

排除掉重复的元素,手工分析这些先后顺序,也可以得到一个初步结果。如果你知道有一个GraphViz这个画图利器,把刚才的元素关系生成图元命令。

println!("digraph G {{");
println!("  rankdir=LR;");
for (a, b) in set {
    println!("  {} -> {};", a, b);
}
println!("}}");

程序输出这样一组命令:

digraph G {
rankdir=LR;
  3 -> 1;
  1 -> 9;
  6 -> 8;
  8 -> 0;
  1 -> 8;
  6 -> 9;
  9 -> 0;
  1 -> 2;
  2 -> 9;
  6 -> 2;
  2 -> 0;
  7 -> 6;
  8 -> 9;
  3 -> 6;
  7 -> 1;
  1 -> 0;
  7 -> 2;
  1 -> 6;
  6 -> 0;
  7 -> 3;
  3 -> 8;
  2 -> 8;
  7 -> 9;
}

从graphviz.org网站下载并安装GraphViz软件,用上面的几行文本可以快速生成图形。

73162890

多么醒目的答案。


本文分享自微信公众号 - 申龙斌的程序人生(slbGTD)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 用欧拉计划学Rust编程(第67题)

    如果知道一个节点的左、右节点的最大路径,可以很容易地计算出当前节点的最大路径,从底层开始,逐层计算每个节点到底部节点的最大路径上一层的最大路径,所以从每一层中最...

    申龙斌
  • 用欧拉计划学习Rust编程(第40~45题)

    最近想学习Libra数字货币的MOVE语言,发现它是用Rust编写的,所以先补一下Rust的基础知识。学习了一段时间,发现Rust的学习曲线非常陡峭,不过仍有快...

    申龙斌
  • 通过欧拉计划学Rust编程(第684题)

    由于研究Libra等数字货币编程技术的需要,学习了一段时间的Rust编程,一不小心刷题上瘾。

    申龙斌
  • 搭建vim-go环境

    超级大猪
  • 基于 HTML5 Canvas 的元素周期表展示

    之前在网上看到别人写的有关元素周期表的文章,深深的勾起了一波回忆,记忆里初中时期背的“氢氦锂铍硼,碳氮氧氟氖,钠镁铝硅磷,硫氯氩钾钙”、“养(氧)龟(硅)铝铁盖...

    HT_hightopo
  • QQ安全中心 - 动态口令的生成算法

    I won't provide English version for this article. Because the app serves for QQ ...

    周俊辉
  • 团体程序设计天梯赛-练习集 L1-011 A-B

    本题要求你计算A−B。不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A−B。

    C you again 的博客
  • 逆向学习[1]一道入门题详解

    解题思路:找到验证逻辑的条件判断指令处,通过修改条件跳转指令,使得程序接下来走验证成功流程,即可在验证成功弹出消息框中得到对应Key。

    天钧
  • 如何在短短几分钟内,快速了解一门新技术?

    当我们在尝试进入到一个新领域,掌握一门新技术之前,面对前方未知的道路,不确定的结果,总是会打从心底感觉到恐惧,茫然。

    GitHubDaily
  • 链表插入和删除算法

    爱学习的孙小白

扫码关注云+社区

领取腾讯云代金券