Files
pynkode/docs/encipher_decipher_renew_nkode.md
2025-03-26 09:01:39 -05:00

12 KiB

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: [12463 12679 30383 52780 48100 5096 61398 5750 59949 16574 25395 8158 51151 56863 52932 11578 50839 38005 12741 42227 40877 7172 53174 60400 12356 13971 19389 64980 16810 26389 39074 63833 12649 64422 4920 54703 62742 25787 26216 4453 38866 27951 36713 37903 22497 4454 55622 38346 31982 51225 48698 29699 36128 33748]
  • position key: [56601 6465 12615 40545 49643 37783 59315 4335 13897]

User Cipher

  • property key: [14898 49243 46261 43286 743 60989 43535 48626 62301 50822 24597 10059 48516 48141 42915 36062 3286 11914 44159 34414 20879 14779 26916 49959 52279 29970 35884 62523 22453 25290 37000 30416 6102 20665 42719 23156 54785 3366 46811 57278 42429 58327 26021 27943 614 26543 63962 45468 15599 34845 22766 44215 32257 43746]
  • passcode key: [ 4981 30039 31839 45969 48275 35799 10819 2121 61259 48949]
  • combined position key: [58180 35354 39081 61964 32045 26428 24571 62221 62362]
  • mask key: [ 3841 58027 55280 33679 39465 22075 10291 60287 27680 15384]

Combined Postion Key

block-beta
  columns 2
  user_pos["user position key:\n[57725 11307 31071 28372 27611 49409 15121 51933 25996]"]
  customer_pos["customer position key:\n[56601  6465 12615 40545 49643 37783 59315  4335 13897]"]
  space:2
  xor(("XOR")):2
  user_pos --> xor
  customer_pos --> xor
  space:2
  comb_pos["combined position key\n[58180 35354 39081 61964 32045 26428 24571 62221 62362]"]:2
  xor --> comb_pos

User Keypad

  • keypad example:
    Key 0: [18 19 2 21 31 5 6 43 17]
    Key 1: [ 9 46 29 30 49 32 42 52 35]
    Key 2: [27 10 20 48 40 14 33 34 44]
    Key 3: [45 28 47 12 4 23 51 25 26]
    Key 4: [ 0 1 38 3 22 41 24 16 53]
    Key 5: [36 37 11 39 13 50 15 7 8]
  • user passcode indices: [6, 43, 53, 9]

nKode Cipher

Passcode Hash

block-beta
    columns 2
    cprop["customer_property_key\n[12463 12679 30383 52780 48100  5096 61398  5750 59949 16574 25395  8158
 51151 56863 52932 11578 50839 38005 12741 42227 40877  7172 53174 60400
 12356 13971 19389 64980 16810 26389 39074 63833 12649 64422  4920 54703
 62742 25787 26216  4453 38866 27951 36713 37903 22497  4454 55622 38346
 31982 51225 48698 29699 36128 33748]"]
    uprop["user_property_key\n[14898 49243 46261 43286   743 60989 43535 48626 62301 50822 24597 10059
 48516 48141 42915 36062  3286 11914 44159 34414 20879 14779 26916 49959
 52279 29970 35884 62523 22453 25290 37000 30416  6102 20665 42719 23156
 54785  3366 46811 57278 42429 58327 26021 27943   614 26543 63962 45468
 15599 34845 22766 44215 32257 43746]"]
    space:2
    xor1(("XOR")):2
    cprop --> xor1
    uprop --> xor1
    space:2
    prop["combined_property_key\n[ 2598 13817  3743 55138 48519 14914 34131  3917 24848 29635 52388 57749
 31090 24065 22959 61051 34121 30393   691 47015 26630 54959 13562 20862
 31358 35382 39584 57405 53720 45712 49496 53667 35073 25844 36156 57792
 30240 21451 23037  3839 61742 34083 35502 63962 25413 50263 31741 63116
 30806 16519 51243  8712 32194  8269]"]
    xor1 --> prop
    pass["user_passcode_indices\n[6, 43, 53, 9]"]
    space:2
    sel(("select\nproperties")):2
    pass --> sel
    prop --> sel
    space:2
    passcode["user passcode properties:\n[34131 63962  8269 29635]"]:2
    sel --> passcode
    space:2
    pad["zero pad to\nmax nkode length: 10"]:2
    passcode -->pad
    space:2
    paddedpasscode["padded passcode:\n[34131 63962  8269 29635     0     0     0     0     0     0]"]
    pad --> paddedpasscode
    passkey["passcode key:\n[ 4981 30039 31839 45969 48275 35799 10819  2121 61259 48949]"]
    space:2
    xor2(("XOR")):2
    passkey --> xor2
    paddedpasscode --> xor2
    space:2
    cipheredpass["ciphered passcode:\n[38438 35981 23570 49234 48275 35799 10819  2121 61259 48949]"]:2
    xor2 --> cipheredpass
    space:2
    hash(("hash")):2
    cipheredpass --> hash
    space:2
    cipheredhashed["hashed ciphered passcode:\n$2b$12$rF1TSRHSHfOTE4V/7ZCv3.Plqb1AysifW1KvR96K7CbC1sPt1ungK"]:2
    hash --> cipheredhashed

