Files
pynkode/docs/encipher_decipher_renew_nkode.md
2025-03-26 09:15:40 -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: [58201 3855 47017 50828 14104 4268 29079 19099 12271 55135 54341 2465 32959 3356 36643 50702 8094 11335 39310 38981 55881 6507 22508 16345 19379 55560 52385 29733 25178 37713 59696 16347 14811 20691 101 35545 48103 63525 408 28174 57763 21416 59610 976 40160 13681 17146 54023 25410 42165 3856 59580 27726 13822]
  • position key: [59066 9448 56848 58798 57675 37475 8528 34148 34468]

User Cipher

  • property key: [61737 49256 8018 54927 21709 65009 3885 46808 12375 11644 35339 52787 60805 49964 2754 34451 22775 9278 14454 37226 46352 60033 49123 21025 6479 60885 9059 20442 64510 63443 6758 52715 61370 9158 50160 8810 27528 11812 34328 47745 43244 9125 55623 10800 49542 55251 26390 19027 23252 5772 30639 25220 21506 59558]
  • passcode key: [54682 39190 21777 53204 58859 47387 24762 19698 44816 55464]
  • combined position key: [52800 11537 463 51813 36017 64303 52526 57594 11887]
  • mask key: [61564 54039 23310 1396 28615 39019 39047 46821 40711 32470]

Combined Postion Key

block-beta
  columns 2
  user_pos["user position key:\n[19938 59072 31217 46834 52213   218 38377  1271 54783]"]
  customer_pos["customer position key:\n[59066  9448 56848 58798 57675 37475  8528 34148 34468]"]
  space:2
  xor(("XOR")):2
  user_pos --> xor
  customer_pos --> xor
  space:2
  comb_pos["combined position key\n[52800 11537   463 51813 36017 64303 52526 57594 11887]"]:2
  xor --> comb_pos

User Keypad

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

nKode Cipher

Passcode Hash

block-beta
    columns 2
    cprop["customer_property_key\n[58201  3855 47017 50828 14104  4268 29079 19099 12271 55135 54341  2465
 32959  3356 36643 50702  8094 11335 39310 38981 55881  6507 22508 16345
 19379 55560 52385 29733 25178 37713 59696 16347 14811 20691   101 35545
 48103 63525   408 28174 57763 21416 59610   976 40160 13681 17146 54023
 25410 42165  3856 59580 27726 13822]"]
    uprop["user_property_key\n[61737 49256  8018 54927 21709 65009  3885 46808 12375 11644 35339 52787
 60805 49964  2754 34451 22775  9278 14454 37226 46352 60033 49123 21025
  6479 60885  9059 20442 64510 63443  6758 52715 61370  9158 50160  8810
 27528 11812 34328 47745 43244  9125 55623 10800 49542 55251 26390 19027
 23252  5772 30639 25220 21506 59558]"]
    space:2
    xor1(("XOR")):2
    cprop --> xor1
    uprop --> xor1
    space:2
    prop["combined_property_key\n[27145 64606  2214   956 59410 24299 43596 51759 39102 28353 20824 14874
 27994 60897 60356 49474 41290 62135 52049 26214 37014 45529 43514 40298
 25315 52116 23008  2744  3269  7285 34470  4311 21401 14127 50809 13541
  5394 30989 34092 27076 35814 63505 33710 18123 25966 61467 19353 14805
 58907 44436 41458  3440  7755 35403]"]
    xor1 --> prop
    pass["user_passcode_indices\n[30, 38, 11, 51]"]
    space:2
    sel(("select\nproperties")):2
    pass --> sel
    prop --> sel
    space:2
    passcode["user passcode properties:\n[34470 34092 14874  3440]"]:2
    sel --> passcode
    space:2
    pad["zero pad to\nmax nkode length: 10"]:2
    passcode -->pad
    space:2
    paddedpasscode["padded passcode:\n[34470 34092 14874  3440     0     0     0     0     0     0]"]
    pad --> paddedpasscode
    passkey["passcode key:\n[54682 39190 21777 53204 58859 47387 24762 19698 44816 55464]"]
    space:2
    xor2(("XOR")):2
    passkey --> xor2
    paddedpasscode --> xor2
    space:2
    cipheredpass["ciphered passcode:\n[21308  7226 28427 49828 58859 47387 24762 19698 44816 55464]"]:2
    xor2 --> cipheredpass
    space:2
    hash(("hash")):2
    cipheredpass --> hash
    space:2
    cipheredhashed["hashed ciphered passcode:\n$2b$12$uR5ilcM4r.xjbzW4kGWf2.tbGVWSwrnqp1s6sGzqUmgcE1ncQK8UW"]:2
    hash --> cipheredhashed

