Flat Earth Catalogue

2017-07-24

Learn to Open Master Locks.
Master brand combination locks are widespread and not great. Here's a program to practice the mental math involved in cracking them. Use this information for good, not evil.


#!/usr/bin/perl

use strict; use warnings;

# generate a Master-type combination
my $first = int rand 40;
my $third = ($first + 4 * int rand 10) % 40; # congruent to first mod 4
my $second = ($third + 2 + 4 * int (1 + rand 8)) % 40; # congruent to first+2 mod 4, not third +- 2

# front disc is serrated so third number can't be found just by tensing shackle and turning dial
my $true_gap = $third % 10;
my $false_gap = ($third + 1 + int rand 9); # non-identical digit

# give discoverable clues
print "\n", 
  "back disc rubs at ", ($first + 34) % 40, ".5\n",
  "front disc catches at ", join(' and ', sort {$a <=> $b} ($true_gap, $false_gap)), 
  "\n\n";

# candidate thirds
my %thirds = map {$_ => 1} 
  grep {
    ($_ % 10 == $true_gap or $_ % 10 == $false_gap) and 
    $_ % 4 == $first % 4
  } 
  0..39;
unless (exists $thirds{$third}) {print "     this program is broken     \n\n"; exit 1}

# user silently calculates first number
# user calculates candidate thirds

while (scalar keys %thirds) {
  print "enter candidate for third number: ";
  my $cand = 0 + <STDIN>;
  if ($cand % 10 != $true_gap and $cand % 10 != $false_gap) {
    print "not congruent to a gap\n"; next
  }
  if ($cand % 4 != $first % 4) {
    print "not congruent to first number\n"; next
  }
  delete $thirds{$cand};
  print "accepted\n";
}

# user tries each candidate on the lock, under tension
print "\nthat's all of them. $third has the most play\n\n";

# user must try up to eight possible second numbers
print "you have eight guesses. enter each combo with whitespace between numbers";
for (1..8) {
  print "$_. ";
  $_ = <STDIN>;
  /(\d\d?)\s+(\d\d?)\s+(\d\d?)/ or next; # perl-haters, there's your line noise
  if ($1 == $first and $2 == $second and $3 == $third) {
    print "\nsuccess!\n\n";
    exit 0
  }
}

# how to fail
print "\nsorry, you're out of time. the combination was $first $second $third.\n\n";


22:14

Powered by Blogger

 

(K) 2002-present. All rights reversed, except as noted.

Links I want to store, sometimes rants about whatever (though I'm not very diligent at posting those yet), and miscellany of my eclectic web-life. Oh, and a very basic layout.

Past
current