document encipher decipher

This commit is contained in:
2025-03-26 04:08:35 -05:00
parent ee49b6cd53
commit 9cd9b76741
3 changed files with 279 additions and 133 deletions

View File

@@ -1,152 +1,245 @@
# Encipher and Decipher nKode # Encipher and Decipher nKode
### Customer Policy ## Customer Policy
- max nkode length: 10 - max nkode length: 10
- number of keys: 6 - number of keys: 6
- properties per key: 9 - properties per key: 9
- total number of properties: 54 - total number of properties: 54
### Customer Cipher ## Customer Cipher
- property key: [50817 32783 33745 35836 30092 4212 15938 64571 58354 41241 3649 38852 - property key: [32025 56251 54239 48726 57043 21466 36907 63872 5185 40361 24862 17007
37860 47294 10501 43278 9946 60484 34443 38446 57997 32874 49251 58321 15817 35928 23390 44980 24388 9693 29079 42520 27552 55989 21064 47245
15849 40891 43566 53732 31357 5248 22060 15762 23773 10428 22850 7975 31415 33398 15649 37888 60649 19865 33780 9215 998 23952 774 36297
11108 23454 32723 40871 6994 35130 41638 13889 6569 20765 56191 37770 56975 53701 54205 26202 57035 1589 27142 51011 41787 17416 14611 52249
4448 37031 30452 43080 24525 44717] 24554 2826 51850 29516 15825 40218]
- position key: [25392 13634 17753 25555 61290 50870 49934 53104 9796] - position key: [12958 41262 53564 57128 61719 22386 19660 14119 45982]
--- ---
### User Cipher ## User Cipher
- property key: [35724 37130 47630 20125 52673 62248 61979 44917 17470 11483 20317 56084 - property key: [62675 55318 20994 6862 11923 60069 48390 49437 49481 16571 8941 56614
34699 49571 32249 15009 43246 57623 21032 62384 61961 34049 1963 5370 10716 5617 39088 5352 303 46293 35634 37801 3265 31330 43043 35493
1121 47700 26633 59166 16526 38173 56846 41594 54438 8714 46049 25028 381 22746 14834 21538 11121 1556 31651 46121 26370 30287 43028 991
38681 2017 39749 42164 38277 19216 23760 35115 23020 18954 26604 50262 23653 3275 18911 25823 25799 46792 47794 37441 62612 49574 53766 19506
21588 62239 30226 58722 12644 39141] 22024 38690 14853 51773 46825 63850]
- passcode key: [51522 14440 21036 1484 4829 51359 61560 41543 23848 29080] - passcode key: [37275 57463 39825 1075 60548 11847 57381 15417 51401 34599]
- combined position key: [14972 5803 54986 46940 19674 32943 38431 42194 29083] - combined position key: [10840 53435 61304 62480 44024 35399 25077 63411 2973]
- mask key: [15948 8251 52095 4511 25902 21701 15340 4458 15137 44295] - mask key: [14299 50705 35900 48569 35541 57915 43280 32407 20229 24566]
#### Combined Postion Key ### Combined Postion Key
```mermaid ```mermaid
block-beta block-beta
columns 2 columns 2
user_pos["user position key:\n[22860 9193 37779 54415 41904 17945 21777 27554 22495]"] user_pos["user position key:\n[ 6342 29077 15940 11064 23279 56629 11577 49300 47107]"]
customer_pos["customer position key:\n[25392 13634 17753 25555 61290 50870 49934 53104 9796]"] customer_pos["customer position key:\n[12958 41262 53564 57128 61719 22386 19660 14119 45982]"]
space:2 space:2
xor(("XOR")):2 xor(("XOR")):2
user_pos --> xor user_pos --> xor
customer_pos --> xor customer_pos --> xor
space:2 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 xor --> comb_pos
``` ```
### User Keypad ## User Keypad
- 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 ```mermaid
block-beta block-beta
columns 2 columns 2
cprop["customer_property_key\n[50817 32783 33745 35836 30092 4212 15938 64571 58354 41241 3649 38852 cprop["customer_property_key\n[32025 56251 54239 48726 57043 21466 36907 63872 5185 40361 24862 17007
37860 47294 10501 43278 9946 60484 34443 38446 57997 32874 49251 58321 15817 35928 23390 44980 24388 9693 29079 42520 27552 55989 21064 47245
15849 40891 43566 53732 31357 5248 22060 15762 23773 10428 22850 7975 31415 33398 15649 37888 60649 19865 33780 9215 998 23952 774 36297
11108 23454 32723 40871 6994 35130 41638 13889 6569 20765 56191 37770 56975 53701 54205 26202 57035 1589 27142 51011 41787 17416 14611 52249
4448 37031 30452 43080 24525 44717]"] 24554 2826 51850 29516 15825 40218]"]
uprop["user_property_key\n[35724 37130 47630 20125 52673 62248 61979 44917 17470 11483 20317 56084 uprop["user_property_key\n[62675 55318 20994 6862 11923 60069 48390 49437 49481 16571 8941 56614
34699 49571 32249 15009 43246 57623 21032 62384 61961 34049 1963 5370 10716 5617 39088 5352 303 46293 35634 37801 3265 31330 43043 35493
1121 47700 26633 59166 16526 38173 56846 41594 54438 8714 46049 25028 381 22746 14834 21538 11121 1556 31651 46121 26370 30287 43028 991
38681 2017 39749 42164 38277 19216 23760 35115 23020 18954 26604 50262 23653 3275 18911 25823 25799 46792 47794 37441 62612 49574 53766 19506
21588 62239 30226 58722 12644 39141]"] 22024 38690 14853 51773 46825 63850]"]
space:2 space:2
xor1(("XOR")):2 xor1(("XOR")):2
cprop --> xor1 cprop --> xor1
uprop --> xor1 uprop --> xor1
space:2 space:2
prop["combined_property_key\n[19725 4357 14815 50529 47181 58204 52313 21326 42956 36290 16668 19664 prop["combined_property_key\n[35274 941 33245 42136 61504 47487 11565 14493 54536 56594 17395 40777
5231 31005 21756 37807 36404 3411 54435 26014 4228 1387 51144 63275 5141 39337 50158 47964 24171 37128 64165 13745 26465 41175 64107 12840
14728 9711 49703 14074 15091 33181 34850 40936 34939 2742 60067 32483 31690 55980 1235 49186 51096 19341 63575 38870 25828 11231 43794 36374
48253 23679 58518 15123 36567 49706 65142 49002 16453 6935 48275 22492 33514 56590 39522 645 47628 45309 53428 21762 22447 34222 60181 32811
17716 25528 230 19754 28329 13896]"] 2530 39976 61583 47473 35640 25712]"]
xor1 --> prop xor1 --> prop
pass["user_passcode_indices\n[22, 6, 38, 21]"] pass["user_passcode_indices\n[26, 31, 1, 53]"]
space:2 space:2
sel(("select\properties")):2 sel(("select\nproperties")):2
pass --> sel pass --> sel
prop --> sel prop --> sel
space:2 space:2
passcode["user passcode properties:\n[51144 52313 58518 1387]"]:2 passcode["user passcode properties:\n[ 1235 38870 941 25712]"]:2
sel --> passcode sel --> passcode
space:2 space:2
pad["zero pad to\nmax nkode length: 10"]:2 pad["zero pad to\nmax nkode length: 10"]:2
passcode -->pad passcode -->pad
space:2 space:2
paddedpasscode["padded passcode:\n[51144 52313 58518 1387 0 0 0 0 0 0]"] paddedpasscode["padded passcode:\n[ 1235 38870 941 25712 0 0 0 0 0 0]"]
pad --> paddedpasscode pad --> paddedpasscode
passkey["passcode key:\n[51522 14440 21036 1484 4829 51359 61560 41543 23848 29080]"] passkey["passcode key:\n[37275 57463 39825 1075 60548 11847 57381 15417 51401 34599]"]
space:2 space:2
xor2(("XOR")):2 xor2(("XOR")):2
passkey --> xor2 passkey --> xor2
paddedpasscode --> xor2 paddedpasscode --> xor2
space:2 space:2
cipheredpass["ciphered passcode:\n[ 3722 62513 46778 167 4829 51359 61560 41543 23848 29080]"]:2 cipheredpass["ciphered passcode:\n[38216 30625 38972 24643 60548 11847 57381 15417 51401 34599]"]:2
xor2 --> cipheredpass xor2 --> cipheredpass
space:2 space:2
hash(("hash")):2 hash(("hash")):2
cipheredpass --> hash cipheredpass --> hash
space:2 space:2
cipheredhashed["hashed ciphered passcode:\n$2b$12$AQRZP88momhTaKGYaPzdiuBybg7V49SiZ8y9PQMoT0plZrEsbYO.K"]:2 cipheredhashed["hashed ciphered passcode:\n$2b$12$6WJQ1Ilu7fZunT61eo.0e.nN81TiuW5BYHfFrEz.jBwE4dotjOX7e"]:2
hash --> cipheredhashed hash --> cipheredhashed
``` ```
#### Mask Encipher ### Mask Encipher
```mermaid ```mermaid
block-beta block-beta
columns 3 columns 3
passcode_idx["passcode indices:\n[22, 6, 38, 21]"] passcode_idx["passcode indices:\n[26, 31, 1, 53]"]
comb_pos["combined position key:\n[14972 5803 54986 46940 19674 32943 38431 42194 29083]"] comb_pos["combined position key:\n[10840 53435 61304 62480 44024 35399 25077 63411 2973]"]
cust_pos["customer position key:\n[25392 13634 17753 25555 61290 50870 49934 53104 9796]"] cust_pos["customer position key:\n[12958 41262 53564 57128 61719 22386 19660 14119 45982]"]
space:3 space:3
propidx(["Get Position Idx:\nmap each to element mod props_per_key"]) propidx(["Get Position Idx:\nmap each to element mod props_per_key"])
passcode_idx-->propidx passcode_idx-->propidx
space:1 space:1
xor1(("XOR")) xor1(("XOR"))
comb_pos --> xor1 comb_pos --> xor1
cust_pos --> xor1 cust_pos --> xor1
space:3 space:3
passcode_position_idx["passcode poition indices:\n[4, 6, 2, 3]"] passcode_position_idx["passcode poition indices:\n[8, 4, 1, 8]"]
propidx --> passcode_position_idx propidx --> passcode_position_idx
space:5 space:5
pad1(("Pad with\nrandom indices")) pad1(("Pad with\nrandom indices"))
passcode_position_idx --> pad1 passcode_position_idx --> pad1
space:5 space:5
posidx["Padded Passcode Position Indices:\n[4, 6, 2, 3, 7, 1, 8, 0, 5, 4]"] posidx["Padded Passcode Position Indices:\n[8, 4, 1, 8, 5, 4, 0, 1, 2, 3]"]
pad1 --> posidx pad1 --> posidx
space:1 space:1
user_pos["user position key:\n[22860 9193 37779 54415 41904 17945 21777 27554 22495]"] user_pos["user position key:\n[ 6342 29077 15940 11064 23279 56629 11577 49300 47107]"]
xor1 --> user_pos 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
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
``` ```

View File

@@ -11,6 +11,14 @@ from src.models import NKodePolicy, KeypadSize
from src.nkode_api import NKodeAPI from src.nkode_api import NKodeAPI
from src.utils import select_keys_with_passcode_values 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__": if __name__ == "__main__":
api = NKodeAPI() api = NKodeAPI()
@@ -54,6 +62,9 @@ if __name__ == "__main__":
ordered_user_position_key = user_position_key[padded_passcode_position_indices] ordered_user_position_key = user_position_key[padded_passcode_position_indices]
mask = ordered_user_position_key ^ user.cipher.mask_key mask = ordered_user_position_key ^ user.cipher.mask_key
encoded_mask = user.cipher.encode_base64_str(mask) 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 = { context = {
"max_nkode_len": policy.max_nkode_len, "max_nkode_len": policy.max_nkode_len,
"numb_of_keys": keypad_size.numb_of_keys, "numb_of_keys": keypad_size.numb_of_keys,
@@ -75,5 +86,8 @@ if __name__ == "__main__":
"pad_user_passcode_idxs": padded_passcode_position_indices, "pad_user_passcode_idxs": padded_passcode_position_indices,
"ordered_user_position_key":ordered_user_position_key, "ordered_user_position_key":ordered_user_position_key,
"mask": mask, "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) render_markdown_template(Path("../templates/encipher_decipher_nkode.template.md"), Path("../encipher_decipher_nkode.md"), context)

View File

@@ -140,34 +140,73 @@ block-beta
login_keypad["login keypad:\n{{login_keypad}}"] login_keypad["login keypad:\n{{login_keypad}}"]
mask["enciphered mask:\n {{mask}}"] mask["enciphered mask:\n {{mask}}"]
mask_key["mask key:\n{{mask_key}}"] mask_key["mask key:\n{{mask_key}}"]
space:6
user_position_key["user position key:\n{{user_position_key}}"]
passcode_pos["ordered user passcode positions:\n{{ordered_user_position_key}}"]
space:4 space:4
selectkeys(("select keys"))
space:2 space:2
xor1(("XOR"))
mask --> xor1
mask_key --> xor1
selected_keys -->selectkeys
login_keypad --> selectkeys
space:4
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")) get_passcode_idxs(("recover passcode\nposition indices"))
user_position_key --> get_passcode_idxs
passcode_pos --> get_passcode_idxs
space:7 space:7
passcode_pos_idxs["padded passcode position indices:\n{{pad_user_passcode_idxs}}"] 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")) get_presumed_idxs(("recover passcode\nproperty indices"))
ordered_keys --> get_presumed_idxs
passcode_pos_idxs --> get_presumed_idxs
space:7 space:7
passcode_prop_idxs["presumed passcode property indices:\n{{user_passcode_idxs}}"] passcode_prop_idxs["presumed passcode property indices:\n{{user_passcode_idxs}}"]
space:7
sel(("select\nproperties"))
space:1 space:1
prop["combined_property_key\n{{combined_property_key}}"] 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}}"] 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
``` ```