Files
pynkode/docs/encipher_decipher_renew_nkode.md
2025-03-26 08:59:13 -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: [17433 57572 21505 8444 45652 40584 48852 43446 5599 62405 28323 40256 47776 49892 26386 48063 8519 55431 26581 11344 39650 4798 19208 64337 33689 12686 45679 3132 40090 40966 37000 33485 30170 45501 20844 20464 53748 19697 19768 4387 39395 35315 9619 28777 48707 30931 62584 35610 46036 40873 63440 33641 852 11131]
  • position key: [38077 51455 31958 23938 20630 60053 9765 10657 7626]

User Cipher

  • property key: [24983 41762 20840 27438 7273 19213 38577 61466 23138 47314 23998 50092 273 14037 34702 41428 64080 27332 13490 12880 55541 24199 778 9414 29001 19211 3074 60661 6134 25585 30166 41331 20480 63833 34395 54478 26155 58076 18811 43725 18545 28882 15969 25829 22807 22588 35663 41312 34398 20904 148 47345 50354 38166]
  • passcode key: [29182 58569 45520 52787 7372 34618 40716 38549 23700 43116]
  • combined position key: [55717 12248 3398 52977 52974 12019 47318 59100 12380]
  • mask key: [51996 30221 59877 58879 34382 22287 31520 64981 60412 37143]

Combined Postion Key

block-beta
  columns 2
  user_pos["user position key:\n[41859  3923 32291 54686 34461 59585 18017  7286 34891]"]
  customer_pos["customer position key:\n[38077 51455 31958 23938 20630 60053  9765 10657  7626]"]
  space:2
  xor(("XOR")):2
  user_pos --> xor
  customer_pos --> xor
  space:2
  comb_pos["combined position key\n[55717 12248  3398 52977 52974 12019 47318 59100 12380]"]:2
  xor --> comb_pos

User Keypad

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

nKode Cipher

Passcode Hash

block-beta
    columns 2
    cprop["customer_property_key\n[17433 57572 21505  8444 45652 40584 48852 43446  5599 62405 28323 40256
 47776 49892 26386 48063  8519 55431 26581 11344 39650  4798 19208 64337
 33689 12686 45679  3132 40090 40966 37000 33485 30170 45501 20844 20464
 53748 19697 19768  4387 39395 35315  9619 28777 48707 30931 62584 35610
 46036 40873 63440 33641   852 11131]"]
    uprop["user_property_key\n[24983 41762 20840 27438  7273 19213 38577 61466 23138 47314 23998 50092
   273 14037 34702 41428 64080 27332 13490 12880 55541 24199   778  9414
 29001 19211  3074 60661  6134 25585 30166 41331 20480 63833 34395 54478
 26155 58076 18811 43725 18545 28882 15969 25829 22807 22588 35663 41312
 34398 20904   148 47345 50354 38166]"]
    space:2
    xor1(("XOR")):2
    cprop --> xor1
    uprop --> xor1
    space:2
    prop["combined_property_key\n[ 9552 31208 37587 40095 45072 12350 32006  2925 11611 34589 36849 42561
 26580 61891 26520 39789 65017  7624 63974  8702  9646 62493 54967 42708
 52347 11714 29071 28123 11157 34826  4115 53992 58115 20982 19018 55103
 48003  8472 18407 52180 52783 23938 12226 59018 22734 31178 30431 34796
 35730 22961 11250 19920 45688 49980]"]
    xor1 --> prop
    pass["user_passcode_indices\n[1, 32, 34, 5]"]
    space:2
    sel(("select\nproperties")):2
    pass --> sel
    prop --> sel
    space:2
    passcode["user passcode properties:\n[31208 58115 19018 12350]"]:2
    sel --> passcode
    space:2
    pad["zero pad to\nmax nkode length: 10"]:2
    passcode -->pad
    space:2
    paddedpasscode["padded passcode:\n[31208 58115 19018 12350     0     0     0     0     0     0]"]
    pad --> paddedpasscode
    passkey["passcode key:\n[29182 58569 45520 52787  7372 34618 40716 38549 23700 43116]"]
    space:2
    xor2(("XOR")):2
    passkey --> xor2
    paddedpasscode --> xor2
    space:2
    cipheredpass["ciphered passcode:\n[ 2070  1994 64410 65037  7372 34618 40716 38549 23700 43116]"]:2
    xor2 --> cipheredpass
    space:2
    hash(("hash")):2
    cipheredpass --> hash
    space:2
    cipheredhashed["hashed ciphered passcode:\n$2b$12$mSfxfqokaUYYc8CHnj1nV.3fz.FUkMo4dNreWfUUO4zdgN0LQQ2Tm"]:2
    hash --> cipheredhashed

