Files
pynkode/docs/encipher_decipher_renew_nkode.md
2025-03-26 08:53: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: [17384 21071 64263 14173 48872 51553 28021 45694 56555 33805 2625 64735 26395 23421 5291 64801 27594 45755 18570 21108 24021 32654 60698 36958 32655 8083 48743 18902 2050 58888 49782 53855 6539 61094 11244 16942 26841 50742 36717 15708 51338 47424 44243 62691 15630 41373 14725 34483 9141 48067 10942 13010 44634 40143]
  • position key: [26845 24321 52293 19187 29228 61277 32841 51235 34682]

User Cipher

  • property key: [ 6859 23873 43509 63326 38209 4681 6549 58196 20386 45543 7213 10665 59595 37675 38733 28230 18106 11839 217 58358 45503 9119 13711 47091 2477 4601 12968 25412 57571 1504 36875 36008 22596 65108 20334 57220 57449 9749 48916 23941 16493 45581 22735 8888 45253 44959 47418 52406 38448 31290 22494 51292 26944 44318]
  • passcode key: [61110 58124 49630 7713 65071 1473 10319 26443 24286 22]
  • combined position key: [17105 6226 55543 52110 63357 65173 47236 36681 52804]
  • mask key: [ 5981 20544 34128 22101 9735 7951 7840 53333 61565 214]

Combined Postion Key

block-beta
  columns 2
  user_pos["user position key:\n[15348 25802  2932 35759 37505  7088  5681 24341 39057]"]
  customer_pos["customer position key:\n[26845 24321 52293 19187 29228 61277 32841 51235 34682]"]
  space:2
  xor(("XOR")):2
  user_pos --> xor
  customer_pos --> xor
  space:2
  comb_pos["combined position key\n[17105  6226 55543 52110 63357 65173 47236 36681 52804]"]:2
  xor --> comb_pos

User Keypad

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

nKode Cipher

Passcode Hash

block-beta
    columns 2
    cprop["customer_property_key\n[17384 21071 64263 14173 48872 51553 28021 45694 56555 33805  2625 64735
 26395 23421  5291 64801 27594 45755 18570 21108 24021 32654 60698 36958
 32655  8083 48743 18902  2050 58888 49782 53855  6539 61094 11244 16942
 26841 50742 36717 15708 51338 47424 44243 62691 15630 41373 14725 34483
  9141 48067 10942 13010 44634 40143]"]
    uprop["user_property_key\n[ 6859 23873 43509 63326 38209  4681  6549 58196 20386 45543  7213 10665
 59595 37675 38733 28230 18106 11839   217 58358 45503  9119 13711 47091
  2477  4601 12968 25412 57571  1504 36875 36008 22596 65108 20334 57220
 57449  9749 48916 23941 16493 45581 22735  8888 45253 44959 47418 52406
 38448 31290 22494 51292 26944 44318]"]
    space:2
    xor1(("XOR")):2
    cprop --> xor1
    uprop --> xor1
    space:2
    prop["combined_property_key\n[ 3998 21572 55042 58365 40151 56917  7146 59748 41624  5784 34350 32869
 53395  9331 14458 19129 53918 11036 33943 47140 13973 55881 48429 60127
 51683  5313 42763 50259 48824 61851 14521 48287 21836 28900 38175 36849
 53395 56365 51787  3932  9457  4434 50392 35667 65060  8394 57404 19291
 36039 26883 24085 29399 24324 41103]"]
    xor1 --> prop
    pass["user_passcode_indices\n[16, 23, 45, 41]"]
    space:2
    sel(("select\nproperties")):2
    pass --> sel
    prop --> sel
    space:2
    passcode["user passcode properties:\n[53918 60127  8394  4434]"]:2
    sel --> passcode
    space:2
    pad["zero pad to\nmax nkode length: 10"]:2
    passcode -->pad
    space:2
    paddedpasscode["padded passcode:\n[53918 60127  8394  4434     0     0     0     0     0     0]"]
    pad --> paddedpasscode
    passkey["passcode key:\n[61110 58124 49630  7713 65071  1473 10319 26443 24286    22]"]
    space:2
    xor2(("XOR")):2
    passkey --> xor2
    paddedpasscode --> xor2
    space:2
    cipheredpass["ciphered passcode:\n[15400  2515 57620  3955 65071  1473 10319 26443 24286    22]"]:2
    xor2 --> cipheredpass
    space:2
    hash(("hash")):2
    cipheredpass --> hash
    space:2
    cipheredhashed["hashed ciphered passcode:\n$2b$12$4ew1R/6AXYkPuF4PO4CpQeCEEGMuoo7N8Rnj1yAGOGenJ8vc689ge"]:2
    hash --> cipheredhashed