Mask Encipher

block-beta
    columns 3
    passcode_idx["passcode indices:\n[30, 38, 11, 51]"]
    comb_pos["combined position key:\n[52800 11537   463 51813 36017 64303 52526 57594 11887]"]
    cust_pos["customer position key:\n[59066  9448 56848 58798 57675 37475  8528 34148 34468]"]
    
    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, 2, 2, 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, 2, 2, 6, 1, 2, 3, 6, 8, 5]"]
    pad1 --> posidx
    space:1
    user_pos["user position key:\n[19938 59072 31217 46834 52213   218 38377  1271 54783]"]
    xor1 --> user_pos
    
    space:4
    sel(("select positions"))
    user_pos --> sel
    posidx --> sel
    space:5
    passcode_pos["ordered user passcode positions:\n[46834 31217 31217 38377 59072 31217 46834 38377 54783   218]"]
    sel --> passcode_pos
    mask_key["mask key\n[61564 54039 23310  1396 28615 39019 39047 46821 40711 32470]"]
    space:4
    xor2(("XOR"))
    mask_key --> xor2
    passcode_pos --> xor2
    space:5
    mask["enciphered mask:\n [18062 43750  8959 37021 35079 57754 11893  8972 19192 32268]"]
    xor2 --> mask

Validate nKode

