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: [54514 1965 53378 19192 22047 51452 10113 45652 29057 9429 21502 46988
|
|
49588 18367 49270 58262 42600 57355 6832 60785 43122 21094 14401 36145
|
|
20935 57304 48338 48291 26673 19914 28977 28652 19987 31121 12774 35536
|
|
48255 12852 54678 55834 85 26003 45160 20835 54874 52921 15169 50516
|
|
60357 42125 30022 45817 60130 11197]
|
|
- position key: [48112 26772 62306 37312 9280 53287 8575 52285 23223]
|
|
|
|
|
|
---
|
|
|
|
## User Cipher
|
|
- property key: [25402 45448 18385 37857 57541 32953 19697 45767 30288 57822 46599 257
|
|
21882 41216 65271 33191 57236 24801 10848 60418 40003 30516 42964 54926
|
|
4678 57740 23458 22941 19199 13444 34602 28269 28151 31470 11589 62172
|
|
53096 14757 9376 55563 54085 33633 7682 13084 27027 41237 11751 3039
|
|
37222 20544 22215 44963 6713 65186]
|
|
- passcode key: [28538 33084 55942 23635 1822 36202 45572 34373 48530 20714]
|
|
- combined position key: [57013 27802 42252 20840 26015 37308 27613 15454 15422]
|
|
- mask key: [29393 54843 61220 63539 63750 28279 20755 38066 32824 58482]
|
|
|
|
### Combined Postion Key
|
|
```mermaid
|
|
block-beta
|
|
columns 2
|
|
user_pos["user position key:\n[16087 54566 2672 43037 1335 65132 16145 49723 39280]"]
|
|
customer_pos["customer position key:\n[48112 26772 62306 37312 9280 53287 8575 52285 23223]"]
|
|
space:2
|
|
xor(("XOR")):2
|
|
user_pos --> xor
|
|
customer_pos --> xor
|
|
space:2
|
|
comb_pos["combined position key\n[57013 27802 42252 20840 26015 37308 27613 15454 15422]"]:2
|
|
xor --> comb_pos
|
|
```
|
|
|
|
## User Keypad
|
|
- keypad example:<br/>Key 0: [27 1 2 48 31 41 24 7 17]<br/>Key 1: [45 10 11 39 4 50 42 25 53]<br/>Key 2: [ 9 19 29 3 40 32 51 16 8]<br/>Key 3: [18 37 38 21 22 14 33 43 44]<br/>Key 4: [ 0 28 47 30 49 5 15 34 26]<br/>Key 5: [36 46 20 12 13 23 6 52 35]<br/>
|
|
- user passcode indices: [28, 24, 34, 1]
|
|
|
|
## nKode Cipher
|
|
|
|
### Passcode Hash
|
|
```mermaid
|
|
block-beta
|
|
columns 2
|
|
cprop["customer_property_key\n[54514 1965 53378 19192 22047 51452 10113 45652 29057 9429 21502 46988
|
|
49588 18367 49270 58262 42600 57355 6832 60785 43122 21094 14401 36145
|
|
20935 57304 48338 48291 26673 19914 28977 28652 19987 31121 12774 35536
|
|
48255 12852 54678 55834 85 26003 45160 20835 54874 52921 15169 50516
|
|
60357 42125 30022 45817 60130 11197]"]
|
|
uprop["user_property_key\n[25402 45448 18385 37857 57541 32953 19697 45767 30288 57822 46599 257
|
|
21882 41216 65271 33191 57236 24801 10848 60418 40003 30516 42964 54926
|
|
4678 57740 23458 22941 19199 13444 34602 28269 28151 31470 11589 62172
|
|
53096 14757 9376 55563 54085 33633 7682 13084 27027 41237 11751 3039
|
|
37222 20544 22215 44963 6713 65186]"]
|
|
space:2
|
|
xor1(("XOR")):2
|
|
cprop --> xor1
|
|
uprop --> xor1
|
|
space:2
|
|
prop["combined_property_key\n[22860 48501 43623 2691 11008 34410 41991 51506 29272 24365 54234 54358
|
|
3371 32869 56118 23725 27650 38652 25509 24668 2625 31115 7846 1530
|
|
28577 8896 10269 5837 40269 59501 63202 34622 24010 60186 38638 52779
|
|
27566 57898 58845 6587 13015 10925 7087 34598 49492 27689 9569 8776
|
|
60168 63531 64702 53160 62709 51058]"]
|
|
xor1 --> prop
|
|
pass["user_passcode_indices\n[28, 24, 34, 1]"]
|
|
space:2
|
|
sel(("select\nproperties")):2
|
|
pass --> sel
|
|
prop --> sel
|
|
space:2
|
|
passcode["user passcode properties:\n[40269 28577 38638 48501]"]:2
|
|
sel --> passcode
|
|
space:2
|
|
pad["zero pad to\nmax nkode length: 10"]:2
|
|
passcode -->pad
|
|
space:2
|
|
paddedpasscode["padded passcode:\n[40269 28577 38638 48501 0 0 0 0 0 0]"]
|
|
pad --> paddedpasscode
|
|
passkey["passcode key:\n[28538 33084 55942 23635 1822 36202 45572 34373 48530 20714]"]
|
|
space:2
|
|
xor2(("XOR")):2
|
|
passkey --> xor2
|
|
paddedpasscode --> xor2
|
|
space:2
|
|
cipheredpass["ciphered passcode:\n[62007 61085 19560 57638 1822 36202 45572 34373 48530 20714]"]:2
|
|
xor2 --> cipheredpass
|
|
space:2
|
|
hash(("hash")):2
|
|
cipheredpass --> hash
|
|
space:2
|
|
cipheredhashed["hashed ciphered passcode:\n$2b$12$YW2vbeWXlAc3TdUGX9l8gOghIZ3ZQSMF8ia2K0Bj5dzmtUlx3hWqS"]:2
|
|
hash --> cipheredhashed
|
|
```
|
|
|
|
### Mask Encipher
|
|
```mermaid
|
|
block-beta
|
|
columns 3
|
|
passcode_idx["passcode indices:\n[28, 24, 34, 1]"]
|
|
comb_pos["combined position key:\n[57013 27802 42252 20840 26015 37308 27613 15454 15422]"]
|
|
cust_pos["customer position key:\n[48112 26772 62306 37312 9280 53287 8575 52285 23223]"]
|
|
|
|
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, 6, 7, 1]"]
|
|
propidx --> passcode_position_idx
|
|
|
|
space:5
|
|
pad1(("Pad with\nrandom indices"))
|
|
passcode_position_idx --> pad1
|
|
|
|
space:5
|
|
posidx["Padded Passcode Position Indices:\n[1, 6, 7, 1, 5, 0, 8, 6, 2, 0]"]
|
|
pad1 --> posidx
|
|
space:1
|
|
user_pos["user position key:\n[16087 54566 2672 43037 1335 65132 16145 49723 39280]"]
|
|
xor1 --> user_pos
|
|
|
|
space:4
|
|
sel(("select positions"))
|
|
user_pos --> sel
|
|
posidx --> sel
|
|
space:5
|
|
passcode_pos["ordered user passcode positions:\n[54566 16145 49723 54566 65132 16087 39280 16145 2672 16087]"]
|
|
sel --> passcode_pos
|
|
mask_key["mask key\n[29393 54843 61220 63539 63750 28279 20755 38066 32824 58482]"]
|
|
space:4
|
|
xor2(("XOR"))
|
|
mask_key --> xor2
|
|
passcode_pos --> xor2
|
|
space:5
|
|
mask["enciphered mask:\n [42999 59690 11551 11541 1898 20640 51299 43939 35400 55973]"]
|
|
xor2 --> mask
|
|
```
|
|
|
|
### Validate nKode
|
|
|
|
```mermaid
|
|
block-beta
|
|
columns 3
|
|
pass["user_passcode_indices\n[28, 24, 34, 1]"]
|
|
login_keypad["login keypad:\nKey 0: [27 1 2 48 31 41 24 7 17]
|
|
Key 1: [45 10 11 39 4 50 42 25 53]
|
|
Key 2: [ 9 19 29 3 40 32 51 16 8]
|
|
Key 3: [18 37 38 21 22 14 33 43 44]
|
|
Key 4: [ 0 28 47 30 49 5 15 34 26]
|
|
Key 5: [36 46 20 12 13 23 6 52 35]
|
|
"]
|
|
space:4
|
|
|
|
selectkeys(("select keys"))
|
|
mask["enciphered mask:\n [42999 59690 11551 11541 1898 20640 51299 43939 35400 55973]"]
|
|
mask_key["mask key:\n[29393 54843 61220 63539 63750 28279 20755 38066 32824 58482]"]
|
|
space:2
|
|
|
|
xor1(("XOR"))
|
|
mask --> xor1
|
|
mask_key --> xor1
|
|
pass --> selectkeys
|
|
login_keypad --> selectkeys
|
|
space:3
|
|
|
|
ordered_keys["ordered keys:\n[[ 0 28 47 30 49 5 15 34 26]
|
|
[27 1 2 48 31 41 24 7 17]
|
|
[ 0 28 47 30 49 5 15 34 26]
|
|
[27 1 2 48 31 41 24 7 17]]"]
|
|
user_position_key["user position key:\n[16087 54566 2672 43037 1335 65132 16145 49723 39280]"]
|
|
passcode_pos["ordered user passcode positions:\n[54566 16145 49723 54566 65132 16087 39280 16145 2672 16087]"]
|
|
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, 6, 7, 1, 5, 0, 8, 6, 2, 0]"]
|
|
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[28, 24, 34, 1]"]
|
|
prop["combined_property_key\n[22860 48501 43623 2691 11008 34410 41991 51506 29272 24365 54234 54358
|
|
3371 32869 56118 23725 27650 38652 25509 24668 2625 31115 7846 1530
|
|
28577 8896 10269 5837 40269 59501 63202 34622 24010 60186 38638 52779
|
|
27566 57898 58845 6587 13015 10925 7087 34598 49492 27689 9569 8776
|
|
60168 63531 64702 53160 62709 51058]"]
|
|
cipheredhashed["hashed ciphered passcode:\n$2b$12$YW2vbeWXlAc3TdUGX9l8gOghIZ3ZQSMF8ia2K0Bj5dzmtUlx3hWqS"]
|
|
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[40269 28577 38638 48501]"]
|
|
sel --> passcode_prop
|
|
space:5
|
|
|
|
cipher(("encipher"))
|
|
passcode_prop --> cipher
|
|
space:5
|
|
|
|
cipheredpass["ciphered passcode:\n[62007 61085 19560 57638 1822 36202 45572 34373 48530 20714]"]
|
|
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/>[14966 3325 60854 39266 52165 1747 59638 31733 1032 48883 26077 54615
|
|
22609 8549 9665 56586 45974 63005 18885 35934 38402 3775 47474 54132
|
|
32231 49996 29631 20304 55218 56553 29128 59731 12349 37364 48043 15607
|
|
42182 56207 49533 49328 57746 43468 1453 46138 43207 52540 2182 10647
|
|
31342 43115 43641 24587 61132 14800]`"]
|
|
new_prop["`new customer property key:<br/>[54514 1965 53378 19192 22047 51452 10113 45652 29057 9429 21502 46988
|
|
49588 18367 49270 58262 42600 57355 6832 60785 43122 21094 14401 36145
|
|
20935 57304 48338 48291 26673 19914 28977 28652 19987 31121 12774 35536
|
|
48255 12852 54678 55834 85 26003 45160 20835 54874 52921 15169 50516
|
|
60357 42125 30022 45817 60130 11197]`"]
|
|
old_pos["`old customer position key:<br/>[57442 47548 44924 63861 24744 28624 21708 65125 42318]`"]
|
|
new_pos["`new customer position key:<br/>[48112 26772 62306 37312 9280 53287 8575 52285 23223]`"]
|
|
xor1(("XOR"))
|
|
xor2(("XOR"))
|
|
xor_prop["`xor property key:<br/>[61060 2896 15668 54170 40410 52783 53111 51617 30089 39462 13859 25307
|
|
39397 26330 58807 16028 5630 5654 21365 24879 15984 23769 33075 24133
|
|
11296 7316 53101 62451 49027 37155 249 34495 32302 59493 35405 46631
|
|
6329 59835 5355 6826 57799 52319 46533 58713 32413 901 13255 60611
|
|
37291 3302 57151 54002 1070 4717]`"]
|
|
xor_pos["`xor position key:<br/>[23442 53544 23582 26805 17640 49143 30131 12888 65529]`"]
|
|
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/>[16087 54566 2672 43037 1335 65132 16145 49723 39280]`"]
|
|
old_user_prop["`property key:<br/>[25402 45448 18385 37857 57541 32953 19697 45767 30288 57822 46599 257
|
|
21882 41216 65271 33191 57236 24801 10848 60418 40003 30516 42964 54926
|
|
4678 57740 23458 22941 19199 13444 34602 28269 28151 31470 11589 62172
|
|
53096 14757 9376 55563 54085 33633 7682 13084 27027 41237 11751 3039
|
|
37222 20544 22215 44963 6713 65186]`"]
|
|
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/>[34087 48562 63762 14813 8567 11851 7790 3590 50119]`"]
|
|
inter_user_prop["`property key:<br/>[36286 47832 31461 16507 32031 20118 33670 31590 985 31736 32804 25562
|
|
52383 51162 6976 48955 51818 30455 30997 36141 41523 11245 9959 35019
|
|
15974 64792 38095 43630 62844 42407 34771 59602 5081 37515 42760 17659
|
|
55249 53278 12363 50081 12930 20286 43975 54853 5902 41616 7712 59164
|
|
205 23718 35320 32081 7703 60623]`"]
|
|
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/>[30180 41733 51338 65033 46822 22413 14740 11265 36086]`"]
|
|
new_user_prop["`property key:<br/>[63029 58440 35697 22366 54518 106 30872 42634 43391 56303 8441 57457
|
|
40463 15976 60517 30636 40657 60903 39392 12539 19960 16602 3225 8105
|
|
30680 64909 9750 19292 15934 38070 9733 36553 61894 2864 25710 48492
|
|
54051 23592 44246 3991 38055 9064 51185 33976 39567 54282 59604 15986
|
|
12137 21928 16931 38440 25594 42613]`"]
|
|
new_renew["renew: False"]
|
|
end
|
|
login --> new_user
|
|
end
|
|
|
|
``` |