Mask Encipher

block-beta
    columns 3
    passcode_idx["passcode indices:\n[16, 23, 45, 41]"]
    comb_pos["combined position key:\n[17105  6226 55543 52110 63357 65173 47236 36681 52804]"]
    cust_pos["customer position key:\n[26845 24321 52293 19187 29228 61277 32841 51235 34682]"]
    
    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[7, 5, 0, 5]"]
    propidx --> passcode_position_idx
    
    space:5
    pad1(("Pad with\nrandom indices"))
    passcode_position_idx --> pad1
          
    space:5
    posidx["Padded Passcode Position Indices:\n[7, 5, 0, 5, 6, 3, 1, 2, 8, 5]"]
    pad1 --> posidx
    space:1
    user_pos["user position key:\n[15348 25802  2932 35759 37505  7088  5681 24341 39057]"]
    xor1 --> user_pos
    
    space:4
    sel(("select positions"))
    user_pos --> sel
    posidx --> sel
    space:5
    passcode_pos["ordered user passcode positions:\n[24341  7088 15348  7088  5681 35759 25802  2932 39057  7088]"]
    sel --> passcode_pos
    mask_key["mask key\n[ 5981 20544 34128 22101  9735  7951  7840 53333 61565   214]"]
    space:4
    xor2(("XOR"))
    mask_key --> xor2
    passcode_pos --> xor2
    space:5
    mask["enciphered mask:\n [18504 19440 48804 19941 12342 38048 31338 56097 26860  7014]"]
    xor2 --> mask

Validate nKode

