# 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 ```mermaid 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 ```mermaid 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 ```mermaid 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 ```mermaid 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 ```