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: [58201 3855 47017 50828 14104 4268 29079 19099 12271 55135 54341 2465
|
|
32959 3356 36643 50702 8094 11335 39310 38981 55881 6507 22508 16345
|
|
19379 55560 52385 29733 25178 37713 59696 16347 14811 20691 101 35545
|
|
48103 63525 408 28174 57763 21416 59610 976 40160 13681 17146 54023
|
|
25410 42165 3856 59580 27726 13822]
|
|
- position key: [59066 9448 56848 58798 57675 37475 8528 34148 34468]
|
|
|
|
|
|
---
|
|
|
|
## User Cipher
|
|
- property key: [61737 49256 8018 54927 21709 65009 3885 46808 12375 11644 35339 52787
|
|
60805 49964 2754 34451 22775 9278 14454 37226 46352 60033 49123 21025
|
|
6479 60885 9059 20442 64510 63443 6758 52715 61370 9158 50160 8810
|
|
27528 11812 34328 47745 43244 9125 55623 10800 49542 55251 26390 19027
|
|
23252 5772 30639 25220 21506 59558]
|
|
- passcode key: [54682 39190 21777 53204 58859 47387 24762 19698 44816 55464]
|
|
- combined position key: [52800 11537 463 51813 36017 64303 52526 57594 11887]
|
|
- mask key: [61564 54039 23310 1396 28615 39019 39047 46821 40711 32470]
|
|
|
|
### Combined Postion Key
|
|
```mermaid
|
|
block-beta
|
|
columns 2
|
|
user_pos["user position key:\n[19938 59072 31217 46834 52213 218 38377 1271 54783]"]
|
|
customer_pos["customer position key:\n[59066 9448 56848 58798 57675 37475 8528 34148 34468]"]
|
|
space:2
|
|
xor(("XOR")):2
|
|
user_pos --> xor
|
|
customer_pos --> xor
|
|
space:2
|
|
comb_pos["combined position key\n[52800 11537 463 51813 36017 64303 52526 57594 11887]"]:2
|
|
xor --> comb_pos
|
|
```
|
|
|
|
## User Keypad
|
|
- keypad example:<br/>Key 0: [27 19 38 30 31 41 6 7 26]<br/>Key 1: [36 37 11 48 4 23 51 34 44]<br/>Key 2: [45 1 20 12 49 50 15 52 53]<br/>Key 3: [18 46 47 3 22 5 33 43 35]<br/>Key 4: [ 9 28 29 21 13 14 42 16 17]<br/>Key 5: [ 0 10 2 39 40 32 24 25 8]<br/>
|
|
- user passcode indices: [30, 38, 11, 51]
|
|
|
|
## nKode Cipher
|
|
|
|
### Passcode Hash
|
|
```mermaid
|
|
block-beta
|
|
columns 2
|
|
cprop["customer_property_key\n[58201 3855 47017 50828 14104 4268 29079 19099 12271 55135 54341 2465
|
|
32959 3356 36643 50702 8094 11335 39310 38981 55881 6507 22508 16345
|
|
19379 55560 52385 29733 25178 37713 59696 16347 14811 20691 101 35545
|
|
48103 63525 408 28174 57763 21416 59610 976 40160 13681 17146 54023
|
|
25410 42165 3856 59580 27726 13822]"]
|
|
uprop["user_property_key\n[61737 49256 8018 54927 21709 65009 3885 46808 12375 11644 35339 52787
|
|
60805 49964 2754 34451 22775 9278 14454 37226 46352 60033 49123 21025
|
|
6479 60885 9059 20442 64510 63443 6758 52715 61370 9158 50160 8810
|
|
27528 11812 34328 47745 43244 9125 55623 10800 49542 55251 26390 19027
|
|
23252 5772 30639 25220 21506 59558]"]
|
|
space:2
|
|
xor1(("XOR")):2
|
|
cprop --> xor1
|
|
uprop --> xor1
|
|
space:2
|
|
prop["combined_property_key\n[27145 64606 2214 956 59410 24299 43596 51759 39102 28353 20824 14874
|
|
27994 60897 60356 49474 41290 62135 52049 26214 37014 45529 43514 40298
|
|
25315 52116 23008 2744 3269 7285 34470 4311 21401 14127 50809 13541
|
|
5394 30989 34092 27076 35814 63505 33710 18123 25966 61467 19353 14805
|
|
58907 44436 41458 3440 7755 35403]"]
|
|
xor1 --> prop
|
|
pass["user_passcode_indices\n[30, 38, 11, 51]"]
|
|
space:2
|
|
sel(("select\nproperties")):2
|
|
pass --> sel
|
|
prop --> sel
|
|
space:2
|
|
passcode["user passcode properties:\n[34470 34092 14874 3440]"]:2
|
|
sel --> passcode
|
|
space:2
|
|
pad["zero pad to\nmax nkode length: 10"]:2
|
|
passcode -->pad
|
|
space:2
|
|
paddedpasscode["padded passcode:\n[34470 34092 14874 3440 0 0 0 0 0 0]"]
|
|
pad --> paddedpasscode
|
|
passkey["passcode key:\n[54682 39190 21777 53204 58859 47387 24762 19698 44816 55464]"]
|
|
space:2
|
|
xor2(("XOR")):2
|
|
passkey --> xor2
|
|
paddedpasscode --> xor2
|
|
space:2
|
|
cipheredpass["ciphered passcode:\n[21308 7226 28427 49828 58859 47387 24762 19698 44816 55464]"]:2
|
|
xor2 --> cipheredpass
|
|
space:2
|
|
hash(("hash")):2
|
|
cipheredpass --> hash
|
|
space:2
|
|
cipheredhashed["hashed ciphered passcode:\n$2b$12$uR5ilcM4r.xjbzW4kGWf2.tbGVWSwrnqp1s6sGzqUmgcE1ncQK8UW"]:2
|
|
hash --> cipheredhashed
|
|
```
|
|
|
|
### Mask Encipher
|
|
```mermaid
|
|
block-beta
|
|
columns 3
|
|
passcode_idx["passcode indices:\n[30, 38, 11, 51]"]
|
|
comb_pos["combined position key:\n[52800 11537 463 51813 36017 64303 52526 57594 11887]"]
|
|
cust_pos["customer position key:\n[59066 9448 56848 58798 57675 37475 8528 34148 34468]"]
|
|
|
|
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[3, 2, 2, 6]"]
|
|
propidx --> passcode_position_idx
|
|
|
|
space:5
|
|
pad1(("Pad with\nrandom indices"))
|
|
passcode_position_idx --> pad1
|
|
|
|
space:5
|
|
posidx["Padded Passcode Position Indices:\n[3, 2, 2, 6, 1, 2, 3, 6, 8, 5]"]
|
|
pad1 --> posidx
|
|
space:1
|
|
user_pos["user position key:\n[19938 59072 31217 46834 52213 218 38377 1271 54783]"]
|
|
xor1 --> user_pos
|
|
|
|
space:4
|
|
sel(("select positions"))
|
|
user_pos --> sel
|
|
posidx --> sel
|
|
space:5
|
|
passcode_pos["ordered user passcode positions:\n[46834 31217 31217 38377 59072 31217 46834 38377 54783 218]"]
|
|
sel --> passcode_pos
|
|
mask_key["mask key\n[61564 54039 23310 1396 28615 39019 39047 46821 40711 32470]"]
|
|
space:4
|
|
xor2(("XOR"))
|
|
mask_key --> xor2
|
|
passcode_pos --> xor2
|
|
space:5
|
|
mask["enciphered mask:\n [18062 43750 8959 37021 35079 57754 11893 8972 19192 32268]"]
|
|
xor2 --> mask
|
|
```
|
|
|
|
### Validate nKode
|
|
|
|
```mermaid
|
|
block-beta
|
|
columns 3
|
|
selected_keys["keys selected by user during login:\n[0, 0, 1, 1]"]
|
|
login_keypad["login keypad:\nKey 0: [27 19 38 30 31 41 6 7 26]
|
|
Key 1: [36 37 11 48 4 23 51 34 44]
|
|
Key 2: [45 1 20 12 49 50 15 52 53]
|
|
Key 3: [18 46 47 3 22 5 33 43 35]
|
|
Key 4: [ 9 28 29 21 13 14 42 16 17]
|
|
Key 5: [ 0 10 2 39 40 32 24 25 8]
|
|
"]
|
|
space:4
|
|
|
|
selectkeys(("filter keys"))
|
|
mask["enciphered mask:\n [18062 43750 8959 37021 35079 57754 11893 8972 19192 32268]"]
|
|
mask_key["mask key:\n[61564 54039 23310 1396 28615 39019 39047 46821 40711 32470]"]
|
|
space:2
|
|
|
|
xor1(("XOR"))
|
|
mask --> xor1
|
|
mask_key --> xor1
|
|
selected_keys --> selectkeys
|
|
login_keypad --> selectkeys
|
|
space:3
|
|
|
|
ordered_keys["ordered keys:\n[[27 19 38 30 31 41 6 7 26]
|
|
[27 19 38 30 31 41 6 7 26]
|
|
[36 37 11 48 4 23 51 34 44]
|
|
[36 37 11 48 4 23 51 34 44]]"]
|
|
user_position_key["user position key:\n[19938 59072 31217 46834 52213 218 38377 1271 54783]"]
|
|
passcode_pos["ordered user passcode positions:\n[46834 31217 31217 38377 59072 31217 46834 38377 54783 218]"]
|
|
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[3, 2, 2, 6, 1, 2, 3, 6, 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[30, 38, 11, 51]"]
|
|
prop["combined_property_key\n[27145 64606 2214 956 59410 24299 43596 51759 39102 28353 20824 14874
|
|
27994 60897 60356 49474 41290 62135 52049 26214 37014 45529 43514 40298
|
|
25315 52116 23008 2744 3269 7285 34470 4311 21401 14127 50809 13541
|
|
5394 30989 34092 27076 35814 63505 33710 18123 25966 61467 19353 14805
|
|
58907 44436 41458 3440 7755 35403]"]
|
|
cipheredhashed["hashed ciphered passcode:\n$2b$12$uR5ilcM4r.xjbzW4kGWf2.tbGVWSwrnqp1s6sGzqUmgcE1ncQK8UW"]
|
|
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[34470 34092 14874 3440]"]
|
|
sel --> passcode_prop
|
|
space:5
|
|
|
|
cipher(("encipher"))
|
|
passcode_prop --> cipher
|
|
space:5
|
|
|
|
cipheredpass["ciphered passcode:\n[21308 7226 28427 49828 58859 47387 24762 19698 44816 55464]"]
|
|
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/>[39712 15414 6132 54579 48351 41754 42337 31991 43241 17341 56147 62505
|
|
32991 11981 57606 18385 63933 54921 62247 63244 9606 23384 5657 53067
|
|
31660 9793 31363 17762 63291 60326 40128 56636 48163 5353 1417 5775
|
|
32410 22313 820 54085 8970 56244 23273 27899 42216 10184 11407 29574
|
|
48335 47896 54877 28660 19017 25325]`"]
|
|
new_prop["`new customer property key:<br/>[58201 3855 47017 50828 14104 4268 29079 19099 12271 55135 54341 2465
|
|
32959 3356 36643 50702 8094 11335 39310 38981 55881 6507 22508 16345
|
|
19379 55560 52385 29733 25178 37713 59696 16347 14811 20691 101 35545
|
|
48103 63525 408 28174 57763 21416 59610 976 40160 13681 17146 54023
|
|
25410 42165 3856 59580 27726 13822]`"]
|
|
old_pos["`old customer position key:<br/>[33698 52177 30782 31895 18244 64501 22727 58381 64400]`"]
|
|
new_pos["`new customer position key:<br/>[59066 9448 56848 58798 57675 37475 8528 34148 34468]`"]
|
|
xor1(("XOR"))
|
|
xor2(("XOR"))
|
|
xor_prop["`xor property key:<br/>[30841 13113 41053 5055 35783 46006 54518 13932 34566 38114 3862 64904
|
|
96 9169 28197 33247 58915 64206 27305 28489 65487 16947 16885 61586
|
|
12319 65353 46626 12615 38241 30967 30192 58087 34296 17466 1516 40022
|
|
50557 44812 684 48459 49833 34844 45619 28459 14344 4793 28277 41089
|
|
57229 8109 55629 34632 9735 22291]`"]
|
|
xor_pos["`xor position key:<br/>[25880 61241 42542 39225 42511 27030 31127 24937 32052]`"]
|
|
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/>[19938 59072 31217 46834 52213 218 38377 1271 54783]`"]
|
|
old_user_prop["`property key:<br/>[61737 49256 8018 54927 21709 65009 3885 46808 12375 11644 35339 52787
|
|
60805 49964 2754 34451 22775 9278 14454 37226 46352 60033 49123 21025
|
|
6479 60885 9059 20442 64510 63443 6758 52715 61370 9158 50160 8810
|
|
27528 11812 34328 47745 43244 9125 55623 10800 49542 55251 26390 19027
|
|
23252 5772 30639 25220 21506 59558]`"]
|
|
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/>[43864 49704 42977 21340 10942 37561 46265 33171 21339]`"]
|
|
inter_user_prop["`property key:<br/>[35152 62289 48911 50480 57098 20039 56283 32948 46929 47518 34077 13243
|
|
60901 57597 25831 1868 48852 57072 21215 65059 19167 43186 65046 41651
|
|
10576 4764 38209 32413 28319 36644 28566 12044 27202 26620 50716 48700
|
|
44789 33064 33972 1994 27205 43961 27508 17691 63886 50538 2403 60114
|
|
34137 2337 44770 58828 29189 49077]`"]
|
|
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/>[ 6533 37152 58679 48102 36450 2846 47432 25286 7670]`"]
|
|
new_user_prop["`property key:<br/>[46243 7833 58428 7967 9894 32124 48453 54560 26021 20475 10880 7429
|
|
26439 31401 37980 56964 32338 15187 9442 19302 53060 31276 34465 43143
|
|
33088 8587 47204 47532 45177 35842 11142 47055 40284 49647 9306 58542
|
|
63251 40940 32915 53183 16853 43890 60339 30610 6078 59395 7618 59221
|
|
44934 37153 10149 59493 8228 59563]`"]
|
|
new_renew["renew: False"]
|
|
end
|
|
login --> new_user
|
|
end
|
|
|
|
``` |