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: [17433 57572 21505 8444 45652 40584 48852 43446 5599 62405 28323 40256
|
|
47776 49892 26386 48063 8519 55431 26581 11344 39650 4798 19208 64337
|
|
33689 12686 45679 3132 40090 40966 37000 33485 30170 45501 20844 20464
|
|
53748 19697 19768 4387 39395 35315 9619 28777 48707 30931 62584 35610
|
|
46036 40873 63440 33641 852 11131]
|
|
- position key: [38077 51455 31958 23938 20630 60053 9765 10657 7626]
|
|
|
|
|
|
---
|
|
|
|
## User Cipher
|
|
- property key: [24983 41762 20840 27438 7273 19213 38577 61466 23138 47314 23998 50092
|
|
273 14037 34702 41428 64080 27332 13490 12880 55541 24199 778 9414
|
|
29001 19211 3074 60661 6134 25585 30166 41331 20480 63833 34395 54478
|
|
26155 58076 18811 43725 18545 28882 15969 25829 22807 22588 35663 41312
|
|
34398 20904 148 47345 50354 38166]
|
|
- passcode key: [29182 58569 45520 52787 7372 34618 40716 38549 23700 43116]
|
|
- combined position key: [55717 12248 3398 52977 52974 12019 47318 59100 12380]
|
|
- mask key: [51996 30221 59877 58879 34382 22287 31520 64981 60412 37143]
|
|
|
|
### Combined Postion Key
|
|
```mermaid
|
|
block-beta
|
|
columns 2
|
|
user_pos["user position key:\n[41859 3923 32291 54686 34461 59585 18017 7286 34891]"]
|
|
customer_pos["customer position key:\n[38077 51455 31958 23938 20630 60053 9765 10657 7626]"]
|
|
space:2
|
|
xor(("XOR")):2
|
|
user_pos --> xor
|
|
customer_pos --> xor
|
|
space:2
|
|
comb_pos["combined position key\n[55717 12248 3398 52977 52974 12019 47318 59100 12380]"]:2
|
|
xor --> comb_pos
|
|
```
|
|
|
|
## User Keypad
|
|
- keypad example:<br/>Key 0: [36 28 38 21 4 41 15 43 26]<br/>Key 1: [ 0 19 47 12 49 14 33 16 17]<br/>Key 2: [ 9 37 2 39 40 50 51 52 44]<br/>Key 3: [27 46 29 30 31 5 24 25 35]<br/>Key 4: [18 10 20 48 22 23 42 34 53]<br/>Key 5: [45 1 11 3 13 32 6 7 8]<br/>
|
|
- user passcode indices: [1, 32, 34, 5]
|
|
|
|
## nKode Cipher
|
|
|
|
### Passcode Hash
|
|
```mermaid
|
|
block-beta
|
|
columns 2
|
|
cprop["customer_property_key\n[17433 57572 21505 8444 45652 40584 48852 43446 5599 62405 28323 40256
|
|
47776 49892 26386 48063 8519 55431 26581 11344 39650 4798 19208 64337
|
|
33689 12686 45679 3132 40090 40966 37000 33485 30170 45501 20844 20464
|
|
53748 19697 19768 4387 39395 35315 9619 28777 48707 30931 62584 35610
|
|
46036 40873 63440 33641 852 11131]"]
|
|
uprop["user_property_key\n[24983 41762 20840 27438 7273 19213 38577 61466 23138 47314 23998 50092
|
|
273 14037 34702 41428 64080 27332 13490 12880 55541 24199 778 9414
|
|
29001 19211 3074 60661 6134 25585 30166 41331 20480 63833 34395 54478
|
|
26155 58076 18811 43725 18545 28882 15969 25829 22807 22588 35663 41312
|
|
34398 20904 148 47345 50354 38166]"]
|
|
space:2
|
|
xor1(("XOR")):2
|
|
cprop --> xor1
|
|
uprop --> xor1
|
|
space:2
|
|
prop["combined_property_key\n[ 9552 31208 37587 40095 45072 12350 32006 2925 11611 34589 36849 42561
|
|
26580 61891 26520 39789 65017 7624 63974 8702 9646 62493 54967 42708
|
|
52347 11714 29071 28123 11157 34826 4115 53992 58115 20982 19018 55103
|
|
48003 8472 18407 52180 52783 23938 12226 59018 22734 31178 30431 34796
|
|
35730 22961 11250 19920 45688 49980]"]
|
|
xor1 --> prop
|
|
pass["user_passcode_indices\n[1, 32, 34, 5]"]
|
|
space:2
|
|
sel(("select\nproperties")):2
|
|
pass --> sel
|
|
prop --> sel
|
|
space:2
|
|
passcode["user passcode properties:\n[31208 58115 19018 12350]"]:2
|
|
sel --> passcode
|
|
space:2
|
|
pad["zero pad to\nmax nkode length: 10"]:2
|
|
passcode -->pad
|
|
space:2
|
|
paddedpasscode["padded passcode:\n[31208 58115 19018 12350 0 0 0 0 0 0]"]
|
|
pad --> paddedpasscode
|
|
passkey["passcode key:\n[29182 58569 45520 52787 7372 34618 40716 38549 23700 43116]"]
|
|
space:2
|
|
xor2(("XOR")):2
|
|
passkey --> xor2
|
|
paddedpasscode --> xor2
|
|
space:2
|
|
cipheredpass["ciphered passcode:\n[ 2070 1994 64410 65037 7372 34618 40716 38549 23700 43116]"]:2
|
|
xor2 --> cipheredpass
|
|
space:2
|
|
hash(("hash")):2
|
|
cipheredpass --> hash
|
|
space:2
|
|
cipheredhashed["hashed ciphered passcode:\n$2b$12$mSfxfqokaUYYc8CHnj1nV.3fz.FUkMo4dNreWfUUO4zdgN0LQQ2Tm"]:2
|
|
hash --> cipheredhashed
|
|
```
|
|
|
|
### Mask Encipher
|
|
```mermaid
|
|
block-beta
|
|
columns 3
|
|
passcode_idx["passcode indices:\n[1, 32, 34, 5]"]
|
|
comb_pos["combined position key:\n[55717 12248 3398 52977 52974 12019 47318 59100 12380]"]
|
|
cust_pos["customer position key:\n[38077 51455 31958 23938 20630 60053 9765 10657 7626]"]
|
|
|
|
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[1, 5, 7, 5]"]
|
|
propidx --> passcode_position_idx
|
|
|
|
space:5
|
|
pad1(("Pad with\nrandom indices"))
|
|
passcode_position_idx --> pad1
|
|
|
|
space:5
|
|
posidx["Padded Passcode Position Indices:\n[1, 5, 7, 5, 7, 2, 8, 1, 7, 1]"]
|
|
pad1 --> posidx
|
|
space:1
|
|
user_pos["user position key:\n[41859 3923 32291 54686 34461 59585 18017 7286 34891]"]
|
|
xor1 --> user_pos
|
|
|
|
space:4
|
|
sel(("select positions"))
|
|
user_pos --> sel
|
|
posidx --> sel
|
|
space:5
|
|
passcode_pos["ordered user passcode positions:\n[ 3923 59585 7286 59585 7286 32291 34891 3923 7286 3923]"]
|
|
sel --> passcode_pos
|
|
mask_key["mask key\n[51996 30221 59877 58879 34382 22287 31520 64981 60412 37143]"]
|
|
space:4
|
|
xor2(("XOR"))
|
|
mask_key --> xor2
|
|
passcode_pos --> xor2
|
|
space:5
|
|
mask["enciphered mask:\n [50255 40652 62867 3390 39480 10540 62315 62086 63370 40516]"]
|
|
xor2 --> mask
|
|
```
|
|
|
|
### Validate nKode
|
|
|
|
```mermaid
|
|
block-beta
|
|
columns 3
|
|
pass["user_passcode_indices\n[1, 32, 34, 5]"]
|
|
login_keypad["login keypad:\nKey 0: [36 28 38 21 4 41 15 43 26]
|
|
Key 1: [ 0 19 47 12 49 14 33 16 17]
|
|
Key 2: [ 9 37 2 39 40 50 51 52 44]
|
|
Key 3: [27 46 29 30 31 5 24 25 35]
|
|
Key 4: [18 10 20 48 22 23 42 34 53]
|
|
Key 5: [45 1 11 3 13 32 6 7 8]
|
|
"]
|
|
space:4
|
|
|
|
selectkeys(("user"))
|
|
mask["enciphered mask:\n [50255 40652 62867 3390 39480 10540 62315 62086 63370 40516]"]
|
|
mask_key["mask key:\n[51996 30221 59877 58879 34382 22287 31520 64981 60412 37143]"]
|
|
space:2
|
|
|
|
xor1(("XOR"))
|
|
mask --> xor1
|
|
mask_key --> xor1
|
|
pass --> selectkeys
|
|
login_keypad --> selectkeys
|
|
space:3
|
|
|
|
ordered_keys["ordered keys:\n[[45 1 11 3 13 32 6 7 8]
|
|
[45 1 11 3 13 32 6 7 8]
|
|
[18 10 20 48 22 23 42 34 53]
|
|
[27 46 29 30 31 5 24 25 35]]"]
|
|
user_position_key["user position key:\n[41859 3923 32291 54686 34461 59585 18017 7286 34891]"]
|
|
passcode_pos["ordered user passcode positions:\n[ 3923 59585 7286 59585 7286 32291 34891 3923 7286 3923]"]
|
|
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[1, 5, 7, 5, 7, 2, 8, 1, 7, 1]"]
|
|
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[1, 32, 34, 5]"]
|
|
prop["combined_property_key\n[ 9552 31208 37587 40095 45072 12350 32006 2925 11611 34589 36849 42561
|
|
26580 61891 26520 39789 65017 7624 63974 8702 9646 62493 54967 42708
|
|
52347 11714 29071 28123 11157 34826 4115 53992 58115 20982 19018 55103
|
|
48003 8472 18407 52180 52783 23938 12226 59018 22734 31178 30431 34796
|
|
35730 22961 11250 19920 45688 49980]"]
|
|
cipheredhashed["hashed ciphered passcode:\n$2b$12$mSfxfqokaUYYc8CHnj1nV.3fz.FUkMo4dNreWfUUO4zdgN0LQQ2Tm"]
|
|
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[31208 58115 19018 12350]"]
|
|
sel --> passcode_prop
|
|
space:5
|
|
|
|
cipher(("encipher"))
|
|
passcode_prop --> cipher
|
|
space:5
|
|
|
|
cipheredpass["ciphered passcode:\n[ 2070 1994 64410 65037 7372 34618 40716 38549 23700 43116]"]
|
|
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/>[17607 56010 50107 63409 44153 31539 60343 64375 30521 16335 53839 26093
|
|
26309 50966 57366 15033 1961 30476 52564 5038 64859 43674 54717 33298
|
|
48434 26313 32141 33070 15459 60411 26053 29595 45827 43183 52241 1009
|
|
56744 50116 3740 24857 34398 11600 4515 33391 473 8694 64912 9868
|
|
3532 2073 11110 62753 30410 22058]`"]
|
|
new_prop["`new customer property key:<br/>[17433 57572 21505 8444 45652 40584 48852 43446 5599 62405 28323 40256
|
|
47776 49892 26386 48063 8519 55431 26581 11344 39650 4798 19208 64337
|
|
33689 12686 45679 3132 40090 40966 37000 33485 30170 45501 20844 20464
|
|
53748 19697 19768 4387 39395 35315 9619 28777 48707 30931 62584 35610
|
|
46036 40873 63440 33641 852 11131]`"]
|
|
old_pos["`old customer position key:<br/>[31270 8331 29541 7023 18547 50738 65207 64170 47127]`"]
|
|
new_pos["`new customer position key:<br/>[38077 51455 31958 23938 20630 60053 9765 10657 7626]`"]
|
|
xor1(("XOR"))
|
|
xor2(("XOR"))
|
|
xor_prop["`xor property key:<br/>[ 222 14894 38842 55117 7725 58811 21859 21185 25318 52234 48364 63661
|
|
56421 1522 34564 33030 9966 44939 43649 16382 26553 47140 40629 31043
|
|
16043 22343 53218 36114 41209 19453 62797 61782 50905 6418 40317 19457
|
|
3164 36661 17316 28730 8125 42147 13360 61958 49050 22821 2536 44438
|
|
48664 38832 56502 30280 30110 32081]`"]
|
|
xor_pos["`xor position key:<br/>[61083 59508 4019 18157 6373 11431 55442 54027 42461]`"]
|
|
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/>[41859 3923 32291 54686 34461 59585 18017 7286 34891]`"]
|
|
old_user_prop["`property key:<br/>[24983 41762 20840 27438 7273 19213 38577 61466 23138 47314 23998 50092
|
|
273 14037 34702 41428 64080 27332 13490 12880 55541 24199 778 9414
|
|
29001 19211 3074 60661 6134 25585 30166 41331 20480 63833 34395 54478
|
|
26155 58076 18811 43725 18545 28882 15969 25829 22807 22588 35663 41312
|
|
34398 20904 148 47345 50354 38166]`"]
|
|
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/>[14142 51116 757 34844 54795 596 24644 13783 38273]`"]
|
|
inter_user_prop["`property key:<br/>[24905 39180 50898 48227 580 44726 50130 41691 14468 29912 57682 15105
|
|
56692 13095 138 8402 56510 50511 40499 3502 48972 59043 40383 23941
|
|
20450 7244 50144 25063 46863 10252 32923 20517 38617 57419 6950 39119
|
|
27255 28137 2783 56055 22476 54385 2641 38627 59021 281 33447 3318
|
|
14406 50712 56354 52921 45356 59463]`"]
|
|
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/>[23942 46252 53843 37910 7611 30257 63826 52812 27525]`"]
|
|
new_user_prop["`property key:<br/>[12027 59464 45926 15881 63336 21673 37395 23025 6329 62833 48208 18116
|
|
21253 58416 65368 58683 20373 46352 59037 5050 28807 6687 11647 25865
|
|
62465 1781 2953 15931 16596 36975 19053 5585 53652 10011 18034 31490
|
|
25501 8993 19946 5980 35552 33588 63303 2644 62898 12532 3981 16334
|
|
9471 17209 53533 43576 41327 37349]`"]
|
|
new_renew["renew: False"]
|
|
end
|
|
login --> new_user
|
|
end
|
|
|
|
``` |