block-beta
    columns 3
    selected_keys["keys selected by user during login:\n[0, 0, 1, 1]"]
    login_keypad["login keypad:\nKey 0: [27 19 38 30 31 41  6  7 26]
Key 1: [36 37 11 48  4 23 51 34 44]
Key 2: [45  1 20 12 49 50 15 52 53]
Key 3: [18 46 47  3 22  5 33 43 35]
Key 4: [ 9 28 29 21 13 14 42 16 17]
Key 5: [ 0 10  2 39 40 32 24 25  8]
"]
    space:4
    
    selectkeys(("filter keys"))
    mask["enciphered mask:\n [18062 43750  8959 37021 35079 57754 11893  8972 19192 32268]"]
    mask_key["mask key:\n[61564 54039 23310  1396 28615 39019 39047 46821 40711 32470]"]
    space:2
    
    xor1(("XOR"))
    mask --> xor1
    mask_key --> xor1
    selected_keys --> selectkeys
    login_keypad --> selectkeys
    space:3 
    
    ordered_keys["ordered keys:\n[[27 19 38 30 31 41  6  7 26]
 [27 19 38 30 31 41  6  7 26]
 [36 37 11 48  4 23 51 34 44]
 [36 37 11 48  4 23 51 34 44]]"]
    user_position_key["user position key:\n[19938 59072 31217 46834 52213   218 38377  1271 54783]"]
    passcode_pos["ordered user passcode positions:\n[46834 31217 31217 38377 59072 31217 46834 38377 54783   218]"]
    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, 2, 2, 6, 1, 2, 3, 6, 8, 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[30, 38, 11, 51]"]
    prop["combined_property_key\n[27145 64606  2214   956 59410 24299 43596 51759 39102 28353 20824 14874
 27994 60897 60356 49474 41290 62135 52049 26214 37014 45529 43514 40298
 25315 52116 23008  2744  3269  7285 34470  4311 21401 14127 50809 13541
  5394 30989 34092 27076 35814 63505 33710 18123 25966 61467 19353 14805
 58907 44436 41458  3440  7755 35403]"]
    cipheredhashed["hashed ciphered passcode:\n$2b$12$uR5ilcM4r.xjbzW4kGWf2.tbGVWSwrnqp1s6sGzqUmgcE1ncQK8UW"]
    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[34470 34092 14874  3440]"]
    sel --> passcode_prop
    space:5
    
    cipher(("encipher"))
    passcode_prop --> cipher
    space:5
    
    cipheredpass["ciphered passcode:\n[21308  7226 28427 49828 58859 47387 24762 19698 44816 55464]"]
    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/>[39712 15414  6132 54579 48351 41754 42337 31991 43241 17341 56147 62505
 32991 11981 57606 18385 63933 54921 62247 63244  9606 23384  5657 53067
 31660  9793 31363 17762 63291 60326 40128 56636 48163  5353  1417  5775
 32410 22313   820 54085  8970 56244 23273 27899 42216 10184 11407 29574
 48335 47896 54877 28660 19017 25325]`"]
        new_prop["`new customer property key:<br/>[58201  3855 47017 50828 14104  4268 29079 19099 12271 55135 54341  2465
 32959  3356 36643 50702  8094 11335 39310 38981 55881  6507 22508 16345
 19379 55560 52385 29733 25178 37713 59696 16347 14811 20691   101 35545
 48103 63525   408 28174 57763 21416 59610   976 40160 13681 17146 54023
 25410 42165  3856 59580 27726 13822]`"]
        old_pos["`old customer position key:<br/>[33698 52177 30782 31895 18244 64501 22727 58381 64400]`"]
        new_pos["`new customer position key:<br/>[59066  9448 56848 58798 57675 37475  8528 34148 34468]`"]
        xor1(("XOR"))
        xor2(("XOR"))
        xor_prop["`xor property key:<br/>[30841 13113 41053  5055 35783 46006 54518 13932 34566 38114  3862 64904
    96  9169 28197 33247 58915 64206 27305 28489 65487 16947 16885 61586
 12319 65353 46626 12615 38241 30967 30192 58087 34296 17466  1516 40022
 50557 44812   684 48459 49833 34844 45619 28459 14344  4793 28277 41089
 57229  8109 55629 34632  9735 22291]`"]
        xor_pos["`xor position key:<br/>[25880 61241 42542 39225 42511 27030 31127 24937 32052]`"]
        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/>[19938 59072 31217 46834 52213   218 38377  1271 54783]`"]
                old_user_prop["`property key:<br/>[61737 49256  8018 54927 21709 65009  3885 46808 12375 11644 35339 52787
 60805 49964  2754 34451 22775  9278 14454 37226 46352 60033 49123 21025
  6479 60885  9059 20442 64510 63443  6758 52715 61370  9158 50160  8810
 27528 11812 34328 47745 43244  9125 55623 10800 49542 55251 26390 19027
 23252  5772 30639 25220 21506 59558]`"]
                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/>[43864 49704 42977 21340 10942 37561 46265 33171 21339]`"]
                inter_user_prop["`property key:<br/>[35152 62289 48911 50480 57098 20039 56283 32948 46929 47518 34077 13243
 60901 57597 25831  1868 48852 57072 21215 65059 19167 43186 65046 41651
 10576  4764 38209 32413 28319 36644 28566 12044 27202 26620 50716 48700
 44789 33064 33972  1994 27205 43961 27508 17691 63886 50538  2403 60114
 34137  2337 44770 58828 29189 49077]`"]
                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/>[ 6533 37152 58679 48102 36450  2846 47432 25286  7670]`"]
            new_user_prop["`property key:<br/>[46243  7833 58428  7967  9894 32124 48453 54560 26021 20475 10880  7429
 26439 31401 37980 56964 32338 15187  9442 19302 53060 31276 34465 43143
 33088  8587 47204 47532 45177 35842 11142 47055 40284 49647  9306 58542
 63251 40940 32915 53183 16853 43890 60339 30610  6078 59395  7618 59221
 44934 37153 10149 59493  8228 59563]`"]
            new_renew["renew: False"]
        end
        login --> new_user
    end