(不是标题中所述问题的答案,而是解决潜在问题的一种方法)。
我想我(主要是)对从过去的密码列表中生成应急密码的算法进行了反向工程。不幸的是,我没有华硕主板,所以我无法验证它是否可以正确预测新密码,但是在已知密码的日期运行以下发布的代码段始终可以得出正确的结果。如果您尝试一下,但对您却行不通,请告诉我。
仅仅通过以各种方式查看给定的数据(例如,通过制作每月固定日期的密码表),就可以看到一些模式。
如果我们在密码中这样标记字母:01234567
,那么很容易看到字母6和7是由月份中的唯一决定的(因此完全独立于月份或年份)。对于字母7,只需将月份中从零开始的日期用作字符串的索引AAAABLDDBB0LB211C9BAAAAABLDDBB0
。同样,字母6是字符串LBAL0AL0ADLADLADLADBADBABBAB2AA
。
对于字母5,也很容易看出,除了月份中的某天,月份的奇偶性(即除以2的余数)也很重要。对于奇数月,必须使用参考字符串BADBOA01AAH1ABBALLBABLBAH1ADL1A
,对于偶数月而言A0CAABALBBALBBAH1ABH1ABLABL9ABO
。
字母2、3和4非常相似,每个月只需要使用一个不同的查找表(即,每个字母都有十二个查找表)。
字母1还考虑了年份的平价。因此,这里有24个总查询表,奇数年12个,偶数年12个。实际上,这些查询表中的许多表都以相同的顺序包含相同的字母,它们只是从该顺序的不同点开始。我猜这表明存在一些我尚未设法弄清楚的潜在模式。
字母0有点复杂,我还不能完全确定模式。看来,这取决于年份和月份,4个基本序列(一OLLAA1AO
,ADBA4CAL
,AD2AH9AB
,AB1A0BB0
)被选中,并通过一些具体的量旋转。但是,似乎2002-2009年的模式与2010年和2011年的模式不同(实际上,2010年的行为与2008年相同,2011年的行为与2009年相同),因此很难预测此序列将如何继续。
相反,由于到此为止,我们已经确定了8个字母中的7个,而且最后一个字母似乎只有12种可能,因此可以尝试强行使用密码。如果您按频率在前面提到的4个序列中按顺序尝试丢失的字母,那么两次尝试后,您应该已经有50%的机会获得正确的密码。
以下是Javascript的一个片段,该片段在运行时要求您输入日期,并显示该日期的12种可能的密码(按可能性排序)。对于今天的日期(2016年2月28日),这会给你X0BLB9BD
,与X
正在之一ABLOD10942CH
。
(function() {
let today = new Date();
let date = prompt("Enter a date", today.toISOString().substring(0, 10));
let tables = [
[["AAAABLDDBB0LB211C9BAAAAABLDDBB0"]],
[["LBAL0AL0ADLADLADLADBADBABBAB2AA"]],
[["BADBOA01AAH1ABBALLBABLBAH1ADL1A", "A0CAABALBBALBBAH1ABH1ABLABL9ABO"]],
[["A49BLA0ODBLA0OD1ALAOD2ALABCA0OA", "BCA0AHBL20A4BLBAOADLBA0AD1ABA", "1ABAA9BLAAACBLA0OD2LAHBD2ALABL2", "ALAB1A0AHB1A0A4BLBAA49BBA0AD1L", "0AD1ABAA91ALAACBLAHACA0AHBD2AAH", "BD2AOAB1AAOAB1A0A491ABA49BBA0A", "BBA0OD1AB0OD1ALAACAALABCA0AHB1A", "0AHBL2AOABLBAOAB1ABOAD1ABA49BAB", "A49BLA0ODBLA0OD1ALAOD2ALABCA0O", "0AHBL2AOABLBAOAB1ABOAD1ABA49BAB", "A49BLA0ODBLA0OD1ALAOD2ALABCA0O", "BCA0AHBL20A4BLBAOADLBA0AD1ABAOD"]],
[["DA1HABBDAA24ABBLA244A9LLABAA99O", "9LLA2AA9LLBABAACOBAALBACOAALB", "BACOBALBAA10AALDA100AO0DA1HAOOB", "O0DA1HAO00DA1HABBDAA24ABBLA244", "4ABBDA24AA9LLA2AA9LLBABAACOBAAL", "ABAA9OBABBBACOBALBAA10AALDA100", "0AALBA10AAO0DA1HAO00DA1HABBDAA2", "A1HAOBDA114ABBDA24AA9LLA2AA9LLB", "LLA24A9LLLABAA9OBABBBACOBALBAA", "LA24A9LLAABAA9LBABAAACOBALBACC0", "COBABBACOOAALBA10AAA0DA10AO0DD", "DA10AO0DAA1HAO0DA1HHABBDA24ABBL"]],
[["LA24ABBDAA1HAO0DA1H0AALBA10AAAB", "1HAOBDA1H0AALDA10AAABAACOBABA", "AO0DA10AAALBACOBABAAA9LLA24ABBB", "LBACOBABAAA9LLA24ABBBDA1HAO0DD", "A9LLA24A9BBDA1HAOBDDA10AA0DA1CO", "BDA14ABBDDA10AO0DA1COBALBACOBL", "A1HAO0DA110AALBACOBBABAA9LLA224", "0AALBACOBBABAA9LLA224ABBDA1HAAO", "ABAA9LLAB24ABBDA14AAO0DA1HAO0L", "AO0DA10AAALBACOBABAAA9LLA24ABBB", "LBACOBABBAA9LLA24A9BBDA1HABBDD", "A9LLABAA9BBDA24ABBDDA1HAO0DA1CO"]],
[["BL4AA20BAAAA2HBA1LDBHBA1ODA90A1", "ODA9BBAOBACBDAOL4AADABLAAA20B", "AA2HBA1LDBHAA1ODA9BA1OLACBBAOLA", "CBDABL4AADABLAAA2HB0AAABHBA1OO", "HAA1ODA9BA10LACBDAOLACLDABLAALD", "AB0AAA2HB0BAABHAA1OOB4AA1OLACA", "10LACBDABBACLDABLAALDA90AAABH90", "BAOBHAA1OOB4AA10LACAA20LACLDA0B", "A1LDAB0AALDA90BAABH9BBAOB4AA1A", "OLA9BBAOLACBDABL4AADABLAAA2HB0A", "AA2HBA1ODBHAA1ODA9BA1OLACBDAOL", "CBDABLAAADAB0AAA2HB0AAABHAA1OOB"], ["BAABHAA1OOB4AA1OLACAA10LACLDA0B", "ACLDAB0AALDA90AAABH90BAOB4AA", "L4AA10LACAA20LACLDAHBA1LDAB0A1O", "DA90BAABH9BBAOB4AA1AOL4AA10LAA", "A20BACLDAHBA1LDA90A1ODA90BAOBAC", "BBAOB4AA1ABL4AA20LAAAA2HBA1LDB", "BA1ODA90B1ODA9BBAOBACBDAOL4AADA", "BLAAA20BAAAA2HBA1LDBHAA1ODA90A1", "OLA9BBAOBACBDABL4AADABLAAA20B0", "A1LDAB0AALDA90BAABH9BBAOB4AA1AO", "L4AA10LACAA20BACLDAHBA1LDA90A1", "DA90BAOBH9BBAOB4AA1AOL4AA20LAAA"]]
];
let match = date.match(/^(\d{4})-(\d{2})-(\d{2})/);
if (!match) {
alert("Invalid date: " + date);
return;
}
let [_, y, m, d] = match.map((a,b) => +a)
let pass = "";
for (let i = 6; i >= 0; --i) {
let letters_map = tables[i];
let year_map = letters_map[y % letters_map.length];
let month_map = year_map[(m - 1) % year_map.length];
pass += month_map[d - 1];
}
let final_letters = "ABLOD10942CH";
let output = []
for (let x = 0; final_letters[x]; ++x)
output.push(final_letters[x] + pass);
alert(output.join("\n"));
})();