Mask Encipher

block-beta
    columns 3
    passcode_idx["passcode indices:\n[1, 32, 34, 5]"]
    comb_pos["combined position key:\n[55717 12248  3398 52977 52974 12019 47318 59100 12380]"]
    cust_pos["customer position key:\n[38077 51455 31958 23938 20630 60053  9765 10657  7626]"]
    
    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, 5, 7, 5]"]
    propidx --> passcode_position_idx
    
    space:5
    pad1(("Pad with\nrandom indices"))
    passcode_position_idx --> pad1
          
    space:5
    posidx["Padded Passcode Position Indices:\n[1, 5, 7, 5, 7, 2, 8, 1, 7, 1]"]
    pad1 --> posidx
    space:1
    user_pos["user position key:\n[41859  3923 32291 54686 34461 59585 18017  7286 34891]"]
    xor1 --> user_pos
    
    space:4
    sel(("select positions"))
    user_pos --> sel
    posidx --> sel
    space:5
    passcode_pos["ordered user passcode positions:\n[ 3923 59585  7286 59585  7286 32291 34891  3923  7286  3923]"]
    sel --> passcode_pos
    mask_key["mask key\n[51996 30221 59877 58879 34382 22287 31520 64981 60412 37143]"]
    space:4
    xor2(("XOR"))
    mask_key --> xor2
    passcode_pos --> xor2
    space:5
    mask["enciphered mask:\n [50255 40652 62867  3390 39480 10540 62315 62086 63370 40516]"]
    xor2 --> mask

Validate nKode

