# 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: [29187 8204 6047 64047 53525 11867 18824 35538 45077 33932 37992 15962 59642 23909 18198 52159 28347 8078 22066 56398 46985 41696 7084 56103 1625 31453 7418 15303 35465 27310 46695 8365 45388 58929 11384 64368 30936 44282 62811 22160 20933 21499 61363 9180 47285 5021 18129 20570 42619 30657 56801 14839 11286 38709] - position key: [57791 55443 47428 9481 40757 62312 55581 59207 31500] --- ## User Cipher - property key: [63039 13937 22392 22556 23851 13063 2277 14453 60483 59297 53238 50783 40759 12966 14543 64414 12752 61149 16294 38792 40555 32560 54274 26845 8408 516 5126 11787 51712 48283 7084 25997 13305 51796 59458 333 50546 46819 29676 41112 7589 39340 7270 40439 32 16909 4097 47405 901 23033 12446 65486 41796 14649] - passcode key: [ 3917 18489 51928 19673 27451 11243 32524 43956 43333 45897] - combined position key: [65378 4217 1730 61114 26857 28326 25595 30504 39366] - mask key: [28481 57972 43388 58568 3652 19285 25255 14159 35285 18802] ### Combined Postion Key ```mermaid block-beta columns 2 user_pos["user position key:\n[ 7901 51434 49030 52147 63452 40398 47846 36975 58058]"] customer_pos["customer position key:\n[57791 55443 47428 9481 40757 62312 55581 59207 31500]"] space:2 xor(("XOR")):2 user_pos --> xor customer_pos --> xor space:2 comb_pos["combined position key\n[65378 4217 1730 61114 26857 28326 25595 30504 39366]"]:2 xor --> comb_pos ``` ## User Keypad - keypad: - user passcode indices: [16, 34, 51, 12] ## nKode Cipher ### Passcode Hash ```mermaid block-beta columns 2 cprop["customer_property_key\n[29187 8204 6047 64047 53525 11867 18824 35538 45077 33932 37992 15962 59642 23909 18198 52159 28347 8078 22066 56398 46985 41696 7084 56103 1625 31453 7418 15303 35465 27310 46695 8365 45388 58929 11384 64368 30936 44282 62811 22160 20933 21499 61363 9180 47285 5021 18129 20570 42619 30657 56801 14839 11286 38709]"] uprop["user_property_key\n[63039 13937 22392 22556 23851 13063 2277 14453 60483 59297 53238 50783 40759 12966 14543 64414 12752 61149 16294 38792 40555 32560 54274 26845 8408 516 5126 11787 51712 48283 7084 25997 13305 51796 59458 333 50546 46819 29676 41112 7589 39340 7270 40439 32 16909 4097 47405 901 23033 12446 65486 41796 14649]"] space:2 xor1(("XOR")):2 cprop --> xor1 uprop --> xor1 space:2 prop["combined_property_key\n[33852 5757 16615 41523 35902 7516 16749 45735 23638 25389 23454 63493 30669 28611 32729 12321 24427 61779 27028 19398 10722 56784 53166 46074 9857 30937 2300 5580 16521 54837 44491 17696 33461 11365 50234 64061 48554 6681 34487 62984 19552 51799 62421 48683 47253 20880 22224 59767 42494 11832 60799 50745 36690 44556]"] xor1 --> prop pass["user_passcode_indices\n[16, 34, 51, 12]"] space:2 sel(("select\nproperties")):2 pass --> sel prop --> sel space:2 passcode["user passcode properties:\n[24427 50234 50745 30669]"]:2 sel --> passcode space:2 pad["zero pad to\nmax nkode length: 10"]:2 passcode -->pad space:2 paddedpasscode["padded passcode:\n[24427 50234 50745 30669 0 0 0 0 0 0]"] pad --> paddedpasscode passkey["passcode key:\n[ 3917 18489 51928 19673 27451 11243 32524 43956 43333 45897]"] space:2 xor2(("XOR")):2 passkey --> xor2 paddedpasscode --> xor2 space:2 cipheredpass["ciphered passcode:\n[20518 35843 3297 15124 27451 11243 32524 43956 43333 45897]"]:2 xor2 --> cipheredpass space:2 hash(("hash")):2 cipheredpass --> hash space:2 cipheredhashed["hashed ciphered passcode:\n$2b$12$wC7VFWUqOhklJsvhVukMWeGtlHhsuLL58TFxVqahBTvMuyBiLInXW"]:2 hash --> cipheredhashed ``` ### Mask Encipher ```mermaid block-beta columns 3 passcode_idx["passcode indices:\n[16, 34, 51, 12]"] comb_pos["combined position key:\n[65378 4217 1730 61114 26857 28326 25595 30504 39366]"] cust_pos["customer position key:\n[57791 55443 47428 9481 40757 62312 55581 59207 31500]"] 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[7, 7, 6, 3]"] propidx --> passcode_position_idx space:5 pad1(("Pad with\nrandom indices")) passcode_position_idx --> pad1 space:5 posidx["Padded Passcode Position Indices:\n[7, 7, 6, 3, 2, 8, 6, 1, 1, 4]"] pad1 --> posidx space:1 user_pos["user position key:\n[ 7901 51434 49030 52147 63452 40398 47846 36975 58058]"] xor1 --> user_pos space:4 sel(("select positions")) user_pos --> sel posidx --> sel space:5 passcode_pos["ordered user passcode positions:\n[36975 36975 47846 52147 49030 58058 47846 51434 51434 63452]"] sel --> passcode_pos mask_key["mask key\n[28481 57972 43388 58568 3652 19285 25255 14159 35285 18802]"] space:4 xor2(("XOR")) mask_key --> xor2 passcode_pos --> xor2 space:5 mask["enciphered mask:\n [65326 29211 5018 12155 45506 43423 55361 65445 16703 48814]"] xor2 --> mask ``` ### Validate nKode ```mermaid block-beta columns 3 selected_keys["selected keys:\n[3, 0, 1, 1]"] login_keypad["login keypad:\nKey 0: [27 19 20 48 40 32 6 34 35] Key 1: [ 9 37 29 12 13 23 51 7 17] Key 2: [18 46 2 21 31 41 42 43 26] Key 3: [36 28 38 39 22 50 33 16 44] Key 4: [ 0 10 11 3 49 14 24 25 8] Key 5: [45 1 47 30 4 5 15 52 53] "] space:4 selectkeys(("select keys")) mask["enciphered mask:\n [65326 29211 5018 12155 45506 43423 55361 65445 16703 48814]"] mask_key["mask key:\n[28481 57972 43388 58568 3652 19285 25255 14159 35285 18802]"] space:2 xor1(("XOR")) mask --> xor1 mask_key --> xor1 selected_keys --> selectkeys login_keypad --> selectkeys space:3 ordered_keys["ordered keys:\n[[36 28 38 39 22 50 33 16 44] [27 19 20 48 40 32 6 34 35] [ 9 37 29 12 13 23 51 7 17] [ 9 37 29 12 13 23 51 7 17]]"] user_position_key["user position key:\n[ 7901 51434 49030 52147 63452 40398 47846 36975 58058]"] passcode_pos["ordered user passcode positions:\n[36975 36975 47846 52147 49030 58058 47846 51434 51434 63452]"] 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[7, 7, 6, 3, 2, 8, 6, 1, 1, 4]"] 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[16, 34, 51, 12]"] prop["combined_property_key\n[33852 5757 16615 41523 35902 7516 16749 45735 23638 25389 23454 63493 30669 28611 32729 12321 24427 61779 27028 19398 10722 56784 53166 46074 9857 30937 2300 5580 16521 54837 44491 17696 33461 11365 50234 64061 48554 6681 34487 62984 19552 51799 62421 48683 47253 20880 22224 59767 42494 11832 60799 50745 36690 44556]"] cipheredhashed["hashed ciphered passcode:\n$2b$12$wC7VFWUqOhklJsvhVukMWeGtlHhsuLL58TFxVqahBTvMuyBiLInXW"] 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[24427 50234 50745 30669]"] sel --> passcode_prop space:5 cipher(("encipher")) passcode_prop --> cipher space:5 cipheredpass["ciphered passcode:\n[20518 35843 3297 15124 27451 11243 32524 43956 43333 45897]"] cipher --> cipheredpass space:7 comp{"compare"} cipheredpass --> comp cipheredhashed --> comp space:7 suc(("success")) fail(("fail")) comp --"Equal"--> suc comp --"Not Equal"--> fail ```