Files
pynkode/docs/encipher_decipher_nkode.md
2025-03-26 04:14:13 -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: [42782 22411 58796 11465 49503 56275 38775 38081 7026 16254 14654 36893 55835 42117 397 53181 30070 49716 9591 26367 43862 44491 15032 6140 27166 25935 32851 1343 59160 16484 19970 19858 51729 7378 38465 28158 54598 17069 55468 61288 4228 11257 1486 8676 38279 55278 49181 18796 24775 6931 20611 57138 59596 36232]
  • position key: [12647 30491 17139 56844 38964 47773 48376 30998 47349]

User Cipher

  • property key: [33847 39397 2529 4886 18590 30214 36385 48387 45829 57638 20358 47401 15283 40354 57184 4978 23666 27711 53811 25217 41251 28914 39980 49243 50901 59505 64895 1640 29549 35643 5917 44770 1327 40377 63154 42643 27727 34100 38270 40653 59421 61433 33944 52893 5800 59979 60549 28886 65479 26388 12482 30070 62886 928]
  • passcode key: [39941 46272 6788 28608 6629 37858 57195 10700 63193 44873]
  • combined position key: [17324 5420 26420 62365 37521 21226 5241 59891 59082]
  • mask key: [59295 36535 38305 40214 13117 40275 7336 42576 57021 2814]

Combined Postion Key

block-beta
  columns 2
  user_pos["user position key:\n[29387 25143  9671 11665  2725 59511 43137 37093 24127]"]
  customer_pos["customer position key:\n[12647 30491 17139 56844 38964 47773 48376 30998 47349]"]
  space:2
  xor(("XOR")):2
  user_pos --> xor
  customer_pos --> xor
  space:2
  comb_pos["combined position key\n[17324  5420 26420 62365 37521 21226  5241 59891 59082]"]:2
  xor --> comb_pos

User Keypad

  • keypad:
  • user passcode indices: [8, 47, 15, 26]

nKode Cipher

Passcode Hash

block-beta
    columns 2
    cprop["customer_property_key\n[42782 22411 58796 11465 49503 56275 38775 38081  7026 16254 14654 36893
 55835 42117   397 53181 30070 49716  9591 26367 43862 44491 15032  6140
 27166 25935 32851  1343 59160 16484 19970 19858 51729  7378 38465 28158
 54598 17069 55468 61288  4228 11257  1486  8676 38279 55278 49181 18796
 24775  6931 20611 57138 59596 36232]"]
    uprop["user_property_key\n[33847 39397  2529  4886 18590 30214 36385 48387 45829 57638 20358 47401
 15283 40354 57184  4978 23666 27711 53811 25217 41251 28914 39980 49243
 50901 59505 64895  1640 29549 35643  5917 44770  1327 40377 63154 42643
 27727 34100 38270 40653 59421 61433 33944 52893  5800 59979 60549 28886
 65479 26388 12482 30070 62886   928]"]
    space:2
    xor1(("XOR")):2
    cprop --> xor1
    uprop --> xor1
    space:2
    prop["combined_property_key\n[ 9001 52846 60493 16351 35265 44501  6486 10690 43127 56920 30392 10548
 57768 14631 57069 56527 10500 44555 63300  1150  2677 56633 42644 55207
 44235 36158 32044   855 38005 52063 22815 58224 53054 33131 24819 52077
 47369 51097 19922 29093 63641 50176 33110 61305 33583 15781 11416 14778
 40704 31751 24641 43588  7530 36392]"]
    xor1 --> prop
    pass["user_passcode_indices\n[8, 47, 15, 26]"]
    space:2
    sel(("select\nproperties")):2
    pass --> sel
    prop --> sel
    space:2
    passcode["user passcode properties:\n[43127 14778 56527 32044]"]:2
    sel --> passcode
    space:2
    pad["zero pad to\nmax nkode length: 10"]:2
    passcode -->pad
    space:2
    paddedpasscode["padded passcode:\n[43127 14778 56527 32044     0     0     0     0     0     0]"]
    pad --> paddedpasscode
    passkey["passcode key:\n[39941 46272  6788 28608  6629 37858 57195 10700 63193 44873]"]
    space:2
    xor2(("XOR")):2
    passkey --> xor2
    paddedpasscode --> xor2
    space:2
    cipheredpass["ciphered passcode:\n[13426 36218 50763  4844  6629 37858 57195 10700 63193 44873]"]:2
    xor2 --> cipheredpass
    space:2
    hash(("hash")):2
    cipheredpass --> hash
    space:2
    cipheredhashed["hashed ciphered passcode:\n$2b$12$n5xAQRuWhK3MiLsQHYiRu.p2Mam48sH7W/L7BojTBkyoQuUGa6/sO"]:2
    hash --> cipheredhashed