Mask Encipher

block-beta
    columns 3
    passcode_idx["passcode indices:\n[6, 43, 53, 9]"]
    comb_pos["combined position key:\n[58180 35354 39081 61964 32045 26428 24571 62221 62362]"]
    cust_pos["customer position key:\n[56601  6465 12615 40545 49643 37783 59315  4335 13897]"]
    
    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[6, 7, 8, 0]"]
    propidx --> passcode_position_idx
    
    space:5
    pad1(("Pad with\nrandom indices"))
    passcode_position_idx --> pad1
          
    space:5
    posidx["Padded Passcode Position Indices:\n[6, 7, 8, 0, 1, 1, 2, 3, 0, 5]"]
    pad1 --> posidx
    space:1
    user_pos["user position key:\n[57725 11307 31071 28372 27611 49409 15121 51933 25996]"]
    xor1 --> user_pos
    
    space:4
    sel(("select positions"))
    user_pos --> sel
    posidx --> sel
    space:5
    passcode_pos["ordered user passcode positions:\n[15121 51933 25996 57725 11307 11307 31071 28372 57725 49409]"]
    sel --> passcode_pos
    mask_key["mask key\n[ 3841 58027 55280 33679 39465 22075 10291 60287 27680 15384]"]
    space:4
    xor2(("XOR"))
    mask_key --> xor2
    passcode_pos --> xor2
    space:5
    mask["enciphered mask:\n [13328 10358 45692 25330 46594 31248 20844 34219 36189 64793]"]
    xor2 --> mask

Validate nKode

