From bd3c52c78b1e45d4dc5155d89b685fa6664975a8 Mon Sep 17 00:00:00 2001 From: Min Song Date: Sat, 27 May 2017 22:36:54 +0900 Subject: [PATCH 1/3] updated README w/ usage and examples --- README | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/README b/README index e69de29..2c51c49 100644 --- a/README +++ b/README @@ -0,0 +1,36 @@ +# Junos $9$ secrets encrypt/decrypt script + +## Usage +``` +$ python junosdecode.py +usage: junosdecode.py [-h] [-v] [-e PLAINTEXT | -d SECRET] + +Junos $9$ password en/decrypt script + +optional arguments: + -h, --help show this help message and exit + -v, --version show program's version number and exit + -e PLAINTEXT, --encrypt PLAINTEXT + encrypt plaintext + -d SECRET, --decrypt SECRET + decrypt secret +``` + +## Examples +``` +$ python junosdecode.py -e 'hello' +Junos $9$ secrets en/decrypter +python version by matt hite/min song +original perl version by kevin brintnall + +plaintext version: hello +encrypted version: $9$lateMXVb2JGi7-Dk + +$ python junosdecode.py -d '$9$lateMXVb2JGi7-Dk' +Junos $9$ secrets en/decrypter +python version by matt hite/min song +original perl version by kevin brintnall + +encrypted version: $9$lateMXVb2JGi7-Dk +decrypted version: hello +``` From 6564a07e6c6c4daf7e9eebf417b9fc82866fc4c6 Mon Sep 17 00:00:00 2001 From: Min Song Date: Sat, 27 May 2017 22:37:40 +0900 Subject: [PATCH 2/3] added juniper_encrypt and sub functions --- junosdecode.py | 83 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 71 insertions(+), 12 deletions(-) mode change 100755 => 100644 junosdecode.py diff --git a/junosdecode.py b/junosdecode.py old mode 100755 new mode 100644 index 5c6b3ee..88edcf4 --- a/junosdecode.py +++ b/junosdecode.py @@ -11,8 +11,15 @@ ## version 1.0 ## +############################################################################# +## added juniper_encrypt and the necessary functions +## by Minsuk Song , who also knows +## very little perl +## + import sys -from optparse import OptionParser, OptionGroup +import argparse +import random ################################################################# ## globals @@ -80,23 +87,75 @@ def juniper_decrypt(crypt): decrypt += _gap_decode(gaps, decode) return decrypt +def _reverse(my_list): + new_list = list(my_list) + new_list.reverse() + return new_list + +def _gap_encode(pc, prev, encode): + _ord = ord(pc) + + crypt = '' + gaps = [] + for mod in _reverse(encode): + gaps.insert(0, int(_ord/mod)) + _ord %= mod + + for gap in gaps: + gap += ALPHA_NUM[prev] + 1 + prev = NUM_ALPHA[gap % len(NUM_ALPHA)] + crypt += prev + + return crypt + +def _randc(cnt = 0): + ret = "" + for _ in range(cnt): + ret += NUM_ALPHA[random.randrange(len(NUM_ALPHA))] + return ret + +def juniper_encrypt(plaintext, salt = None): + if salt is None: + salt = _randc(1) + rand = _randc(EXTRA[salt]) + + pos = 0 + prev = salt + crypt = MAGIC + salt + rand + + for x in plaintext: + encode = ENCODING[pos % len(ENCODING)] + crypt += _gap_encode(x, prev, encode) + prev = crypt[-1] + pos += 1 + + return crypt + def main(): - parser = OptionParser(usage="usage: %prog [options] encrypted_string", + parser = argparse.ArgumentParser(description="Junos $9$ password en/decrypt script", version="1.0") + group = parser.add_mutually_exclusive_group() + group.add_argument("-e", "--encrypt", dest="plaintext", help="encrypt plaintext") + group.add_argument("-d", "--decrypt", dest="secret", help="decrypt secret") - (options, args) = parser.parse_args() - - # right number of arguments? - if len(args) < 1: - parser.error("wrong number of arguments") + if len(sys.argv) == 1: + parser.print_help() + sys.exit(1) + args = parser.parse_args() - encrypted_string = args[0] - print "junos password decrypter" - print "python version by matt hite" + print "Junos $9$ secrets en/decrypter" + print "python version by matt hite/min song" print "original perl version by kevin brintnall\n" - print "encrypted version: %s" % encrypted_string - print "decrypted version: %s" % juniper_decrypt(encrypted_string) + if args.secret: + encrypted_string = args.secret + print "encrypted version: %s" % encrypted_string + print "decrypted version: %s" % juniper_decrypt(encrypted_string) + elif args.plaintext: + plaintext_string = args.plaintext + print "plaintext version: %s" % plaintext_string + print "encrypted version: %s" % juniper_encrypt(plaintext_string) + if __name__ == "__main__": main() From 76560578bb2cb2eb5c40da9c0745f1eaec65c3cd Mon Sep 17 00:00:00 2001 From: Minsuk Song Date: Sat, 27 May 2017 22:39:34 +0900 Subject: [PATCH 3/3] Rename README to README.md --- README => README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename README => README.md (100%) diff --git a/README b/README.md similarity index 100% rename from README rename to README.md