block-beta
    columns 3
    selected_keys["selected keys:\n[0, 1, 3, 3]"]
    login_keypad["login keypad:\nKey 0: [ 0  1  2 21  4  5 24 16 44]
Key 1: [36 46 38  3 49 23 33 43 35]
Key 2: [18 37 20 39 40 50 42 25 26]
Key 3: [45 19 47 48 31 41 51 52 53]
Key 4: [27 28 11 12 22 32 15  7 17]
Key 5: [ 9 10 29 30 13 14  6 34  8]
"]
    space:4
    
    selectkeys(("select keys"))
    mask["enciphered mask:\n [18504 19440 48804 19941 12342 38048 31338 56097 26860  7014]"]
    mask_key["mask key:\n[ 5981 20544 34128 22101  9735  7951  7840 53333 61565   214]"]
    space:2
    
    xor1(("XOR"))
    mask --> xor1
    mask_key --> xor1
    selected_keys --> selectkeys
    login_keypad --> selectkeys
    space:3 
    
    ordered_keys["ordered keys:\n[[ 0  1  2 21  4  5 24 16 44]
 [36 46 38  3 49 23 33 43 35]
 [45 19 47 48 31 41 51 52 53]
 [45 19 47 48 31 41 51 52 53]]"]
    user_position_key["user position key:\n[15348 25802  2932 35759 37505  7088  5681 24341 39057]"]
    passcode_pos["ordered user passcode positions:\n[24341  7088 15348  7088  5681 35759 25802  2932 39057  7088]"]
    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[7, 5, 0, 5, 6, 3, 1, 2, 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[16, 23, 45, 41]"]
    prop["combined_property_key\n[ 3998 21572 55042 58365 40151 56917  7146 59748 41624  5784 34350 32869
 53395  9331 14458 19129 53918 11036 33943 47140 13973 55881 48429 60127
 51683  5313 42763 50259 48824 61851 14521 48287 21836 28900 38175 36849
 53395 56365 51787  3932  9457  4434 50392 35667 65060  8394 57404 19291
 36039 26883 24085 29399 24324 41103]"]
    cipheredhashed["hashed ciphered passcode:\n$2b$12$4ew1R/6AXYkPuF4PO4CpQeCEEGMuoo7N8Rnj1yAGOGenJ8vc689ge"]
    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[53918 60127  8394  4434]"]
    sel --> passcode_prop
    space:5
    
    cipher(("encipher"))
    passcode_prop --> cipher
    space:5
    
    cipheredpass["ciphered passcode:\n[15400  2515 57620  3955 65071  1473 10319 26443 24286    22]"]
    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/>[ 5461  2309 32503  5283  2454 52252   639  2608 60730 42879 39427 43468
 14424 46936 44855  9471 37924  1315 33870 23506 34602 63958 34978 23852
 49230  1336 38307 42775 24155 62587 43186 12343  3336 36528 55921 20597
 12538 64056 30047 21209 25756 41823 39959 43499 20193 36693 22790 34797
  6903  4921  2507 47755 13892  3473]`"]
        new_prop["`new customer property key:<br/>[17384 21071 64263 14173 48872 51553 28021 45694 56555 33805  2625 64735
 26395 23421  5291 64801 27594 45755 18570 21108 24021 32654 60698 36958
 32655  8083 48743 18902  2050 58888 49782 53855  6539 61094 11244 16942
 26841 50742 36717 15708 51338 47424 44243 62691 15630 41373 14725 34483
  9141 48067 10942 13010 44634 40143]`"]
        old_pos["`old customer position key:<br/>[31013 31896 54147 16417 26108 58661 44725 53340 22229]`"]
        new_pos["`new customer position key:<br/>[26845 24321 52293 19187 29228 61277 32841 51235 34682]`"]
        xor1(("XOR"))
        xor2(("XOR"))
        xor_prop["`xor property key:<br/>[22205 23370 34288  9214 46974  1405 28426 47182 12753  9074 36930 21779
 24387 60453 48028 55774 65518 47000 52420  2470 56063 34392 26040 52594
 49089  6827 11204 61121 22105  4723 27332 57960  5251 24598 61853  4699
 22563 15374 64050 28549 44054  6687 12484 23816 29679 11976 24707   350
 14658 43258  9077 34905 38942 37214]`"]
        xor_pos["`xor position key:<br/>[ 4600  9113  8134  2770  6096  2680 12028  6271 53679]`"]
        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/>[15348 25802  2932 35759 37505  7088  5681 24341 39057]`"]
                old_user_prop["`property key:<br/>[ 6859 23873 43509 63326 38209  4681  6549 58196 20386 45543  7213 10665
 59595 37675 38733 28230 18106 11839   217 58358 45503  9119 13711 47091
  2477  4601 12968 25412 57571  1504 36875 36008 22596 65108 20334 57220
 57449  9749 48916 23941 16493 45581 22735  8888 45253 44959 47418 52406
 38448 31290 22494 51292 26944 44318]`"]
                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/>[21289 15307 50993 49500 57517 62701 38520 38710  8171]`"]
                inter_user_prop["`property key:<br/>[19574  1547 11269 54432  8767  5940 30367 23322 32371 37525 35951 31930
 46984 32526 11473 47000 47444 39335 52253 59984 27456 42439 20535 31361
 46700  2898  6508 36229 46778  6035 64207 28352 19655 40514 48883 52703
 47178  6683 17702 12800 60539 43026 26635 32688 49962 33111 55737 52712
 44914 53952 29867 16389 61790 15424]`"]
                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/>[65323 43160 15313 31589 56469 63324 16779 58877 46813]`"]
            new_user_prop["`property key:<br/>[ 4877   339  2263  7952   818 48661 46131 56267 23637 56219 31553  4783
 17734 11957 16009  8164 58199 21329 25805 42484 63685 33425  4845 26086
 45993 37895 46700 19583 28941 36895 52143 15209 11188   569 60851 63329
 33273 55731  2564 42007 14482 45812 39063 18143 15261 56200 36966  9873
 43332 61052 51872 65507 42946 33203]`"]
            new_renew["renew: False"]
        end
        login --> new_user
    end