Files
pynkode/docs/encipher_decipher_renew_nkode.md
2025-03-26 08:02:10 -05:00

12 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: [40493 16536 22567 8632 16931 48077 38465 62133 61510 60074 30483 15029 32328 35555 12264 4839 56666 52299 23010 54024 11530 38809 33384 9334 53340 25808 36388 7068 48724 2963 19292 41164 31037 24848 7109 29039 26458 18532 7462 19458 51071 45191 60228 22739 41943 36765 29356 35589 3387 28997 31698 23822 30837 4299]
  • position key: [ 8625 16938 65018 7492 24125 667 1225 54737 47670]

User Cipher

  • property key: [57486 43228 16207 60359 59029 6255 7588 52492 24710 2551 40990 56898 56863 1051 48892 2945 40292 31660 45216 53538 40537 15451 52595 37467 3706 19342 38794 33132 21407 3639 12679 9190 10068 50771 64668 35246 60714 28831 4623 8674 56989 23715 57671 23914 51409 36438 10577 34976 29440 9581 47915 29410 39979 5656]
  • passcode key: [21257 32848 55275 58059 52662 31196 41361 14925 10153 11854]
  • combined position key: [34963 12677 35658 5478 60936 17345 54640 40685 50309]
  • mask key: [23832 11427 59440 48739 10483 30872 4800 48753 55621 53879]

Combined Postion Key

block-beta
  columns 2
  user_pos["user position key:\n[58068 33848 20979 58547 24202 53969 27574 25558 64861]"]
  customer_pos["customer position key:\n[ 8625 16938 65018  7492 24125   667  1225 54737 47670]"]
  space:2
  xor(("XOR")):2
  user_pos --> xor
  customer_pos --> xor
  space:2
  comb_pos["combined position key\n[34963 12677 35658  5478 60936 17345 54640 40685 50309]"]:2
  xor --> comb_pos

User Keypad

  • keypad:
  • user passcode indices: [22, 34, 45, 43]

nKode Cipher

Passcode Hash

block-beta
    columns 2
    cprop["customer_property_key\n[40493 16536 22567  8632 16931 48077 38465 62133 61510 60074 30483 15029
 32328 35555 12264  4839 56666 52299 23010 54024 11530 38809 33384  9334
 53340 25808 36388  7068 48724  2963 19292 41164 31037 24848  7109 29039
 26458 18532  7462 19458 51071 45191 60228 22739 41943 36765 29356 35589
  3387 28997 31698 23822 30837  4299]"]
    uprop["user_property_key\n[57486 43228 16207 60359 59029  6255  7588 52492 24710  2551 40990 56898
 56863  1051 48892  2945 40292 31660 45216 53538 40537 15451 52595 37467
  3706 19342 38794 33132 21407  3639 12679  9190 10068 50771 64668 35246
 60714 28831  4623  8674 56989 23715 57671 23914 51409 36438 10577 34976
 29440  9581 47915 29410 39979  5656]"]
    space:2
    xor1(("XOR")):2
    cprop --> xor1
    uprop --> xor1
    space:2
    prop["combined_property_key\n[62032 50130 36776 54558  8506 61182  6770  6684 21325 58903 51619 53457
 24017 10096 25891 36737 43828 60364 23965 63299 43548 43762 63289 61210
 16490 21923 14215  6365  4383 48550 62830 53206  5237  2426 49278 33751
 21542  2104 49342 42984 62776 19754 59167 25211    60 58461   118  9841
 52387  3482 40915 54740 30225  8961]"]
    xor1 --> prop
    pass["user_passcode_indices\n[22, 34, 45, 43]"]
    space:2
    sel(("select\nproperties")):2
    pass --> sel
    prop --> sel
    space:2
    passcode["user passcode properties:\n[63289 49278 58461 25211]"]:2
    sel --> passcode
    space:2
    pad["zero pad to\nmax nkode length: 10"]:2
    passcode -->pad
    space:2
    paddedpasscode["padded passcode:\n[63289 49278 58461 25211     0     0     0     0     0     0]"]
    pad --> paddedpasscode
    passkey["passcode key:\n[21257 32848 55275 58059 52662 31196 41361 14925 10153 11854]"]
    space:2
    xor2(("XOR")):2
    passkey --> xor2
    paddedpasscode --> xor2
    space:2
    cipheredpass["ciphered passcode:\n[42032 16430 13238 32944 52662 31196 41361 14925 10153 11854]"]:2
    xor2 --> cipheredpass
    space:2
    hash(("hash")):2
    cipheredpass --> hash
    space:2
    cipheredhashed["hashed ciphered passcode:\n$2b$12$c62ezzyLW3QzUMjYUPSioexdMtSuJKzSM4KLkdKhWIiuNzcxOfT8m"]:2
    hash --> cipheredhashed

Mask Encipher