block-beta
    columns 3
    pass["user_passcode_indices\n[1, 32, 34, 5]"]
    login_keypad["login keypad:\nKey 0: [36 28 38 21  4 41 15 43 26]
Key 1: [ 0 19 47 12 49 14 33 16 17]
Key 2: [ 9 37  2 39 40 50 51 52 44]
Key 3: [27 46 29 30 31  5 24 25 35]
Key 4: [18 10 20 48 22 23 42 34 53]
Key 5: [45  1 11  3 13 32  6  7  8]
"]
    space:4
    
    selectkeys(("user"))
    mask["enciphered mask:\n [50255 40652 62867  3390 39480 10540 62315 62086 63370 40516]"]
    mask_key["mask key:\n[51996 30221 59877 58879 34382 22287 31520 64981 60412 37143]"]
    space:2
    
    xor1(("XOR"))
    mask --> xor1
    mask_key --> xor1
    pass --> selectkeys
    login_keypad --> selectkeys
    space:3 
    
    ordered_keys["ordered keys:\n[[45  1 11  3 13 32  6  7  8]
 [45  1 11  3 13 32  6  7  8]
 [18 10 20 48 22 23 42 34 53]
 [27 46 29 30 31  5 24 25 35]]"]
    user_position_key["user position key:\n[41859  3923 32291 54686 34461 59585 18017  7286 34891]"]
    passcode_pos["ordered user passcode positions:\n[ 3923 59585  7286 59585  7286 32291 34891  3923  7286  3923]"]
    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, 5, 7, 5, 7, 2, 8, 1, 7, 1]"]
    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[1, 32, 34, 5]"]
    prop["combined_property_key\n[ 9552 31208 37587 40095 45072 12350 32006  2925 11611 34589 36849 42561
 26580 61891 26520 39789 65017  7624 63974  8702  9646 62493 54967 42708
 52347 11714 29071 28123 11157 34826  4115 53992 58115 20982 19018 55103
 48003  8472 18407 52180 52783 23938 12226 59018 22734 31178 30431 34796
 35730 22961 11250 19920 45688 49980]"]
    cipheredhashed["hashed ciphered passcode:\n$2b$12$mSfxfqokaUYYc8CHnj1nV.3fz.FUkMo4dNreWfUUO4zdgN0LQQ2Tm"]
    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[31208 58115 19018 12350]"]
    sel --> passcode_prop
    space:5
    
    cipher(("encipher"))
    passcode_prop --> cipher
    space:5
    
    cipheredpass["ciphered passcode:\n[ 2070  1994 64410 65037  7372 34618 40716 38549 23700 43116]"]
    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/>[17607 56010 50107 63409 44153 31539 60343 64375 30521 16335 53839 26093
 26309 50966 57366 15033  1961 30476 52564  5038 64859 43674 54717 33298
 48434 26313 32141 33070 15459 60411 26053 29595 45827 43183 52241  1009
 56744 50116  3740 24857 34398 11600  4515 33391   473  8694 64912  9868
  3532  2073 11110 62753 30410 22058]`"]
        new_prop["`new customer property key:<br/>[17433 57572 21505  8444 45652 40584 48852 43446  5599 62405 28323 40256
 47776 49892 26386 48063  8519 55431 26581 11344 39650  4798 19208 64337
 33689 12686 45679  3132 40090 40966 37000 33485 30170 45501 20844 20464
 53748 19697 19768  4387 39395 35315  9619 28777 48707 30931 62584 35610
 46036 40873 63440 33641   852 11131]`"]
        old_pos["`old customer position key:<br/>[31270  8331 29541  7023 18547 50738 65207 64170 47127]`"]
        new_pos["`new customer position key:<br/>[38077 51455 31958 23938 20630 60053  9765 10657  7626]`"]
        xor1(("XOR"))
        xor2(("XOR"))
        xor_prop["`xor property key:<br/>[  222 14894 38842 55117  7725 58811 21859 21185 25318 52234 48364 63661
 56421  1522 34564 33030  9966 44939 43649 16382 26553 47140 40629 31043
 16043 22343 53218 36114 41209 19453 62797 61782 50905  6418 40317 19457
  3164 36661 17316 28730  8125 42147 13360 61958 49050 22821  2536 44438
 48664 38832 56502 30280 30110 32081]`"]
        xor_pos["`xor position key:<br/>[61083 59508  4019 18157  6373 11431 55442 54027 42461]`"]
        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/>[41859  3923 32291 54686 34461 59585 18017  7286 34891]`"]
                old_user_prop["`property key:<br/>[24983 41762 20840 27438  7273 19213 38577 61466 23138 47314 23998 50092
   273 14037 34702 41428 64080 27332 13490 12880 55541 24199   778  9414
 29001 19211  3074 60661  6134 25585 30166 41331 20480 63833 34395 54478
 26155 58076 18811 43725 18545 28882 15969 25829 22807 22588 35663 41312
 34398 20904   148 47345 50354 38166]`"]
                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/>[14142 51116   757 34844 54795   596 24644 13783 38273]`"]
                inter_user_prop["`property key:<br/>[24905 39180 50898 48227   580 44726 50130 41691 14468 29912 57682 15105
 56692 13095   138  8402 56510 50511 40499  3502 48972 59043 40383 23941
 20450  7244 50144 25063 46863 10252 32923 20517 38617 57419  6950 39119
 27255 28137  2783 56055 22476 54385  2641 38627 59021   281 33447  3318
 14406 50712 56354 52921 45356 59463]`"]
                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/>[23942 46252 53843 37910  7611 30257 63826 52812 27525]`"]
            new_user_prop["`property key:<br/>[12027 59464 45926 15881 63336 21673 37395 23025  6329 62833 48208 18116
 21253 58416 65368 58683 20373 46352 59037  5050 28807  6687 11647 25865
 62465  1781  2953 15931 16596 36975 19053  5585 53652 10011 18034 31490
 25501  8993 19946  5980 35552 33588 63303  2644 62898 12532  3981 16334
  9471 17209 53533 43576 41327 37349]`"]
            new_renew["renew: False"]
        end
        login --> new_user
    end