block-beta
    columns 3
    selected_keys["selected keys:\n[0, 0, 4, 1]"]
    login_keypad["login keypad:\nKey 0: [18 19  2 21 31  5  6 43 17]
Key 1: [ 9 46 29 30 49 32 42 52 35]
Key 2: [27 10 20 48 40 14 33 34 44]
Key 3: [45 28 47 12  4 23 51 25 26]
Key 4: [ 0  1 38  3 22 41 24 16 53]
Key 5: [36 37 11 39 13 50 15  7  8]
"]
    space:4
    
    selectkeys(("select keys"))
    mask["enciphered mask:\n [13328 10358 45692 25330 46594 31248 20844 34219 36189 64793]"]
    mask_key["mask key:\n[ 3841 58027 55280 33679 39465 22075 10291 60287 27680 15384]"]
    space:2
    
    xor1(("XOR"))
    mask --> xor1
    mask_key --> xor1
    selected_keys --> selectkeys
    login_keypad --> selectkeys
    space:3 
    
    ordered_keys["ordered keys:\n[[18 19  2 21 31  5  6 43 17]
 [18 19  2 21 31  5  6 43 17]
 [ 0  1 38  3 22 41 24 16 53]
 [ 9 46 29 30 49 32 42 52 35]]"]
    user_position_key["user position key:\n[57725 11307 31071 28372 27611 49409 15121 51933 25996]"]
    passcode_pos["ordered user passcode positions:\n[15121 51933 25996 57725 11307 11307 31071 28372 57725 49409]"]
    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[6, 7, 8, 0, 1, 1, 2, 3, 0, 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[6, 43, 53, 9]"]
    prop["combined_property_key\n[ 2598 13817  3743 55138 48519 14914 34131  3917 24848 29635 52388 57749
 31090 24065 22959 61051 34121 30393   691 47015 26630 54959 13562 20862
 31358 35382 39584 57405 53720 45712 49496 53667 35073 25844 36156 57792
 30240 21451 23037  3839 61742 34083 35502 63962 25413 50263 31741 63116
 30806 16519 51243  8712 32194  8269]"]
    cipheredhashed["hashed ciphered passcode:\n$2b$12$rF1TSRHSHfOTE4V/7ZCv3.Plqb1AysifW1KvR96K7CbC1sPt1ungK"]
    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[34131 63962  8269 29635]"]
    sel --> passcode_prop
    space:5
    
    cipher(("encipher"))
    passcode_prop --> cipher
    space:5
    
    cipheredpass["ciphered passcode:\n[38438 35981 23570 49234 48275 35799 10819  2121 61259 48949]"]
    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
    flowchart
    subgraph Renew Customer Keys 
        old_prop["`old customer property key:<br/>[12308 62882 47658 32372 48992 54399 12124 45759 37453 46405 44209 50910
 50422 57868 65036 25253 35231 22579 44748 12745 14729 61204 24030 37465
 46665 65316  5772  5126 34413 53338 20944 42867 40663 13389 11235 48052
 40993 24301 61222 53569 21651 26356 61195 38141 24867 41976 33319 18192
 17593 51354 37061 36543   963 35503]`"]
        new_prop["`new customer property key:<br/>[12463 12679 30383 52780 48100  5096 61398  5750 59949 16574 25395  8158
 51151 56863 52932 11578 50839 38005 12741 42227 40877  7172 53174 60400
 12356 13971 19389 64980 16810 26389 39074 63833 12649 64422  4920 54703
 62742 25787 26216  4453 38866 27951 36713 37903 22497  4454 55622 38346
 31982 51225 48698 29699 36128 33748]`"]
        old_pos["`old customer position key:<br/>[  569 42545 57846 40152  5878 42557 25834 14800 38422]`"]
        new_pos["`new customer position key:<br/>[56601  6465 12615 40545 49643 37783 59315  4335 13897]`"]
        xor1(("XOR"))
        xor2(("XOR"))
        xor_prop["`xor property key:<br/>[  187 50213 52357 45144  1156 51095 49290 42185 30816 62971 53122 55552
   825 15379 12488 20383 20232 52294 40713 38202 42532 62224 37480 31145
 34317 51639 23857 59858 51143 46927 51570 24106 44990 53227 14555 28187
 21815 14934 35150 49188 49985  3035 24674   242 14018 45726 23393 53978
 14423   131 12031 64188 36579  2427]`"]
        xor_pos["`xor position key:<br/>[57120 49008 53425   697 55069 13738 33625 10559 41055]`"]
        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/>[57725 11307 31071 28372 27611 49409 15121 51933 25996]`"]
                old_user_prop["`property key:<br/>[14898 49243 46261 43286   743 60989 43535 48626 62301 50822 24597 10059
 48516 48141 42915 36062  3286 11914 44159 34414 20879 14779 26916 49959
 52279 29970 35884 62523 22453 25290 37000 30416  6102 20665 42719 23156
 54785  3366 46811 57278 42429 58327 26021 27943   614 26543 63962 45468
 15599 34845 22766 44215 32257 43746]`"]
                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/>[15460 13674 18456 61621 43568 21142 56482 55858 21445]`"]
                inter_user_prop["`property key:<br/>[14985  1150 30768  6478  1635 10666 27269  6459 35645 13181 44951 65099
 48829 32798 38763 49985 17374 58060 13174  4948 63403 51883 64332 47758
 19002 48293 53533  7657 36978 54661 23034 10490 47208 40786 40452 13423
 33590 14192 16277  8090 26364 59404  1479 28117 13476 54577 41659 25414
  1208 34974 30225 22027 61666 41881]`"]
                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/>[47033 63959  2503 19274 39057 42505 33376 18119 33917]`"]
            new_user_prop["`property key:<br/>[39652 18270  5028 34303  6339 45092 14652 39608 18788  7857  4800  6775
 27243   640 51816 11487 16139 34341 38485  4249 44601 62920 30209  8343
 19333 26092  3947 16867 32616  6792 36914 19857  1483 51567 23049 15969
 48502  8758 26851 13558 39754 23725  1217 61491 64601  5714 32155 53045
 11055 63186  5924 56720 60612 13766]`"]
            new_renew["renew: False"]
        end
        login --> new_user
    end