block-beta
    columns 3
    passcode_idx["passcode indices:\n[22, 34, 45, 43]"]
    comb_pos["combined position key:\n[34963 12677 35658  5478 60936 17345 54640 40685 50309]"]
    cust_pos["customer position key:\n[ 8625 16938 65018  7492 24125   667  1225 54737 47670]"]
    
    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[4, 7, 0, 7]"]
    propidx --> passcode_position_idx
    
    space:5
    pad1(("Pad with\nrandom indices"))
    passcode_position_idx --> pad1
          
    space:5
    posidx["Padded Passcode Position Indices:\n[4, 7, 0, 7, 2, 2, 0, 3, 7, 8]"]
    pad1 --> posidx
    space:1
    user_pos["user position key:\n[58068 33848 20979 58547 24202 53969 27574 25558 64861]"]
    xor1 --> user_pos
    
    space:4
    sel(("select positions"))
    user_pos --> sel
    posidx --> sel
    space:5
    passcode_pos["ordered user passcode positions:\n[24202 25558 58068 25558 20979 20979 58068 58547 25558 64861]"]
    sel --> passcode_pos
    mask_key["mask key\n[23832 11427 59440 48739 10483 30872  4800 48753 55621 53879]"]
    space:4
    xor2(("XOR"))
    mask_key --> xor2
    passcode_pos --> xor2
    space:5
    mask["enciphered mask:\n [  914 20341  2788 56757 30976 10603 61460 23234 47763 12074]"]
    xor2 --> mask

Validate nKode

