Files
pynkode/docs/encipher_decipher_nkode.md
2025-03-26 04:08:35 -05:00

8.2 KiB

Encipher and Decipher nKode

Customer Policy

  • max nkode length: 10
  • number of keys: 6
  • properties per key: 9
  • total number of properties: 54

Customer Cipher

  • property key: [32025 56251 54239 48726 57043 21466 36907 63872 5185 40361 24862 17007 15817 35928 23390 44980 24388 9693 29079 42520 27552 55989 21064 47245 31415 33398 15649 37888 60649 19865 33780 9215 998 23952 774 36297 56975 53701 54205 26202 57035 1589 27142 51011 41787 17416 14611 52249 24554 2826 51850 29516 15825 40218]
  • position key: [12958 41262 53564 57128 61719 22386 19660 14119 45982]

User Cipher

  • property key: [62675 55318 20994 6862 11923 60069 48390 49437 49481 16571 8941 56614 10716 5617 39088 5352 303 46293 35634 37801 3265 31330 43043 35493 381 22746 14834 21538 11121 1556 31651 46121 26370 30287 43028 991 23653 3275 18911 25823 25799 46792 47794 37441 62612 49574 53766 19506 22024 38690 14853 51773 46825 63850]
  • passcode key: [37275 57463 39825 1075 60548 11847 57381 15417 51401 34599]
  • combined position key: [10840 53435 61304 62480 44024 35399 25077 63411 2973]
  • mask key: [14299 50705 35900 48569 35541 57915 43280 32407 20229 24566]

Combined Postion Key

block-beta
  columns 2
  user_pos["user position key:\n[ 6342 29077 15940 11064 23279 56629 11577 49300 47107]"]
  customer_pos["customer position key:\n[12958 41262 53564 57128 61719 22386 19660 14119 45982]"]
  space:2
  xor(("XOR")):2
  user_pos --> xor
  customer_pos --> xor
  space:2
  comb_pos["combined position key\n[10840 53435 61304 62480 44024 35399 25077 63411  2973]"]:2
  xor --> comb_pos

User Keypad

  • keypad:
  • user passcode indices: [26, 31, 1, 53]

nKode Cipher

Passcode Hash

block-beta
    columns 2
    cprop["customer_property_key\n[32025 56251 54239 48726 57043 21466 36907 63872  5185 40361 24862 17007
 15817 35928 23390 44980 24388  9693 29079 42520 27552 55989 21064 47245
 31415 33398 15649 37888 60649 19865 33780  9215   998 23952   774 36297
 56975 53701 54205 26202 57035  1589 27142 51011 41787 17416 14611 52249
 24554  2826 51850 29516 15825 40218]"]
    uprop["user_property_key\n[62675 55318 20994  6862 11923 60069 48390 49437 49481 16571  8941 56614
 10716  5617 39088  5352   303 46293 35634 37801  3265 31330 43043 35493
   381 22746 14834 21538 11121  1556 31651 46121 26370 30287 43028   991
 23653  3275 18911 25823 25799 46792 47794 37441 62612 49574 53766 19506
 22024 38690 14853 51773 46825 63850]"]
    space:2
    xor1(("XOR")):2
    cprop --> xor1
    uprop --> xor1
    space:2
    prop["combined_property_key\n[35274   941 33245 42136 61504 47487 11565 14493 54536 56594 17395 40777
  5141 39337 50158 47964 24171 37128 64165 13745 26465 41175 64107 12840
 31690 55980  1235 49186 51096 19341 63575 38870 25828 11231 43794 36374
 33514 56590 39522   645 47628 45309 53428 21762 22447 34222 60181 32811
  2530 39976 61583 47473 35640 25712]"]
    xor1 --> prop
    pass["user_passcode_indices\n[26, 31, 1, 53]"]
    space:2
    sel(("select\nproperties")):2
    pass --> sel
    prop --> sel
    space:2
    passcode["user passcode properties:\n[ 1235 38870   941 25712]"]:2
    sel --> passcode
    space:2
    pad["zero pad to\nmax nkode length: 10"]:2
    passcode -->pad
    space:2
    paddedpasscode["padded passcode:\n[ 1235 38870   941 25712     0     0     0     0     0     0]"]
    pad --> paddedpasscode
    passkey["passcode key:\n[37275 57463 39825  1075 60548 11847 57381 15417 51401 34599]"]
    space:2
    xor2(("XOR")):2
    passkey --> xor2
    paddedpasscode --> xor2
    space:2
    cipheredpass["ciphered passcode:\n[38216 30625 38972 24643 60548 11847 57381 15417 51401 34599]"]:2
    xor2 --> cipheredpass
    space:2
    hash(("hash")):2
    cipheredpass --> hash
    space:2
    cipheredhashed["hashed ciphered passcode:\n$2b$12$6WJQ1Ilu7fZunT61eo.0e.nN81TiuW5BYHfFrEz.jBwE4dotjOX7e"]:2
    hash --> cipheredhashed

Mask Encipher

