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: [12683 37623 46427 24232 53244 25444 34138 18278 52542 17394 45705 57706
|
|
22403 60684 20477 13672 47069 29025 8419 8211 36163 21756 45607 31517
|
|
44312 19522 17814 41879 18325 2622 43956 30841 59391 52171 51029 44917
|
|
28846 25756 24212 4239 11940 31284 58701 7692 31504 25629 20378 35504
|
|
45861 59860 4819 52686 62304 58952]
|
|
- position key: [29587 60364 47856 53105 61491 65374 34021 4048 33167]
|
|
|
|
|
|
---
|
|
|
|
## User Cipher
|
|
- property key: [14398 56125 29659 36184 61716 58844 42259 48679 36351 53209 63475 35295
|
|
1927 35139 48674 32220 3724 62784 11332 63262 61320 62990 59038 61659
|
|
31829 24135 49167 50519 23410 2470 22259 32544 30127 27527 18620 39840
|
|
105 31222 38444 37307 58991 39926 16285 42364 843 30922 30467 43324
|
|
13596 3432 28064 33665 35252 8733]
|
|
- passcode key: [43892 51915 3968 29221 4 52573 20838 48052 39138 14671]
|
|
- combined position key: [40967 35807 54041 52517 31281 56961 42242 11385 1018]
|
|
- mask key: [57731 56088 1801 26915 40765 22438 9693 31860 17942 7993]
|
|
|
|
### Combined Postion Key
|
|
```mermaid
|
|
block-beta
|
|
columns 2
|
|
user_pos["user position key:\n[24890 2120 45550 47291 61945 28551 49488 49734 20771]"]
|
|
customer_pos["customer position key:\n[29587 60364 47856 53105 61491 65374 34021 4048 33167]"]
|
|
space:2
|
|
xor(("XOR")):2
|
|
user_pos --> xor
|
|
customer_pos --> xor
|
|
space:2
|
|
comb_pos["combined position key\n[40967 35807 54041 52517 31281 56961 42242 11385 1018]"]:2
|
|
xor --> comb_pos
|
|
```
|
|
|
|
## User Keypad
|
|
- keypad:
|
|
- user passcode indices: [12, 4, 51, 33]
|
|
|
|
## nKode Cipher
|
|
|
|
### Passcode Hash
|
|
```mermaid
|
|
block-beta
|
|
columns 2
|
|
cprop["customer_property_key\n[12683 37623 46427 24232 53244 25444 34138 18278 52542 17394 45705 57706
|
|
22403 60684 20477 13672 47069 29025 8419 8211 36163 21756 45607 31517
|
|
44312 19522 17814 41879 18325 2622 43956 30841 59391 52171 51029 44917
|
|
28846 25756 24212 4239 11940 31284 58701 7692 31504 25629 20378 35504
|
|
45861 59860 4819 52686 62304 58952]"]
|
|
uprop["user_property_key\n[14398 56125 29659 36184 61716 58844 42259 48679 36351 53209 63475 35295
|
|
1927 35139 48674 32220 3724 62784 11332 63262 61320 62990 59038 61659
|
|
31829 24135 49167 50519 23410 2470 22259 32544 30127 27527 18620 39840
|
|
105 31222 38444 37307 58991 39926 16285 42364 843 30922 30467 43324
|
|
13596 3432 28064 33665 35252 8733]"]
|
|
space:2
|
|
xor1(("XOR")):2
|
|
cprop --> xor1
|
|
uprop --> xor1
|
|
space:2
|
|
prop["combined_property_key\n[32565 54767 5127 26787 61372 9024 10051 31192 36215 25953 63643 7907
|
|
34275 49131 65253 35224 52025 49525 36214 22719 57589 6411 46986 50058
|
|
38701 701 36150 6894 36770 58151 63226 62425 5898 2177 3529 29703
|
|
30896 41755 9016 47283 14611 18887 54104 55155 32367 2577 31449 39233
|
|
18953 7162 61412 6044 61623 4668]"]
|
|
xor1 --> prop
|
|
pass["user_passcode_indices\n[12, 4, 51, 33]"]
|
|
space:2
|
|
sel(("select\nproperties")):2
|
|
pass --> sel
|
|
prop --> sel
|
|
space:2
|
|
passcode["user passcode properties:\n[34275 61372 6044 2177]"]:2
|
|
sel --> passcode
|
|
space:2
|
|
pad["zero pad to\nmax nkode length: 10"]:2
|
|
passcode -->pad
|
|
space:2
|
|
paddedpasscode["padded passcode:\n[34275 61372 6044 2177 0 0 0 0 0 0]"]
|
|
pad --> paddedpasscode
|
|
passkey["passcode key:\n[43892 51915 3968 29221 4 52573 20838 48052 39138 14671]"]
|
|
space:2
|
|
xor2(("XOR")):2
|
|
passkey --> xor2
|
|
paddedpasscode --> xor2
|
|
space:2
|
|
cipheredpass["ciphered passcode:\n[11927 9591 6172 31396 4 52573 20838 48052 39138 14671]"]:2
|
|
xor2 --> cipheredpass
|
|
space:2
|
|
hash(("hash")):2
|
|
cipheredpass --> hash
|
|
space:2
|
|
cipheredhashed["hashed ciphered passcode:\n$2b$12$Jf48A5rmjkxb0II7CkuD8.Qg3GCuROgbS99pMbthC2gXt9szx9gmm"]:2
|
|
hash --> cipheredhashed
|
|
```
|
|
|
|
### Mask Encipher
|
|
```mermaid
|
|
block-beta
|
|
columns 3
|
|
passcode_idx["passcode indices:\n[12, 4, 51, 33]"]
|
|
comb_pos["combined position key:\n[40967 35807 54041 52517 31281 56961 42242 11385 1018]"]
|
|
cust_pos["customer position key:\n[29587 60364 47856 53105 61491 65374 34021 4048 33167]"]
|
|
|
|
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, 4, 6, 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, 4, 6, 6, 3, 3, 7, 5, 0, 8]"]
|
|
pad1 --> posidx
|
|
space:1
|
|
user_pos["user position key:\n[24890 2120 45550 47291 61945 28551 49488 49734 20771]"]
|
|
xor1 --> user_pos
|
|
|
|
space:4
|
|
sel(("select positions"))
|
|
user_pos --> sel
|
|
posidx --> sel
|
|
space:5
|
|
passcode_pos["ordered user passcode positions:\n[47291 61945 49488 49488 47291 47291 49734 28551 24890 20771]"]
|
|
sel --> passcode_pos
|
|
mask_key["mask key\n[57731 56088 1801 26915 40765 22438 9693 31860 17942 7993]"]
|
|
space:4
|
|
xor2(("XOR"))
|
|
mask_key --> xor2
|
|
passcode_pos --> xor2
|
|
space:5
|
|
mask["enciphered mask:\n [22840 10977 50777 43123 10118 61213 59291 5107 10028 19994]"]
|
|
xor2 --> mask
|
|
```
|
|
|
|
### Validate nKode
|
|
|
|
```mermaid
|
|
block-beta
|
|
columns 3
|
|
selected_keys["selected keys:\n[1, 0, 5, 0]"]
|
|
login_keypad["login keypad:\nKey 0: [45 46 29 48 4 50 33 16 17]
|
|
Key 1: [18 1 20 12 49 5 15 34 44]
|
|
Key 2: [27 10 38 3 31 14 24 7 26]
|
|
Key 3: [ 0 37 11 39 22 23 42 52 8]
|
|
Key 4: [36 19 2 21 40 32 6 25 35]
|
|
Key 5: [ 9 28 47 30 13 41 51 43 53]
|
|
"]
|
|
space:4
|
|
|
|
selectkeys(("select keys"))
|
|
mask["enciphered mask:\n [22840 10977 50777 43123 10118 61213 59291 5107 10028 19994]"]
|
|
mask_key["mask key:\n[57731 56088 1801 26915 40765 22438 9693 31860 17942 7993]"]
|
|
space:2
|
|
|
|
xor1(("XOR"))
|
|
mask --> xor1
|
|
mask_key --> xor1
|
|
selected_keys --> selectkeys
|
|
login_keypad --> selectkeys
|
|
space:3
|
|
|
|
ordered_keys["ordered keys:\n[[18 1 20 12 49 5 15 34 44]
|
|
[45 46 29 48 4 50 33 16 17]
|
|
[ 9 28 47 30 13 41 51 43 53]
|
|
[45 46 29 48 4 50 33 16 17]]"]
|
|
user_position_key["user position key:\n[24890 2120 45550 47291 61945 28551 49488 49734 20771]"]
|
|
passcode_pos["ordered user passcode positions:\n[47291 61945 49488 49488 47291 47291 49734 28551 24890 20771]"]
|
|
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, 4, 6, 6, 3, 3, 7, 5, 0, 8]"]
|
|
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[12, 4, 51, 33]"]
|
|
prop["combined_property_key\n[32565 54767 5127 26787 61372 9024 10051 31192 36215 25953 63643 7907
|
|
34275 49131 65253 35224 52025 49525 36214 22719 57589 6411 46986 50058
|
|
38701 701 36150 6894 36770 58151 63226 62425 5898 2177 3529 29703
|
|
30896 41755 9016 47283 14611 18887 54104 55155 32367 2577 31449 39233
|
|
18953 7162 61412 6044 61623 4668]"]
|
|
cipheredhashed["hashed ciphered passcode:\n$2b$12$Jf48A5rmjkxb0II7CkuD8.Qg3GCuROgbS99pMbthC2gXt9szx9gmm"]
|
|
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[34275 61372 6044 2177]"]
|
|
sel --> passcode_prop
|
|
space:5
|
|
|
|
cipher(("encipher"))
|
|
passcode_prop --> cipher
|
|
space:5
|
|
|
|
cipheredpass["ciphered passcode:\n[11927 9591 6172 31396 4 52573 20838 48052 39138 14671]"]
|
|
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/>[18187 3794 26588 58875 7848 50844 33360 51199 136 43704 3944 38716
|
|
33380 13992 16583 62532 50613 13365 41266 44961 3965 61189 20756 13137
|
|
60280 23802 19769 57273 54480 60033 40969 36089 25253 25350 17781 61351
|
|
30937 56045 46356 10504 57212 53809 60613 29199 32036 29403 3546 12413
|
|
32533 5778 33348 37917 30979 12321]`"]
|
|
new_prop["`new customer property key:<br/>[12683 37623 46427 24232 53244 25444 34138 18278 52542 17394 45705 57706
|
|
22403 60684 20477 13672 47069 29025 8419 8211 36163 21756 45607 31517
|
|
44312 19522 17814 41879 18325 2622 43956 30841 59391 52171 51029 44917
|
|
28846 25756 24212 4239 11940 31284 58701 7692 31504 25629 20378 35504
|
|
45861 59860 4819 52686 62304 58952]`"]
|
|
old_pos["`old customer position key:<br/>[49469 33687 25335 30110 35784 45318 25682 60991 21209]`"]
|
|
new_pos["`new customer position key:<br/>[29587 60364 47856 53105 61491 65374 34021 4048 33167]`"]
|
|
xor1(("XOR"))
|
|
xor2(("XOR"))
|
|
xor_prop["`xor property key:<br/>[30336 39973 53895 47955 53588 42488 1802 32921 52662 59722 48609 30294
|
|
54759 56228 3898 49452 29288 17748 33233 36786 33342 48121 58163 18508
|
|
18016 4280 2223 31790 37701 57535 3005 62592 34138 43213 33312 16594
|
|
2167 48753 60288 14727 61912 43013 2440 27651 1588 5830 16960 47821
|
|
52272 65350 37015 22995 35427 54889]`"]
|
|
xor_pos["`xor position key:<br/>[45742 26715 55303 47855 31739 20056 57527 57839 54102]`"]
|
|
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/>[24890 2120 45550 47291 61945 28551 49488 49734 20771]`"]
|
|
old_user_prop["`property key:<br/>[14398 56125 29659 36184 61716 58844 42259 48679 36351 53209 63475 35295
|
|
1927 35139 48674 32220 3724 62784 11332 63262 61320 62990 59038 61659
|
|
31829 24135 49167 50519 23410 2470 22259 32544 30127 27527 18620 39840
|
|
105 31222 38444 37307 58991 39926 16285 42364 843 30922 30467 43324
|
|
13596 3432 28064 33665 35252 8733]`"]
|
|
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/>[ 4777 58244 2846 30666 458 37081 17845 52630 53420]`"]
|
|
inter_user_prop["`property key:<br/>[20158 18200 41308 13835 8256 16420 41497 16062 16457 9875 18962 65417
|
|
53856 21223 45336 48368 31972 45076 44437 30892 28086 19959 1453 47255
|
|
14901 20223 51360 47481 51255 59673 23886 35744 61685 49994 51868 56178
|
|
2078 51079 32172 43068 6071 13299 13845 51583 1407 28172 13635 5105
|
|
63788 61998 64823 55890 983 62580]`"]
|
|
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/>[37567 32382 36425 6535 11819 18071 35301 38878 29144]`"]
|
|
new_user_prop["`property key:<br/>[63204 21530 24393 63295 52024 46102 24361 23381 41968 3713 26133 17989
|
|
14193 46059 12280 45683 35436 9340 17577 37219 15797 39388 52148 29719
|
|
48300 18038 25938 62757 21612 28454 23892 12945 18057 62761 37107 25062
|
|
27001 30212 20943 35287 60202 25046 29690 64376 57055 1554 42998 36674
|
|
45138 58609 25837 59944 8395 52185]`"]
|
|
new_renew["renew: False"]
|
|
end
|
|
login --> new_user
|
|
end
|
|
|
|
``` |