Files
pynkode/docs/encipher_decipher_renew_nkode.md
2025-03-26 09:00:04 -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: [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

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:
    Key 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]
  • user passcode indices: [28, 24, 34, 1]

nKode Cipher

Passcode Hash

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

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

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
    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