diff --git a/docs/encipher_decipher_nkode.md b/docs/encipher_decipher_nkode.md index 08c5808..6be3fc4 100644 --- a/docs/encipher_decipher_nkode.md +++ b/docs/encipher_decipher_nkode.md @@ -1,152 +1,245 @@ # Encipher and Decipher nKode -### Customer Policy +## Customer Policy - max nkode length: 10 - number of keys: 6 - properties per key: 9 - total number of properties: 54 -### Customer Cipher -- property key: [50817 32783 33745 35836 30092 4212 15938 64571 58354 41241 3649 38852 - 37860 47294 10501 43278 9946 60484 34443 38446 57997 32874 49251 58321 - 15849 40891 43566 53732 31357 5248 22060 15762 23773 10428 22850 7975 - 11108 23454 32723 40871 6994 35130 41638 13889 6569 20765 56191 37770 - 4448 37031 30452 43080 24525 44717] -- position key: [25392 13634 17753 25555 61290 50870 49934 53104 9796] +## 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: [35724 37130 47630 20125 52673 62248 61979 44917 17470 11483 20317 56084 - 34699 49571 32249 15009 43246 57623 21032 62384 61961 34049 1963 5370 - 1121 47700 26633 59166 16526 38173 56846 41594 54438 8714 46049 25028 - 38681 2017 39749 42164 38277 19216 23760 35115 23020 18954 26604 50262 - 21588 62239 30226 58722 12644 39141] -- passcode key: [51522 14440 21036 1484 4829 51359 61560 41543 23848 29080] -- combined position key: [14972 5803 54986 46940 19674 32943 38431 42194 29083] -- mask key: [15948 8251 52095 4511 25902 21701 15340 4458 15137 44295] +## 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 +### Combined Postion Key ```mermaid block-beta columns 2 - user_pos["user position key:\n[22860 9193 37779 54415 41904 17945 21777 27554 22495]"] - customer_pos["customer position key:\n[25392 13634 17753 25555 61290 50870 49934 53104 9796]"] + 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[14972 5803 54986 46940 19674 32943 38431 42194 29083]"]:2 + comb_pos["combined position key\n[10840 53435 61304 62480 44024 35399 25077 63411 2973]"]:2 xor --> comb_pos ``` -### User Keypad +## User Keypad - keypad: -- user passcode indices: [22, 6, 38, 21] +- user passcode indices: [26, 31, 1, 53] -### nKode Cipher +## nKode Cipher -#### Passcode Hash +### Passcode Hash ```mermaid block-beta -columns 2 - cprop["customer_property_key\n[50817 32783 33745 35836 30092 4212 15938 64571 58354 41241 3649 38852 - 37860 47294 10501 43278 9946 60484 34443 38446 57997 32874 49251 58321 - 15849 40891 43566 53732 31357 5248 22060 15762 23773 10428 22850 7975 - 11108 23454 32723 40871 6994 35130 41638 13889 6569 20765 56191 37770 - 4448 37031 30452 43080 24525 44717]"] - uprop["user_property_key\n[35724 37130 47630 20125 52673 62248 61979 44917 17470 11483 20317 56084 - 34699 49571 32249 15009 43246 57623 21032 62384 61961 34049 1963 5370 - 1121 47700 26633 59166 16526 38173 56846 41594 54438 8714 46049 25028 - 38681 2017 39749 42164 38277 19216 23760 35115 23020 18954 26604 50262 - 21588 62239 30226 58722 12644 39141]"] - space:2 - xor1(("XOR")):2 - cprop --> xor1 - uprop --> xor1 - space:2 - prop["combined_property_key\n[19725 4357 14815 50529 47181 58204 52313 21326 42956 36290 16668 19664 - 5231 31005 21756 37807 36404 3411 54435 26014 4228 1387 51144 63275 - 14728 9711 49703 14074 15091 33181 34850 40936 34939 2742 60067 32483 - 48253 23679 58518 15123 36567 49706 65142 49002 16453 6935 48275 22492 - 17716 25528 230 19754 28329 13896]"] - xor1 --> prop - pass["user_passcode_indices\n[22, 6, 38, 21]"] - space:2 - sel(("select\properties")):2 - pass --> sel - prop --> sel - space:2 - passcode["user passcode properties:\n[51144 52313 58518 1387]"]:2 - sel --> passcode - space:2 - pad["zero pad to\nmax nkode length: 10"]:2 - passcode -->pad - space:2 - paddedpasscode["padded passcode:\n[51144 52313 58518 1387 0 0 0 0 0 0]"] - pad --> paddedpasscode - passkey["passcode key:\n[51522 14440 21036 1484 4829 51359 61560 41543 23848 29080]"] - space:2 - xor2(("XOR")):2 - passkey --> xor2 - paddedpasscode --> xor2 - space:2 - cipheredpass["ciphered passcode:\n[ 3722 62513 46778 167 4829 51359 61560 41543 23848 29080]"]:2 - xor2 --> cipheredpass - space:2 - hash(("hash")):2 - cipheredpass --> hash - space:2 - cipheredhashed["hashed ciphered passcode:\n$2b$12$AQRZP88momhTaKGYaPzdiuBybg7V49SiZ8y9PQMoT0plZrEsbYO.K"]:2 - hash --> cipheredhashed + 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 +### Mask Encipher ```mermaid block-beta - columns 3 - passcode_idx["passcode indices:\n[22, 6, 38, 21]"] - comb_pos["combined position key:\n[14972 5803 54986 46940 19674 32943 38431 42194 29083]"] - cust_pos["customer position key:\n[25392 13634 17753 25555 61290 50870 49934 53104 9796]"] - - 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, 6, 2, 3]"] - propidx --> passcode_position_idx - - space:5 - pad1(("Pad with\nrandom indices")) - passcode_position_idx --> pad1 - - space:5 - posidx["Padded Passcode Position Indices:\n[4, 6, 2, 3, 7, 1, 8, 0, 5, 4]"] - pad1 --> posidx - space:1 - user_pos["user position key:\n[22860 9193 37779 54415 41904 17945 21777 27554 22495]"] - xor1 --> user_pos - - space:4 - sel(("select positions")) - user_pos --> sel - posidx --> sel - space:5 - passcode_pos["passcode positions:\n[41904 21777 37779 54415 27554 9193 22495 22860 17945 41904]"] - sel --> passcode_pos - mask_key["mask key\n[15948 8251 52095 4511 25902 21701 15340 4458 15137 44295]"] - space:4 - xor2(("XOR")) - mask_key --> xor2 - passcode_pos --> xor2 - space:5 - mask["enciphered mask:\n [40444 29994 22764 50448 3724 30508 27699 18470 32056 3767]"] - xor2 --> mask + 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 + +``` \ No newline at end of file diff --git a/docs/scripts/render_encipher_decipher_diagrams.py b/docs/scripts/render_encipher_decipher_diagrams.py index 88e5ee3..18e84d4 100644 --- a/docs/scripts/render_encipher_decipher_diagrams.py +++ b/docs/scripts/render_encipher_decipher_diagrams.py @@ -11,6 +11,14 @@ from src.models import NKodePolicy, KeypadSize from src.nkode_api import NKodeAPI from src.utils import select_keys_with_passcode_values +def display_keypad(icons_array: np.ndarray, props_per_key: int) -> str: + icons = "" + for idx, row in enumerate(icons_array.reshape(-1, props_per_key)): + icons += f"Key {idx}: " + icons += str(row) + icons += "\n" + return icons + if __name__ == "__main__": api = NKodeAPI() @@ -54,6 +62,9 @@ if __name__ == "__main__": ordered_user_position_key = user_position_key[padded_passcode_position_indices] mask = ordered_user_position_key ^ user.cipher.mask_key encoded_mask = user.cipher.encode_base64_str(mask) + login_keypad = api.get_login_keypad(username, customer_id) + selected_keys_login = select_keys_with_passcode_values(passcode_property_indices, login_keypad, + keypad_size.props_per_key) context = { "max_nkode_len": policy.max_nkode_len, "numb_of_keys": keypad_size.numb_of_keys, @@ -75,5 +86,8 @@ if __name__ == "__main__": "pad_user_passcode_idxs": padded_passcode_position_indices, "ordered_user_position_key":ordered_user_position_key, "mask": mask, + "selected_keys": selected_keys_login, + "login_keypad": display_keypad(login_keypad, keypad_size.props_per_key), + "ordered_keys": login_keypad.reshape(-1, keypad_size.props_per_key)[selected_keys_login], } - render_markdown_template(Path("../templates/encipher_decipher_nkode.template.md"), Path("../encipher_decipher_nkode.md"), context) \ No newline at end of file + render_markdown_template(Path("../templates/encipher_decipher_nkode.template.md"), Path("../encipher_decipher_nkode.md"), context) diff --git a/docs/templates/encipher_decipher_nkode.template.md b/docs/templates/encipher_decipher_nkode.template.md index e3bb878..4bd5b27 100644 --- a/docs/templates/encipher_decipher_nkode.template.md +++ b/docs/templates/encipher_decipher_nkode.template.md @@ -140,34 +140,73 @@ block-beta login_keypad["login keypad:\n{{login_keypad}}"] mask["enciphered mask:\n {{mask}}"] mask_key["mask key:\n{{mask_key}}"] - space:6 + space:4 - user_position_key["user position key:\n{{user_position_key}}"] - passcode_pos["ordered user passcode positions:\n{{ordered_user_position_key}}"] + selectkeys(("select keys")) + space:2 + xor1(("XOR")) + mask --> xor1 + mask_key --> xor1 + selected_keys -->selectkeys + login_keypad --> selectkeys space:4 - space:2 + ordered_keys["ordered keys:\n{{ordered_keys}}"] + space:1 + user_position_key["user position key:\n{{user_position_key}}"] + passcode_pos["ordered user passcode positions:\n{{ordered_user_position_key}}"] + 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{{pad_user_passcode_idxs}}"] - space:5 + 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{{user_passcode_idxs}}"] - space:7 - - sel(("select\nproperties")) space:1 prop["combined_property_key\n{{combined_property_key}}"] - space:5 - passcode_prop["presumed passcode properties:\n{{user_passcode_props}}"] - space:1 cipheredhashed["hashed ciphered passcode:\n{{code}}"] - space:6 + get_presumed_idxs --> passcode_pos_idxs + get_presumed_idxs --> passcode_prop_idxs + space:5 - comp(("compare")) + sel(("select\nproperties")) + passcode_prop_idxs --> sel + prop --> sel + space:7 + + passcode_prop["presumed passcode properties:\n{{user_passcode_props}}"] + sel --> passcode_prop + space:7 + + cipher(("encipher")) + passcode_prop --> cipher + space:7 + + cipheredpass["ciphered passcode:\n{{ciphered_passcode}}"] + cipher --> cipheredpass + space:8 + + + comp(["compare"]) + cipheredpass --> comp + cipheredhashed --> comp + space:7 + + suc(("valid")) + fail(("invalid")) + comp --> suc + comp --> fail ```