block-beta
    columns 3
    selected_keys["selected keys:\n[5, 3, 2, 2]"]
    login_keypad["login keypad:\nKey 0: [18 19 11 30 40 41 24 52 26]
Key 1: [36  1 47 12 49 32 42 25 35]
Key 2: [45 46 29 39 13 50 33 43 17]
Key 3: [27 37  2  3 31  5  6 34  8]
Key 4: [ 9 10 20 21  4 23 15  7 53]
Key 5: [ 0 28 38 48 22 14 51 16 44]
"]
    space:4
    
    selectkeys(("select keys"))
    mask["enciphered mask:\n [  914 20341  2788 56757 30976 10603 61460 23234 47763 12074]"]
    mask_key["mask key:\n[23832 11427 59440 48739 10483 30872  4800 48753 55621 53879]"]
    space:2
    
    xor1(("XOR"))
    mask --> xor1
    mask_key --> xor1
    selected_keys --> selectkeys
    login_keypad --> selectkeys
    space:3 
    
    ordered_keys["ordered keys:\n[[ 0 28 38 48 22 14 51 16 44]
 [27 37  2  3 31  5  6 34  8]
 [45 46 29 39 13 50 33 43 17]
 [45 46 29 39 13 50 33 43 17]]"]
    user_position_key["user position key:\n[58068 33848 20979 58547 24202 53969 27574 25558 64861]"]
    passcode_pos["ordered user passcode positions:\n[24202 25558 58068 25558 20979 20979 58068 58547 25558 64861]"]
    selectkeys --> ordered_keys
    xor1 --> passcode_pos
    space:8 
    
    get_passcode_idxs(("recover passcode\nposition indices"))
    user_position_key --> get_passcode_idxs
    passcode_pos --> get_passcode_idxs
    space:8
    
    passcode_pos_idxs["padded passcode position indices:\n[4, 7, 0, 7, 2, 2, 0, 3, 7, 8]"]
    get_passcode_idxs --> passcode_pos_idxs
    space:3
    
    get_presumed_idxs(("recover passcode\nproperty indices")) 
    ordered_keys --> get_presumed_idxs
    passcode_pos_idxs --> get_presumed_idxs
    space:5
    
    passcode_prop_idxs["presumed passcode property indices:\n[22, 34, 45, 43]"]
    prop["combined_property_key\n[62032 50130 36776 54558  8506 61182  6770  6684 21325 58903 51619 53457
 24017 10096 25891 36737 43828 60364 23965 63299 43548 43762 63289 61210
 16490 21923 14215  6365  4383 48550 62830 53206  5237  2426 49278 33751
 21542  2104 49342 42984 62776 19754 59167 25211    60 58461   118  9841
 52387  3482 40915 54740 30225  8961]"]
    cipheredhashed["hashed ciphered passcode:\n$2b$12$c62ezzyLW3QzUMjYUPSioexdMtSuJKzSM4KLkdKhWIiuNzcxOfT8m"]
    get_presumed_idxs --> passcode_prop_idxs
    space:3
    
    sel(("select\nproperties"))
    passcode_prop_idxs --> sel
    prop --> sel
    space:5
    
    passcode_prop["presumed passcode properties:\n[63289 49278 58461 25211]"]
    sel --> passcode_prop
    space:5
    
    cipher(("encipher"))
    passcode_prop --> cipher
    space:5
    
    cipheredpass["ciphered passcode:\n[42032 16430 13238 32944 52662 31196 41361 14925 10153 11854]"]
    cipher --> cipheredpass 
    space:7


    comp{"compare"}
    cipheredpass --> comp
    cipheredhashed --> comp
    space:5 
    
    suc(("success")) 
    comp --"Equal"--> suc

Renew nKode

nKode renewal is a three step process:

  1. Renew Customer Properties
  2. Renew User Keys
  3. Refresh User on Login
    flowchart
    subgraph Renew Customer Properties
        old_prop["`old customer property key:<br/>[ 4830 27406 45287 16089 51119 63121  2006 55056 13259 61408 27069  3731
 33742  9067 56287 33792 13904 36960 60733  9825 13381 38569 14922 32065
 19984  7725 40973 39345 17024 45969 50409 60464 13089 53033 15586  2681
 47372 30887 53937 34314 11173  4489  1624 16145 51437 27147 10535 44753
 49059 10487  9464 42806 59962 13593]`"]
        new_prop["`new customer property key:<br/>[40493 16536 22567  8632 16931 48077 38465 62133 61510 60074 30483 15029
 32328 35555 12264  4839 56666 52299 23010 54024 11530 38809 33384  9334
 53340 25808 36388  7068 48724  2963 19292 41164 31037 24848  7109 29039
 26458 18532  7462 19458 51071 45191 60228 22739 41943 36765 29356 35589
  3387 28997 31698 23822 30837  4299]`"]
        old_pos["`old customer position key:<br/>[27207 46525 55993 61909 45186 37136 48838 64827 14808]`"]
        new_pos["`new customer position key:<br/>[ 8625 16938 65018  7492 24125   667  1225 54737 47670]`"]
        xor1(("XOR"))
        xor2(("XOR"))
        xor_prop["`xor property key:<br/>[36083 11158 59584  8033 34188 19804 37271  9637 50061  1354  7854 13350
 64902 43400 62519 38631 60170 23595 46303 62825  6479   304 47138 22839
 40524 31485 11817 33325 64724 47106 36789 19708 18972 44601 10023 31510
 56918 12483 53143 51720 60634 41230 60700 26562 27450 58774 23435  9684
 45720 22962 24362 64056 37455  9682]`"]
        xor_pos["`xor position key:<br/>[19446 63383 10051 60561 61119 37771 47631 10474 33774]`"]
        old_prop --> xor1
        new_prop --> xor1
        xor1 --> xor_prop
        old_pos --> xor2
        new_pos --> xor2
        xor2 --> xor_pos
    end
    
    subgraph Renew User Keys 
        users@{shape: procs, label: "users"}
        users --> eachuser 
        subgraph eachuser [for each user]
            subgraph old user keys 
                old_user_pos["`combined position key:<br/>[58068 33848 20979 58547 24202 53969 27574 25558 64861]`"]
                old_user_prop["`property key:<br/>[57486 43228 16207 60359 59029  6255  7588 52492 24710  2551 40990 56898
 56863  1051 48892  2945 40292 31660 45216 53538 40537 15451 52595 37467
  3706 19342 38794 33132 21407  3639 12679  9190 10068 50771 64668 35246
 60714 28831  4623  8674 56989 23715 57671 23914 51409 36438 10577 34976
 29440  9581 47915 29410 39979  5656]`"]
                old_renew["renew: False"] 
            end
            xor3(("XOR"))
            xor4(("XOR"))
            old_user_pos --> xor3
            xor_pos --> xor3
            xor3 --> inter_user_pos
            old_user_prop --> xor4
            xor_prop --> xor4
            xor4 --> inter_user_prop
            subgraph inter_user[intermediate user keys]
                inter_user_pos["`combined position key:<br/>[50021 50706 44041 63991   183 53322 28543 46599 18283]`"]
                inter_user_prop["`property key:<br/>[27773 33610 55183 62630 25369 21811 35891 59561 41739  3261 48816 60004
  9113 44435 19147 40294 30318 10119  1151  9291 34582 15723 30033 52076
 36918 12659 47523   833 44875 46645 48690 28442 27976 26730 56251 62136
 13180 16476 56728 60394 12871 64941  3163 15016 41963 27584 29402 44404
 49560 31967 58369 35034  3684 13258]`"]
                inter_renew["renew: True"]
            end
        end
        
    end
    
    subgraph Refresh User on Login
        login["First login post renew"]
        inter_user --> login
        subgraph new_user [New User Keys]
            new_user_pos["`combined position key:<br/>[41920 44706 35397 43292 52009 11204 43818 26002 28955]`"]
            new_user_prop["`property key:<br/>[50355 56723 59762 39268 44255 59491 12736 62545  3731 51049 48946 10598
 23999 55461 35771 20498 38352 13185 17075 30409 22199  3533 32360 12423
 10680 48407  6174 11559 44174  8103 37520 52514 30628 49367  7063  8839
 30149  1724 51332 64105 26257 48370 17405 42481  4953 43432 15038 37511
 62432 22826 16312 39525 13907 33285]`"]
            new_renew["renew: False"]
        end
        login --> new_user
    end