事情起因
最近收拾杂物时,发现了好久没用的行李箱,但是忘记了密码。密码锁是3位数齿轮密码,没有重置密码的小孔。于是在网上搜索了一下,发现了一个通用的解决方法。
由于我人比较「懒」,就把计算密码的那部分过程,封装成JS函数,兼容3~4位密码。
运气好的话,密码就是运行结果之一。
幸运的是,我成功找到了密码,故记录过程作为留念。
适用范围
外观类似这样的密码锁都能试试。
解决过程
1. 找到初始值
旋转每个密码齿轮,直到出现缺口,缺口左偏一点。如图:
可以看到,对应的数字就是解码需要的初始值。
这个密码锁的初始值是517。
2. 获取密码
将这个封装好的JS函数,放到可以运行JS的平台执行(如:浏览器控制台)。
// 计算行李箱密码,兼容3~4位的齿轮密码锁
function travelBagPassword(initial) {
// 检查入参是否合法
if (!Object.prototype.toString.call(initial).indexOf('String') ||
initial.length < 3 ||
(new RegExp(`\\d{${initial.length}}`)).test(initial) === false) {
return false
}
// 密码偏移值
const offsets = [
'3'.repeat(initial.length),
'8'.repeat(initial.length),
'-' + '5'.repeat(initial.length)
]
const password_maybe = []
// 计算密码的每个值
const getPasswordPart = (num, add) => {
if (add > 0) {
return ((num + add) > 9 ? (num + add) - 10 : (num + add)).toString()
} else {
return ((num + add) < 0 ? (num + add) + 10 : (num + add)).toString()
}
}
// 计算初始值加上每个偏移值的结果
for (const offset of offsets) {
let offset_arr = Math.abs(offset).toString().split('')
let signed = offset < 0 ? -1 : 1
let password = ''
for (const key in offset_arr) {
password += getPasswordPart(parseInt(initial[key]), parseInt(offset_arr[key]) * signed)
}
password_maybe.push(password)
}
return password_maybe
}
// 运行函数,输入初始值
travelBagPassword('517')
// 得到结果
// Array(3) [ "840", "395", "062" ]
逐一尝试下,结果中的「395」就是这个箱子的密码了。
最后家里两个行李箱,都通过此法得到了正确的密码,行李箱又能用了,开心。