block-beta
    columns 3
    passcode_idx["passcode indices:\n[26, 31, 1, 53]"]
    comb_pos["combined position key:\n[10840 53435 61304 62480 44024 35399 25077 63411  2973]"]
    cust_pos["customer position key:\n[12958 41262 53564 57128 61719 22386 19660 14119 45982]"]
    
    space:3
    propidx(["Get Position Idx:\nmap each to element mod props_per_key"])
    passcode_idx-->propidx
    space:1
    xor1(("XOR"))
    comb_pos --> xor1
    cust_pos --> xor1
    
    space:3
    passcode_position_idx["passcode poition indices:\n[8, 4, 1, 8]"]
    propidx --> passcode_position_idx
    
    space:5
    pad1(("Pad with\nrandom indices"))
    passcode_position_idx --> pad1
          
    space:5
    posidx["Padded Passcode Position Indices:\n[8, 4, 1, 8, 5, 4, 0, 1, 2, 3]"]
    pad1 --> posidx
    space:1
    user_pos["user position key:\n[ 6342 29077 15940 11064 23279 56629 11577 49300 47107]"]
    xor1 --> user_pos
    
    space:4
    sel(("select positions"))
    user_pos --> sel
    posidx --> sel
    space:5
    passcode_pos["ordered user passcode positions:\n[47107 23279 29077 47107 56629 23279  6342 29077 15940 11064]"]
    sel --> passcode_pos
    mask_key["mask key\n[14299 50705 35900 48569 35541 57915 43280 32407 20229 24566]"]
    space:4
    xor2(("XOR"))
    mask_key --> xor2
    passcode_pos --> xor2
    space:5
    mask["enciphered mask:\n [36824 40190 64937  1466 22496 47316 45526  3842 28993 29902]"]
    xor2 --> mask

Validate nKode

block-beta
    columns 4
    selected_keys["selected keys:\n[2, 4, 4, 4]"]
    login_keypad["login keypad:\nKey 0: [27 28 20  3  4 41 33 52 35]
Key 1: [18 10 38 39 40  5  6 34  8]
Key 2: [ 0 37 29 21 49 32 24 16 26]
Key 3: [36 19  2 48 13 23 42 25 44]
Key 4: [45  1 47 30 31 14 15 43 53]
Key 5: [ 9 46 11 12 22 50 51  7 17]
"]
    mask["enciphered mask:\n [36824 40190 64937  1466 22496 47316 45526  3842 28993 29902]"]
    mask_key["mask key:\n[14299 50705 35900 48569 35541 57915 43280 32407 20229 24566]"]
    space:4
    
    selectkeys(("select keys"))
    space:2
    xor1(("XOR"))
    mask --> xor1
    mask_key --> xor1
    selected_keys -->selectkeys
    login_keypad --> selectkeys
    space:4 
    
    ordered_keys["ordered keys:\n[[ 0 37 29 21 49 32 24 16 26]
 [45  1 47 30 31 14 15 43 53]
 [45  1 47 30 31 14 15 43 53]
 [45  1 47 30 31 14 15 43 53]]"]
    space:1
    user_position_key["user position key:\n[ 6342 29077 15940 11064 23279 56629 11577 49300 47107]"]
    passcode_pos["ordered user passcode positions:\n[47107 23279 29077 47107 56629 23279  6342 29077 15940 11064]"]
    selectkeys --> ordered_keys
    xor1 --> passcode_pos
    space:7 
    
    get_passcode_idxs(("recover passcode\nposition indices"))
    user_position_key --> get_passcode_idxs
    passcode_pos --> get_passcode_idxs
    space:7
    
    passcode_pos_idxs["padded passcode position indices:\n[8, 4, 1, 8, 5, 4, 0, 1, 2, 3]"]
    get_passcode_idxs --> passcode_pos_idxs
    space:4
    
    get_presumed_idxs(("recover passcode\nproperty indices")) 
    ordered_keys --> get_presumed_idxs
    passcode_pos_idxs --> get_presumed_idxs
    space:7
    
    passcode_prop_idxs["presumed passcode property indices:\n[26, 31, 1, 53]"]
    space:1
    prop["combined_property_key\n[35274   941 33245 42136 61504 47487 11565 14493 54536 56594 17395 40777
  5141 39337 50158 47964 24171 37128 64165 13745 26465 41175 64107 12840
 31690 55980  1235 49186 51096 19341 63575 38870 25828 11231 43794 36374
 33514 56590 39522   645 47628 45309 53428 21762 22447 34222 60181 32811
  2530 39976 61583 47473 35640 25712]"]
    cipheredhashed["hashed ciphered passcode:\n$2b$12$6WJQ1Ilu7fZunT61eo.0e.nN81TiuW5BYHfFrEz.jBwE4dotjOX7e"]
    get_presumed_idxs --> passcode_pos_idxs
    get_presumed_idxs --> passcode_prop_idxs
    space:5
    
    sel(("select\nproperties"))
    passcode_prop_idxs --> sel
    prop --> sel
    space:7
    
    passcode_prop["presumed passcode properties:\n[ 1235 38870   941 25712]"]
    sel --> passcode_prop
    space:7
    
    cipher(("encipher"))
    passcode_prop --> cipher
    space:7
    
    cipheredpass["ciphered passcode:\n[38216 30625 38972 24643 60548 11847 57381 15417 51401 34599]"]
    cipher --> cipheredpass 
    space:8


    comp(["compare"])
    cipheredpass --> comp
    cipheredhashed --> comp
    space:7 
    
    suc(("valid")) 
    fail(("invalid"))
    comp --> suc
    comp --> fail