Files
pynkode/docs/encipher_decipher_nkode.md
2025-03-26 04:14:13 -05:00

244 lines
8.2 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: [42782 22411 58796 11465 49503 56275 38775 38081 7026 16254 14654 36893
55835 42117 397 53181 30070 49716 9591 26367 43862 44491 15032 6140
27166 25935 32851 1343 59160 16484 19970 19858 51729 7378 38465 28158
54598 17069 55468 61288 4228 11257 1486 8676 38279 55278 49181 18796
24775 6931 20611 57138 59596 36232]
- position key: [12647 30491 17139 56844 38964 47773 48376 30998 47349]
---
## User Cipher
- property key: [33847 39397 2529 4886 18590 30214 36385 48387 45829 57638 20358 47401
15283 40354 57184 4978 23666 27711 53811 25217 41251 28914 39980 49243
50901 59505 64895 1640 29549 35643 5917 44770 1327 40377 63154 42643
27727 34100 38270 40653 59421 61433 33944 52893 5800 59979 60549 28886
65479 26388 12482 30070 62886 928]
- passcode key: [39941 46272 6788 28608 6629 37858 57195 10700 63193 44873]
- combined position key: [17324 5420 26420 62365 37521 21226 5241 59891 59082]
- mask key: [59295 36535 38305 40214 13117 40275 7336 42576 57021 2814]
### Combined Postion Key
```mermaid
block-beta
columns 2
user_pos["user position key:\n[29387 25143 9671 11665 2725 59511 43137 37093 24127]"]
customer_pos["customer position key:\n[12647 30491 17139 56844 38964 47773 48376 30998 47349]"]
space:2
xor(("XOR")):2
user_pos --> xor
customer_pos --> xor
space:2
comb_pos["combined position key\n[17324 5420 26420 62365 37521 21226 5241 59891 59082]"]:2
xor --> comb_pos
```
## User Keypad
- keypad:
- user passcode indices: [8, 47, 15, 26]
## nKode Cipher
### Passcode Hash
```mermaid
block-beta
columns 2
cprop["customer_property_key\n[42782 22411 58796 11465 49503 56275 38775 38081 7026 16254 14654 36893
55835 42117 397 53181 30070 49716 9591 26367 43862 44491 15032 6140
27166 25935 32851 1343 59160 16484 19970 19858 51729 7378 38465 28158
54598 17069 55468 61288 4228 11257 1486 8676 38279 55278 49181 18796
24775 6931 20611 57138 59596 36232]"]
uprop["user_property_key\n[33847 39397 2529 4886 18590 30214 36385 48387 45829 57638 20358 47401
15283 40354 57184 4978 23666 27711 53811 25217 41251 28914 39980 49243
50901 59505 64895 1640 29549 35643 5917 44770 1327 40377 63154 42643
27727 34100 38270 40653 59421 61433 33944 52893 5800 59979 60549 28886
65479 26388 12482 30070 62886 928]"]
space:2
xor1(("XOR")):2
cprop --> xor1
uprop --> xor1
space:2
prop["combined_property_key\n[ 9001 52846 60493 16351 35265 44501 6486 10690 43127 56920 30392 10548
57768 14631 57069 56527 10500 44555 63300 1150 2677 56633 42644 55207
44235 36158 32044 855 38005 52063 22815 58224 53054 33131 24819 52077
47369 51097 19922 29093 63641 50176 33110 61305 33583 15781 11416 14778
40704 31751 24641 43588 7530 36392]"]
xor1 --> prop
pass["user_passcode_indices\n[8, 47, 15, 26]"]
space:2
sel(("select\nproperties")):2
pass --> sel
prop --> sel
space:2
passcode["user passcode properties:\n[43127 14778 56527 32044]"]:2
sel --> passcode
space:2
pad["zero pad to\nmax nkode length: 10"]:2
passcode -->pad
space:2
paddedpasscode["padded passcode:\n[43127 14778 56527 32044 0 0 0 0 0 0]"]
pad --> paddedpasscode
passkey["passcode key:\n[39941 46272 6788 28608 6629 37858 57195 10700 63193 44873]"]
space:2
xor2(("XOR")):2
passkey --> xor2
paddedpasscode --> xor2
space:2
cipheredpass["ciphered passcode:\n[13426 36218 50763 4844 6629 37858 57195 10700 63193 44873]"]:2
xor2 --> cipheredpass
space:2
hash(("hash")):2
cipheredpass --> hash
space:2
cipheredhashed["hashed ciphered passcode:\n$2b$12$n5xAQRuWhK3MiLsQHYiRu.p2Mam48sH7W/L7BojTBkyoQuUGa6/sO"]:2
hash --> cipheredhashed
```
### Mask Encipher
```mermaid
block-beta
columns 3
passcode_idx["passcode indices:\n[8, 47, 15, 26]"]
comb_pos["combined position key:\n[17324 5420 26420 62365 37521 21226 5241 59891 59082]"]
cust_pos["customer position key:\n[12647 30491 17139 56844 38964 47773 48376 30998 47349]"]
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[8, 2, 6, 8]"]
propidx --> passcode_position_idx
space:5
pad1(("Pad with\nrandom indices"))
passcode_position_idx --> pad1
space:5
posidx["Padded Passcode Position Indices:\n[8, 2, 6, 8, 8, 3, 8, 6, 3, 7]"]
pad1 --> posidx
space:1
user_pos["user position key:\n[29387 25143 9671 11665 2725 59511 43137 37093 24127]"]
xor1 --> user_pos
space:4
sel(("select positions"))
user_pos --> sel
posidx --> sel
space:5
passcode_pos["ordered user passcode positions:\n[24127 9671 43137 24127 24127 11665 24127 43137 11665 37093]"]
sel --> passcode_pos
mask_key["mask key\n[59295 36535 38305 40214 13117 40275 7336 42576 57021 2814]"]
space:4
xor2(("XOR"))
mask_key --> xor2
passcode_pos --> xor2
space:5
mask["enciphered mask:\n [47520 43888 15648 49961 27906 45250 17047 3793 62252 39451]"]
xor2 --> mask
```
### Validate nKode
```mermaid
block-beta
columns 4
selected_keys["selected keys:\n[3, 2, 2, 0]"]
login_keypad["login keypad:\nKey 0: [ 9 19 38 39 31 5 24 25 26]
Key 1: [18 1 20 12 13 50 6 34 53]
Key 2: [36 37 47 21 40 41 15 43 17]
Key 3: [ 0 10 2 3 4 23 42 7 8]
Key 4: [45 46 11 30 22 32 51 16 35]
Key 5: [27 28 29 48 49 14 33 52 44]
"]
mask["enciphered mask:\n [47520 43888 15648 49961 27906 45250 17047 3793 62252 39451]"]
mask_key["mask key:\n[59295 36535 38305 40214 13117 40275 7336 42576 57021 2814]"]
space:4
selectkeys(("select keys"))
space:2
xor1(("XOR"))
mask --> xor1
mask_key --> xor1
selected_keys --> selectkeys
login_keypad --> selectkeys
space:4
ordered_keys["ordered keys:\n[[ 0 10 2 3 4 23 42 7 8]
[36 37 47 21 40 41 15 43 17]
[36 37 47 21 40 41 15 43 17]
[ 9 19 38 39 31 5 24 25 26]]"]
space:1
user_position_key["user position key:\n[29387 25143 9671 11665 2725 59511 43137 37093 24127]"]
passcode_pos["ordered user passcode positions:\n[24127 9671 43137 24127 24127 11665 24127 43137 11665 37093]"]
selectkeys --> ordered_keys
xor1 --> passcode_pos
space:7
get_passcode_idxs(("recover passcode\nposition indices"))
user_position_key --> get_passcode_idxs
passcode_pos --> get_passcode_idxs
space:7
passcode_pos_idxs["padded passcode position indices:\n[8, 2, 6, 8, 8, 3, 8, 6, 3, 7]"]
get_passcode_idxs --> passcode_pos_idxs
space:4
get_presumed_idxs(("recover passcode\nproperty indices"))
ordered_keys --> get_presumed_idxs
passcode_pos_idxs --> get_presumed_idxs
space:7
passcode_prop_idxs["presumed passcode property indices:\n[8, 47, 15, 26]"]
space:1
prop["combined_property_key\n[ 9001 52846 60493 16351 35265 44501 6486 10690 43127 56920 30392 10548
57768 14631 57069 56527 10500 44555 63300 1150 2677 56633 42644 55207
44235 36158 32044 855 38005 52063 22815 58224 53054 33131 24819 52077
47369 51097 19922 29093 63641 50176 33110 61305 33583 15781 11416 14778
40704 31751 24641 43588 7530 36392]"]
cipheredhashed["hashed ciphered passcode:\n$2b$12$n5xAQRuWhK3MiLsQHYiRu.p2Mam48sH7W/L7BojTBkyoQuUGa6/sO"]
get_presumed_idxs --> passcode_prop_idxs
space:5
sel(("select\nproperties"))
passcode_prop_idxs --> sel
prop --> sel
space:7
passcode_prop["presumed passcode properties:\n[43127 14778 56527 32044]"]
sel --> passcode_prop
space:7
cipher(("encipher"))
passcode_prop --> cipher
space:7
cipheredpass["ciphered passcode:\n[13426 36218 50763 4844 6629 37858 57195 10700 63193 44873]"]
cipher --> cipheredpass
space:8
comp(["compare"])
cipheredpass --> comp
cipheredhashed --> comp
space:7
suc(("valid"))
fail(("invalid"))
comp --> suc
comp --> fail
```