Mask Encipher

block-beta
    columns 3
    passcode_idx["passcode indices:\n[8, 47, 15, 26]"]
    comb_pos["combined position key:\n[17324  5420 26420 62365 37521 21226  5241 59891 59082]"]
    cust_pos["customer position key:\n[12647 30491 17139 56844 38964 47773 48376 30998 47349]"]
    
    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, 2, 6, 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, 2, 6, 8, 8, 3, 8, 6, 3, 7]"]
    pad1 --> posidx
    space:1
    user_pos["user position key:\n[29387 25143  9671 11665  2725 59511 43137 37093 24127]"]
    xor1 --> user_pos
    
    space:4
    sel(("select positions"))
    user_pos --> sel
    posidx --> sel
    space:5
    passcode_pos["ordered user passcode positions:\n[24127  9671 43137 24127 24127 11665 24127 43137 11665 37093]"]
    sel --> passcode_pos
    mask_key["mask key\n[59295 36535 38305 40214 13117 40275  7336 42576 57021  2814]"]
    space:4
    xor2(("XOR"))
    mask_key --> xor2
    passcode_pos --> xor2
    space:5
    mask["enciphered mask:\n [47520 43888 15648 49961 27906 45250 17047  3793 62252 39451]"]
    xor2 --> mask

Validate nKode

block-beta
    columns 4
    selected_keys["selected keys:\n[3, 2, 2, 0]"]
    login_keypad["login keypad:\nKey 0: [ 9 19 38 39 31  5 24 25 26]
Key 1: [18  1 20 12 13 50  6 34 53]
Key 2: [36 37 47 21 40 41 15 43 17]
Key 3: [ 0 10  2  3  4 23 42  7  8]
Key 4: [45 46 11 30 22 32 51 16 35]
Key 5: [27 28 29 48 49 14 33 52 44]
"]
    mask["enciphered mask:\n [47520 43888 15648 49961 27906 45250 17047  3793 62252 39451]"]
    mask_key["mask key:\n[59295 36535 38305 40214 13117 40275  7336 42576 57021  2814]"]
    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 10  2  3  4 23 42  7  8]
 [36 37 47 21 40 41 15 43 17]
 [36 37 47 21 40 41 15 43 17]
 [ 9 19 38 39 31  5 24 25 26]]"]
    space:1
    user_position_key["user position key:\n[29387 25143  9671 11665  2725 59511 43137 37093 24127]"]
    passcode_pos["ordered user passcode positions:\n[24127  9671 43137 24127 24127 11665 24127 43137 11665 37093]"]
    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, 2, 6, 8, 8, 3, 8, 6, 3, 7]"]
    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[8, 47, 15, 26]"]
    space:1
    prop["combined_property_key\n[ 9001 52846 60493 16351 35265 44501  6486 10690 43127 56920 30392 10548
 57768 14631 57069 56527 10500 44555 63300  1150  2677 56633 42644 55207
 44235 36158 32044   855 38005 52063 22815 58224 53054 33131 24819 52077
 47369 51097 19922 29093 63641 50176 33110 61305 33583 15781 11416 14778
 40704 31751 24641 43588  7530 36392]"]
    cipheredhashed["hashed ciphered passcode:\n$2b$12$n5xAQRuWhK3MiLsQHYiRu.p2Mam48sH7W/L7BojTBkyoQuUGa6/sO"]
    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[43127 14778 56527 32044]"]
    sel --> passcode_prop
    space:7
    
    cipher(("encipher"))
    passcode_prop --> cipher
    space:7
    
    cipheredpass["ciphered passcode:\n[13426 36218 50763  4844  6629 37858 57195 10700 63193 44873]"]
    cipher --> cipheredpass 
    space:8


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