# 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: [ 7528 63893 43548 25423 47744 42591 13947 15495 44997 9610 32248 3295 37638 6583 51113 60339 43861 22578 25507 20049 10766 50355 36708 37036 12276 25874 63870 49205 70 53112 40483 39973 24671 4447 24361 43982 1997 23736 6951 9733 7407 48242 57341 7624 5578 22071 51177 20155 2441 15688 7417 935 33982 43009] - position key: [41987 59995 38795 29405 53271 32296 44523 10502 49338] --- ## User Cipher - property key: [25869 62495 1734 362 37984 51592 32568 34493 13441 35472 33999 41683 20426 4369 47735 37538 8392 1425 8176 40966 37766 22326 21576 20608 6581 21051 52337 10975 19283 32306 52352 6318 26386 36937 16351 38760 36505 9636 58306 38636 14299 36502 59745 33866 61255 12802 63463 64177 38614 28129 16937 786 31611 60757] - passcode key: [28207 53281 58835 9812 48933 51588 25408 62022 36721 9334] - combined position key: [60340 19752 2334 9189 29138 61771 17595 21364 54614] - mask key: [43734 31472 30293 34641 24055 5782 14606 48388 2666 19217] ### Combined Postion Key ```mermaid block-beta columns 2 user_pos["user position key:\n[20407 42867 40597 20792 41413 36707 59728 31346 5612]"] customer_pos["customer position key:\n[41987 59995 38795 29405 53271 32296 44523 10502 49338]"] space:2 xor(("XOR")):2 user_pos --> xor customer_pos --> xor space:2 comb_pos["combined position key\n[60340 19752 2334 9189 29138 61771 17595 21364 54614]"]:2 xor --> comb_pos ``` ## User Keypad - keypad: - user passcode indices: [37, 38, 40, 10] ## nKode Cipher ### Passcode Hash ```mermaid block-beta columns 2 cprop["customer_property_key\n[ 7528 63893 43548 25423 47744 42591 13947 15495 44997 9610 32248 3295 37638 6583 51113 60339 43861 22578 25507 20049 10766 50355 36708 37036 12276 25874 63870 49205 70 53112 40483 39973 24671 4447 24361 43982 1997 23736 6951 9733 7407 48242 57341 7624 5578 22071 51177 20155 2441 15688 7417 935 33982 43009]"] uprop["user_property_key\n[25869 62495 1734 362 37984 51592 32568 34493 13441 35472 33999 41683 20426 4369 47735 37538 8392 1425 8176 40966 37766 22326 21576 20608 6581 21051 52337 10975 19283 32306 52352 6318 26386 36937 16351 38760 36505 9636 58306 38636 14299 36502 59745 33866 61255 12802 63463 64177 38614 28129 16937 786 31611 60757]"] space:2 xor1(("XOR")):2 cprop --> xor1 uprop --> xor1 space:2 prop["combined_property_key\n[30821 3466 44250 25125 12000 28631 18755 47674 39748 44826 63799 44556 56524 2214 32222 30993 35741 23971 31827 61015 47496 37765 56108 49196 13889 14121 13583 60138 19221 45386 21155 33931 1869 33046 24822 15526 35156 31004 63717 45289 11060 13028 13980 39298 64141 25653 12302 46090 40799 20649 24272 181 65477 17748]"] xor1 --> prop pass["user_passcode_indices\n[37, 38, 40, 10]"] space:2 sel(("select\nproperties")):2 pass --> sel prop --> sel space:2 passcode["user passcode properties:\n[31004 63717 11060 63799]"]:2 sel --> passcode space:2 pad["zero pad to\nmax nkode length: 10"]:2 passcode -->pad space:2 paddedpasscode["padded passcode:\n[31004 63717 11060 63799 0 0 0 0 0 0]"] pad --> paddedpasscode passkey["passcode key:\n[28207 53281 58835 9812 48933 51588 25408 62022 36721 9334]"] space:2 xor2(("XOR")):2 passkey --> xor2 paddedpasscode --> xor2 space:2 cipheredpass["ciphered passcode:\n[ 5939 10436 52967 57187 48933 51588 25408 62022 36721 9334]"]:2 xor2 --> cipheredpass space:2 hash(("hash")):2 cipheredpass --> hash space:2 cipheredhashed["hashed ciphered passcode:\n$2b$12$am68CvhXvNZFJE1qsmLSL.gC5I.cykt7LbisLcuUNkoFZ18vV1DPO"]:2 hash --> cipheredhashed ``` ### Mask Encipher ```mermaid block-beta columns 3 passcode_idx["passcode indices:\n[37, 38, 40, 10]"] comb_pos["combined position key:\n[60340 19752 2334 9189 29138 61771 17595 21364 54614]"] cust_pos["customer position key:\n[41987 59995 38795 29405 53271 32296 44523 10502 49338]"] 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[1, 2, 4, 1]"] propidx --> passcode_position_idx space:5 pad1(("Pad with\nrandom indices")) passcode_position_idx --> pad1 space:5 posidx["Padded Passcode Position Indices:\n[1, 2, 4, 1, 4, 6, 4, 8, 4, 2]"] pad1 --> posidx space:1 user_pos["user position key:\n[20407 42867 40597 20792 41413 36707 59728 31346 5612]"] xor1 --> user_pos space:4 sel(("select positions")) user_pos --> sel posidx --> sel space:5 passcode_pos["ordered user passcode positions:\n[42867 40597 41413 42867 41413 59728 41413 5612 41413 40597]"] sel --> passcode_pos mask_key["mask key\n[43734 31472 30293 34641 24055 5782 14606 48388 2666 19217]"] space:4 xor2(("XOR")) mask_key --> xor2 passcode_pos --> xor2 space:5 mask["enciphered mask:\n [ 3493 58469 55184 8226 64562 65478 39115 43240 43951 54660]"] xor2 --> mask ``` ### Validate nKode ```mermaid block-beta columns 3 selected_keys["selected keys:\n[4, 0, 4, 2]"] login_keypad["login keypad:\nKey 0: [36 28 38 48 49 32 51 34 17] Key 1: [ 9 19 2 3 4 41 33 52 8] Key 2: [18 10 47 39 31 23 24 16 35] Key 3: [27 46 29 21 22 14 6 43 26] Key 4: [45 37 11 12 40 5 42 7 53] Key 5: [ 0 1 20 30 13 50 15 25 44] "] space:4 selectkeys(("select keys")) mask["enciphered mask:\n [ 3493 58469 55184 8226 64562 65478 39115 43240 43951 54660]"] mask_key["mask key:\n[43734 31472 30293 34641 24055 5782 14606 48388 2666 19217]"] space:2 xor1(("XOR")) mask --> xor1 mask_key --> xor1 selected_keys --> selectkeys login_keypad --> selectkeys space:3 ordered_keys["ordered keys:\n[[45 37 11 12 40 5 42 7 53] [36 28 38 48 49 32 51 34 17] [45 37 11 12 40 5 42 7 53] [18 10 47 39 31 23 24 16 35]]"] user_position_key["user position key:\n[20407 42867 40597 20792 41413 36707 59728 31346 5612]"] passcode_pos["ordered user passcode positions:\n[42867 40597 41413 42867 41413 59728 41413 5612 41413 40597]"] 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[1, 2, 4, 1, 4, 6, 4, 8, 4, 2]"] 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[37, 38, 40, 10]"] prop["combined_property_key\n[30821 3466 44250 25125 12000 28631 18755 47674 39748 44826 63799 44556 56524 2214 32222 30993 35741 23971 31827 61015 47496 37765 56108 49196 13889 14121 13583 60138 19221 45386 21155 33931 1869 33046 24822 15526 35156 31004 63717 45289 11060 13028 13980 39298 64141 25653 12302 46090 40799 20649 24272 181 65477 17748]"] cipheredhashed["hashed ciphered passcode:\n$2b$12$am68CvhXvNZFJE1qsmLSL.gC5I.cykt7LbisLcuUNkoFZ18vV1DPO"] 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[31004 63717 11060 63799]"] sel --> passcode_prop space:5 cipher(("encipher")) passcode_prop --> cipher space:5 cipheredpass["ciphered passcode:\n[ 5939 10436 52967 57187 48933 51588 25408 62022 36721 9334]"] cipher --> cipheredpass space:7 comp{"compare"} cipheredpass --> comp cipheredhashed --> comp space:5 suc(("success")) comp --"Equal"--> suc ```