330 lines
12 KiB
Markdown
330 lines
12 KiB
Markdown
# 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: [17384 21071 64263 14173 48872 51553 28021 45694 56555 33805 2625 64735
|
|
26395 23421 5291 64801 27594 45755 18570 21108 24021 32654 60698 36958
|
|
32655 8083 48743 18902 2050 58888 49782 53855 6539 61094 11244 16942
|
|
26841 50742 36717 15708 51338 47424 44243 62691 15630 41373 14725 34483
|
|
9141 48067 10942 13010 44634 40143]
|
|
- position key: [26845 24321 52293 19187 29228 61277 32841 51235 34682]
|
|
|
|
|
|
---
|
|
|
|
## User Cipher
|
|
- property key: [ 6859 23873 43509 63326 38209 4681 6549 58196 20386 45543 7213 10665
|
|
59595 37675 38733 28230 18106 11839 217 58358 45503 9119 13711 47091
|
|
2477 4601 12968 25412 57571 1504 36875 36008 22596 65108 20334 57220
|
|
57449 9749 48916 23941 16493 45581 22735 8888 45253 44959 47418 52406
|
|
38448 31290 22494 51292 26944 44318]
|
|
- passcode key: [61110 58124 49630 7713 65071 1473 10319 26443 24286 22]
|
|
- combined position key: [17105 6226 55543 52110 63357 65173 47236 36681 52804]
|
|
- mask key: [ 5981 20544 34128 22101 9735 7951 7840 53333 61565 214]
|
|
|
|
### Combined Postion Key
|
|
```mermaid
|
|
block-beta
|
|
columns 2
|
|
user_pos["user position key:\n[15348 25802 2932 35759 37505 7088 5681 24341 39057]"]
|
|
customer_pos["customer position key:\n[26845 24321 52293 19187 29228 61277 32841 51235 34682]"]
|
|
space:2
|
|
xor(("XOR")):2
|
|
user_pos --> xor
|
|
customer_pos --> xor
|
|
space:2
|
|
comb_pos["combined position key\n[17105 6226 55543 52110 63357 65173 47236 36681 52804]"]:2
|
|
xor --> comb_pos
|
|
```
|
|
|
|
## User Keypad
|
|
- keypad example:<br/>Key 0: [ 0 1 2 21 4 5 24 16 44]<br/>Key 1: [36 46 38 3 49 23 33 43 35]<br/>Key 2: [18 37 20 39 40 50 42 25 26]<br/>Key 3: [45 19 47 48 31 41 51 52 53]<br/>Key 4: [27 28 11 12 22 32 15 7 17]<br/>Key 5: [ 9 10 29 30 13 14 6 34 8]<br/>
|
|
- user passcode indices: [16, 23, 45, 41]
|
|
|
|
## nKode Cipher
|
|
|
|
### Passcode Hash
|
|
```mermaid
|
|
block-beta
|
|
columns 2
|
|
cprop["customer_property_key\n[17384 21071 64263 14173 48872 51553 28021 45694 56555 33805 2625 64735
|
|
26395 23421 5291 64801 27594 45755 18570 21108 24021 32654 60698 36958
|
|
32655 8083 48743 18902 2050 58888 49782 53855 6539 61094 11244 16942
|
|
26841 50742 36717 15708 51338 47424 44243 62691 15630 41373 14725 34483
|
|
9141 48067 10942 13010 44634 40143]"]
|
|
uprop["user_property_key\n[ 6859 23873 43509 63326 38209 4681 6549 58196 20386 45543 7213 10665
|
|
59595 37675 38733 28230 18106 11839 217 58358 45503 9119 13711 47091
|
|
2477 4601 12968 25412 57571 1504 36875 36008 22596 65108 20334 57220
|
|
57449 9749 48916 23941 16493 45581 22735 8888 45253 44959 47418 52406
|
|
38448 31290 22494 51292 26944 44318]"]
|
|
space:2
|
|
xor1(("XOR")):2
|
|
cprop --> xor1
|
|
uprop --> xor1
|
|
space:2
|
|
prop["combined_property_key\n[ 3998 21572 55042 58365 40151 56917 7146 59748 41624 5784 34350 32869
|
|
53395 9331 14458 19129 53918 11036 33943 47140 13973 55881 48429 60127
|
|
51683 5313 42763 50259 48824 61851 14521 48287 21836 28900 38175 36849
|
|
53395 56365 51787 3932 9457 4434 50392 35667 65060 8394 57404 19291
|
|
36039 26883 24085 29399 24324 41103]"]
|
|
xor1 --> prop
|
|
pass["user_passcode_indices\n[16, 23, 45, 41]"]
|
|
space:2
|
|
sel(("select\nproperties")):2
|
|
pass --> sel
|
|
prop --> sel
|
|
space:2
|
|
passcode["user passcode properties:\n[53918 60127 8394 4434]"]:2
|
|
sel --> passcode
|
|
space:2
|
|
pad["zero pad to\nmax nkode length: 10"]:2
|
|
passcode -->pad
|
|
space:2
|
|
paddedpasscode["padded passcode:\n[53918 60127 8394 4434 0 0 0 0 0 0]"]
|
|
pad --> paddedpasscode
|
|
passkey["passcode key:\n[61110 58124 49630 7713 65071 1473 10319 26443 24286 22]"]
|
|
space:2
|
|
xor2(("XOR")):2
|
|
passkey --> xor2
|
|
paddedpasscode --> xor2
|
|
space:2
|
|
cipheredpass["ciphered passcode:\n[15400 2515 57620 3955 65071 1473 10319 26443 24286 22]"]:2
|
|
xor2 --> cipheredpass
|
|
space:2
|
|
hash(("hash")):2
|
|
cipheredpass --> hash
|
|
space:2
|
|
cipheredhashed["hashed ciphered passcode:\n$2b$12$4ew1R/6AXYkPuF4PO4CpQeCEEGMuoo7N8Rnj1yAGOGenJ8vc689ge"]:2
|
|
hash --> cipheredhashed
|
|
```
|
|
|
|
### Mask Encipher
|
|
```mermaid
|
|
block-beta
|
|
columns 3
|
|
passcode_idx["passcode indices:\n[16, 23, 45, 41]"]
|
|
comb_pos["combined position key:\n[17105 6226 55543 52110 63357 65173 47236 36681 52804]"]
|
|
cust_pos["customer position key:\n[26845 24321 52293 19187 29228 61277 32841 51235 34682]"]
|
|
|
|
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, 5, 0, 5]"]
|
|
propidx --> passcode_position_idx
|
|
|
|
space:5
|
|
pad1(("Pad with\nrandom indices"))
|
|
passcode_position_idx --> pad1
|
|
|
|
space:5
|
|
posidx["Padded Passcode Position Indices:\n[7, 5, 0, 5, 6, 3, 1, 2, 8, 5]"]
|
|
pad1 --> posidx
|
|
space:1
|
|
user_pos["user position key:\n[15348 25802 2932 35759 37505 7088 5681 24341 39057]"]
|
|
xor1 --> user_pos
|
|
|
|
space:4
|
|
sel(("select positions"))
|
|
user_pos --> sel
|
|
posidx --> sel
|
|
space:5
|
|
passcode_pos["ordered user passcode positions:\n[24341 7088 15348 7088 5681 35759 25802 2932 39057 7088]"]
|
|
sel --> passcode_pos
|
|
mask_key["mask key\n[ 5981 20544 34128 22101 9735 7951 7840 53333 61565 214]"]
|
|
space:4
|
|
xor2(("XOR"))
|
|
mask_key --> xor2
|
|
passcode_pos --> xor2
|
|
space:5
|
|
mask["enciphered mask:\n [18504 19440 48804 19941 12342 38048 31338 56097 26860 7014]"]
|
|
xor2 --> mask
|
|
```
|
|
|
|
### Validate nKode
|
|
|
|
```mermaid
|
|
block-beta
|
|
columns 3
|
|
selected_keys["selected keys:\n[0, 1, 3, 3]"]
|
|
login_keypad["login keypad:\nKey 0: [ 0 1 2 21 4 5 24 16 44]
|
|
Key 1: [36 46 38 3 49 23 33 43 35]
|
|
Key 2: [18 37 20 39 40 50 42 25 26]
|
|
Key 3: [45 19 47 48 31 41 51 52 53]
|
|
Key 4: [27 28 11 12 22 32 15 7 17]
|
|
Key 5: [ 9 10 29 30 13 14 6 34 8]
|
|
"]
|
|
space:4
|
|
|
|
selectkeys(("select keys"))
|
|
mask["enciphered mask:\n [18504 19440 48804 19941 12342 38048 31338 56097 26860 7014]"]
|
|
mask_key["mask key:\n[ 5981 20544 34128 22101 9735 7951 7840 53333 61565 214]"]
|
|
space:2
|
|
|
|
xor1(("XOR"))
|
|
mask --> xor1
|
|
mask_key --> xor1
|
|
selected_keys --> selectkeys
|
|
login_keypad --> selectkeys
|
|
space:3
|
|
|
|
ordered_keys["ordered keys:\n[[ 0 1 2 21 4 5 24 16 44]
|
|
[36 46 38 3 49 23 33 43 35]
|
|
[45 19 47 48 31 41 51 52 53]
|
|
[45 19 47 48 31 41 51 52 53]]"]
|
|
user_position_key["user position key:\n[15348 25802 2932 35759 37505 7088 5681 24341 39057]"]
|
|
passcode_pos["ordered user passcode positions:\n[24341 7088 15348 7088 5681 35759 25802 2932 39057 7088]"]
|
|
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, 5, 0, 5, 6, 3, 1, 2, 8, 5]"]
|
|
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, 23, 45, 41]"]
|
|
prop["combined_property_key\n[ 3998 21572 55042 58365 40151 56917 7146 59748 41624 5784 34350 32869
|
|
53395 9331 14458 19129 53918 11036 33943 47140 13973 55881 48429 60127
|
|
51683 5313 42763 50259 48824 61851 14521 48287 21836 28900 38175 36849
|
|
53395 56365 51787 3932 9457 4434 50392 35667 65060 8394 57404 19291
|
|
36039 26883 24085 29399 24324 41103]"]
|
|
cipheredhashed["hashed ciphered passcode:\n$2b$12$4ew1R/6AXYkPuF4PO4CpQeCEEGMuoo7N8Rnj1yAGOGenJ8vc689ge"]
|
|
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[53918 60127 8394 4434]"]
|
|
sel --> passcode_prop
|
|
space:5
|
|
|
|
cipher(("encipher"))
|
|
passcode_prop --> cipher
|
|
space:5
|
|
|
|
cipheredpass["ciphered passcode:\n[15400 2515 57620 3955 65071 1473 10319 26443 24286 22]"]
|
|
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:<br/>[ 5461 2309 32503 5283 2454 52252 639 2608 60730 42879 39427 43468
|
|
14424 46936 44855 9471 37924 1315 33870 23506 34602 63958 34978 23852
|
|
49230 1336 38307 42775 24155 62587 43186 12343 3336 36528 55921 20597
|
|
12538 64056 30047 21209 25756 41823 39959 43499 20193 36693 22790 34797
|
|
6903 4921 2507 47755 13892 3473]`"]
|
|
new_prop["`new customer property key:<br/>[17384 21071 64263 14173 48872 51553 28021 45694 56555 33805 2625 64735
|
|
26395 23421 5291 64801 27594 45755 18570 21108 24021 32654 60698 36958
|
|
32655 8083 48743 18902 2050 58888 49782 53855 6539 61094 11244 16942
|
|
26841 50742 36717 15708 51338 47424 44243 62691 15630 41373 14725 34483
|
|
9141 48067 10942 13010 44634 40143]`"]
|
|
old_pos["`old customer position key:<br/>[31013 31896 54147 16417 26108 58661 44725 53340 22229]`"]
|
|
new_pos["`new customer position key:<br/>[26845 24321 52293 19187 29228 61277 32841 51235 34682]`"]
|
|
xor1(("XOR"))
|
|
xor2(("XOR"))
|
|
xor_prop["`xor property key:<br/>[22205 23370 34288 9214 46974 1405 28426 47182 12753 9074 36930 21779
|
|
24387 60453 48028 55774 65518 47000 52420 2470 56063 34392 26040 52594
|
|
49089 6827 11204 61121 22105 4723 27332 57960 5251 24598 61853 4699
|
|
22563 15374 64050 28549 44054 6687 12484 23816 29679 11976 24707 350
|
|
14658 43258 9077 34905 38942 37214]`"]
|
|
xor_pos["`xor position key:<br/>[ 4600 9113 8134 2770 6096 2680 12028 6271 53679]`"]
|
|
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:<br/>[15348 25802 2932 35759 37505 7088 5681 24341 39057]`"]
|
|
old_user_prop["`property key:<br/>[ 6859 23873 43509 63326 38209 4681 6549 58196 20386 45543 7213 10665
|
|
59595 37675 38733 28230 18106 11839 217 58358 45503 9119 13711 47091
|
|
2477 4601 12968 25412 57571 1504 36875 36008 22596 65108 20334 57220
|
|
57449 9749 48916 23941 16493 45581 22735 8888 45253 44959 47418 52406
|
|
38448 31290 22494 51292 26944 44318]`"]
|
|
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:<br/>[21289 15307 50993 49500 57517 62701 38520 38710 8171]`"]
|
|
inter_user_prop["`property key:<br/>[19574 1547 11269 54432 8767 5940 30367 23322 32371 37525 35951 31930
|
|
46984 32526 11473 47000 47444 39335 52253 59984 27456 42439 20535 31361
|
|
46700 2898 6508 36229 46778 6035 64207 28352 19655 40514 48883 52703
|
|
47178 6683 17702 12800 60539 43026 26635 32688 49962 33111 55737 52712
|
|
44914 53952 29867 16389 61790 15424]`"]
|
|
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:<br/>[65323 43160 15313 31589 56469 63324 16779 58877 46813]`"]
|
|
new_user_prop["`property key:<br/>[ 4877 339 2263 7952 818 48661 46131 56267 23637 56219 31553 4783
|
|
17734 11957 16009 8164 58199 21329 25805 42484 63685 33425 4845 26086
|
|
45993 37895 46700 19583 28941 36895 52143 15209 11188 569 60851 63329
|
|
33273 55731 2564 42007 14482 45812 39063 18143 15261 56200 36966 9873
|
|
43332 61052 51872 65507 42946 33203]`"]
|
|
new_renew["renew: False"]
|
|
end
|
|
login --> new_user
|
|
end
|
|
|
|
``` |