# 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: [54514 1965 53378 19192 22047 51452 10113 45652 29057 9429 21502 46988 49588 18367 49270 58262 42600 57355 6832 60785 43122 21094 14401 36145 20935 57304 48338 48291 26673 19914 28977 28652 19987 31121 12774 35536 48255 12852 54678 55834 85 26003 45160 20835 54874 52921 15169 50516 60357 42125 30022 45817 60130 11197] - position key: [48112 26772 62306 37312 9280 53287 8575 52285 23223] --- ## User Cipher - property key: [25402 45448 18385 37857 57541 32953 19697 45767 30288 57822 46599 257 21882 41216 65271 33191 57236 24801 10848 60418 40003 30516 42964 54926 4678 57740 23458 22941 19199 13444 34602 28269 28151 31470 11589 62172 53096 14757 9376 55563 54085 33633 7682 13084 27027 41237 11751 3039 37222 20544 22215 44963 6713 65186] - passcode key: [28538 33084 55942 23635 1822 36202 45572 34373 48530 20714] - combined position key: [57013 27802 42252 20840 26015 37308 27613 15454 15422] - mask key: [29393 54843 61220 63539 63750 28279 20755 38066 32824 58482] ### Combined Postion Key ```mermaid block-beta columns 2 user_pos["user position key:\n[16087 54566 2672 43037 1335 65132 16145 49723 39280]"] customer_pos["customer position key:\n[48112 26772 62306 37312 9280 53287 8575 52285 23223]"] space:2 xor(("XOR")):2 user_pos --> xor customer_pos --> xor space:2 comb_pos["combined position key\n[57013 27802 42252 20840 26015 37308 27613 15454 15422]"]:2 xor --> comb_pos ``` ## User Keypad - keypad example:
Key 0: [27 1 2 48 31 41 24 7 17]
Key 1: [45 10 11 39 4 50 42 25 53]
Key 2: [ 9 19 29 3 40 32 51 16 8]
Key 3: [18 37 38 21 22 14 33 43 44]
Key 4: [ 0 28 47 30 49 5 15 34 26]
Key 5: [36 46 20 12 13 23 6 52 35]
- user passcode indices: [28, 24, 34, 1] ## nKode Cipher ### Passcode Hash ```mermaid block-beta columns 2 cprop["customer_property_key\n[54514 1965 53378 19192 22047 51452 10113 45652 29057 9429 21502 46988 49588 18367 49270 58262 42600 57355 6832 60785 43122 21094 14401 36145 20935 57304 48338 48291 26673 19914 28977 28652 19987 31121 12774 35536 48255 12852 54678 55834 85 26003 45160 20835 54874 52921 15169 50516 60357 42125 30022 45817 60130 11197]"] uprop["user_property_key\n[25402 45448 18385 37857 57541 32953 19697 45767 30288 57822 46599 257 21882 41216 65271 33191 57236 24801 10848 60418 40003 30516 42964 54926 4678 57740 23458 22941 19199 13444 34602 28269 28151 31470 11589 62172 53096 14757 9376 55563 54085 33633 7682 13084 27027 41237 11751 3039 37222 20544 22215 44963 6713 65186]"] space:2 xor1(("XOR")):2 cprop --> xor1 uprop --> xor1 space:2 prop["combined_property_key\n[22860 48501 43623 2691 11008 34410 41991 51506 29272 24365 54234 54358 3371 32869 56118 23725 27650 38652 25509 24668 2625 31115 7846 1530 28577 8896 10269 5837 40269 59501 63202 34622 24010 60186 38638 52779 27566 57898 58845 6587 13015 10925 7087 34598 49492 27689 9569 8776 60168 63531 64702 53160 62709 51058]"] xor1 --> prop pass["user_passcode_indices\n[28, 24, 34, 1]"] space:2 sel(("select\nproperties")):2 pass --> sel prop --> sel space:2 passcode["user passcode properties:\n[40269 28577 38638 48501]"]:2 sel --> passcode space:2 pad["zero pad to\nmax nkode length: 10"]:2 passcode -->pad space:2 paddedpasscode["padded passcode:\n[40269 28577 38638 48501 0 0 0 0 0 0]"] pad --> paddedpasscode passkey["passcode key:\n[28538 33084 55942 23635 1822 36202 45572 34373 48530 20714]"] space:2 xor2(("XOR")):2 passkey --> xor2 paddedpasscode --> xor2 space:2 cipheredpass["ciphered passcode:\n[62007 61085 19560 57638 1822 36202 45572 34373 48530 20714]"]:2 xor2 --> cipheredpass space:2 hash(("hash")):2 cipheredpass --> hash space:2 cipheredhashed["hashed ciphered passcode:\n$2b$12$YW2vbeWXlAc3TdUGX9l8gOghIZ3ZQSMF8ia2K0Bj5dzmtUlx3hWqS"]:2 hash --> cipheredhashed ``` ### Mask Encipher ```mermaid block-beta columns 3 passcode_idx["passcode indices:\n[28, 24, 34, 1]"] comb_pos["combined position key:\n[57013 27802 42252 20840 26015 37308 27613 15454 15422]"] cust_pos["customer position key:\n[48112 26772 62306 37312 9280 53287 8575 52285 23223]"] 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, 6, 7, 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, 6, 7, 1, 5, 0, 8, 6, 2, 0]"] pad1 --> posidx space:1 user_pos["user position key:\n[16087 54566 2672 43037 1335 65132 16145 49723 39280]"] xor1 --> user_pos space:4 sel(("select positions")) user_pos --> sel posidx --> sel space:5 passcode_pos["ordered user passcode positions:\n[54566 16145 49723 54566 65132 16087 39280 16145 2672 16087]"] sel --> passcode_pos mask_key["mask key\n[29393 54843 61220 63539 63750 28279 20755 38066 32824 58482]"] space:4 xor2(("XOR")) mask_key --> xor2 passcode_pos --> xor2 space:5 mask["enciphered mask:\n [42999 59690 11551 11541 1898 20640 51299 43939 35400 55973]"] xor2 --> mask ``` ### Validate nKode ```mermaid block-beta columns 3 pass["user_passcode_indices\n[28, 24, 34, 1]"] login_keypad["login keypad:\nKey 0: [27 1 2 48 31 41 24 7 17] Key 1: [45 10 11 39 4 50 42 25 53] Key 2: [ 9 19 29 3 40 32 51 16 8] Key 3: [18 37 38 21 22 14 33 43 44] Key 4: [ 0 28 47 30 49 5 15 34 26] Key 5: [36 46 20 12 13 23 6 52 35] "] space:4 selectkeys(("select keys")) mask["enciphered mask:\n [42999 59690 11551 11541 1898 20640 51299 43939 35400 55973]"] mask_key["mask key:\n[29393 54843 61220 63539 63750 28279 20755 38066 32824 58482]"] space:2 xor1(("XOR")) mask --> xor1 mask_key --> xor1 pass --> selectkeys login_keypad --> selectkeys space:3 ordered_keys["ordered keys:\n[[ 0 28 47 30 49 5 15 34 26] [27 1 2 48 31 41 24 7 17] [ 0 28 47 30 49 5 15 34 26] [27 1 2 48 31 41 24 7 17]]"] user_position_key["user position key:\n[16087 54566 2672 43037 1335 65132 16145 49723 39280]"] passcode_pos["ordered user passcode positions:\n[54566 16145 49723 54566 65132 16087 39280 16145 2672 16087]"] 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, 6, 7, 1, 5, 0, 8, 6, 2, 0]"] 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[28, 24, 34, 1]"] prop["combined_property_key\n[22860 48501 43623 2691 11008 34410 41991 51506 29272 24365 54234 54358 3371 32869 56118 23725 27650 38652 25509 24668 2625 31115 7846 1530 28577 8896 10269 5837 40269 59501 63202 34622 24010 60186 38638 52779 27566 57898 58845 6587 13015 10925 7087 34598 49492 27689 9569 8776 60168 63531 64702 53160 62709 51058]"] cipheredhashed["hashed ciphered passcode:\n$2b$12$YW2vbeWXlAc3TdUGX9l8gOghIZ3ZQSMF8ia2K0Bj5dzmtUlx3hWqS"] 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[40269 28577 38638 48501]"] sel --> passcode_prop space:5 cipher(("encipher")) passcode_prop --> cipher space:5 cipheredpass["ciphered passcode:\n[62007 61085 19560 57638 1822 36202 45572 34373 48530 20714]"] 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 Keys 2. Intermediate User Keys 3. Renew User Keys on Login ```mermaid flowchart subgraph Renew Customer Keys old_prop["`old customer property key:
[14966 3325 60854 39266 52165 1747 59638 31733 1032 48883 26077 54615 22609 8549 9665 56586 45974 63005 18885 35934 38402 3775 47474 54132 32231 49996 29631 20304 55218 56553 29128 59731 12349 37364 48043 15607 42182 56207 49533 49328 57746 43468 1453 46138 43207 52540 2182 10647 31342 43115 43641 24587 61132 14800]`"] new_prop["`new customer property key:
[54514 1965 53378 19192 22047 51452 10113 45652 29057 9429 21502 46988 49588 18367 49270 58262 42600 57355 6832 60785 43122 21094 14401 36145 20935 57304 48338 48291 26673 19914 28977 28652 19987 31121 12774 35536 48255 12852 54678 55834 85 26003 45160 20835 54874 52921 15169 50516 60357 42125 30022 45817 60130 11197]`"] old_pos["`old customer position key:
[57442 47548 44924 63861 24744 28624 21708 65125 42318]`"] new_pos["`new customer position key:
[48112 26772 62306 37312 9280 53287 8575 52285 23223]`"] xor1(("XOR")) xor2(("XOR")) xor_prop["`xor property key:
[61060 2896 15668 54170 40410 52783 53111 51617 30089 39462 13859 25307 39397 26330 58807 16028 5630 5654 21365 24879 15984 23769 33075 24133 11296 7316 53101 62451 49027 37155 249 34495 32302 59493 35405 46631 6329 59835 5355 6826 57799 52319 46533 58713 32413 901 13255 60611 37291 3302 57151 54002 1070 4717]`"] xor_pos["`xor position key:
[23442 53544 23582 26805 17640 49143 30131 12888 65529]`"] old_prop --> xor1 new_prop --> xor1 xor1 --> xor_prop old_pos --> xor2 new_pos --> xor2 xor2 --> xor_pos end subgraph Intermediate User Keys users@{shape: procs, label: "users"} users --> eachuser subgraph eachuser [for each user] subgraph old user keys old_user_pos["`combined position key:
[16087 54566 2672 43037 1335 65132 16145 49723 39280]`"] old_user_prop["`property key:
[25402 45448 18385 37857 57541 32953 19697 45767 30288 57822 46599 257 21882 41216 65271 33191 57236 24801 10848 60418 40003 30516 42964 54926 4678 57740 23458 22941 19199 13444 34602 28269 28151 31470 11589 62172 53096 14757 9376 55563 54085 33633 7682 13084 27027 41237 11751 3039 37222 20544 22215 44963 6713 65186]`"] 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:
[34087 48562 63762 14813 8567 11851 7790 3590 50119]`"] inter_user_prop["`property key:
[36286 47832 31461 16507 32031 20118 33670 31590 985 31736 32804 25562 52383 51162 6976 48955 51818 30455 30997 36141 41523 11245 9959 35019 15974 64792 38095 43630 62844 42407 34771 59602 5081 37515 42760 17659 55249 53278 12363 50081 12930 20286 43975 54853 5902 41616 7712 59164 205 23718 35320 32081 7703 60623]`"] inter_renew["renew: True"] end end end subgraph Renew User Keys on Login login["First login post renew"] inter_user --> login subgraph new_user [New User Keys] new_user_pos["`combined position key:
[30180 41733 51338 65033 46822 22413 14740 11265 36086]`"] new_user_prop["`property key:
[63029 58440 35697 22366 54518 106 30872 42634 43391 56303 8441 57457 40463 15976 60517 30636 40657 60903 39392 12539 19960 16602 3225 8105 30680 64909 9750 19292 15934 38070 9733 36553 61894 2864 25710 48492 54051 23592 44246 3991 38055 9064 51185 33976 39567 54282 59604 15986 12137 21928 16931 38440 25594 42613]`"] new_renew["renew: False"] end login --> new_user end ```