Files
pynkode/docs/encipher_decipher_renew_nkode.md
2025-03-26 08:05:31 -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: [12683 37623 46427 24232 53244 25444 34138 18278 52542 17394 45705 57706 22403 60684 20477 13672 47069 29025 8419 8211 36163 21756 45607 31517 44312 19522 17814 41879 18325 2622 43956 30841 59391 52171 51029 44917 28846 25756 24212 4239 11940 31284 58701 7692 31504 25629 20378 35504 45861 59860 4819 52686 62304 58952]
  • position key: [29587 60364 47856 53105 61491 65374 34021 4048 33167]

User Cipher

  • property key: [14398 56125 29659 36184 61716 58844 42259 48679 36351 53209 63475 35295 1927 35139 48674 32220 3724 62784 11332 63262 61320 62990 59038 61659 31829 24135 49167 50519 23410 2470 22259 32544 30127 27527 18620 39840 105 31222 38444 37307 58991 39926 16285 42364 843 30922 30467 43324 13596 3432 28064 33665 35252 8733]
  • passcode key: [43892 51915 3968 29221 4 52573 20838 48052 39138 14671]
  • combined position key: [40967 35807 54041 52517 31281 56961 42242 11385 1018]
  • mask key: [57731 56088 1801 26915 40765 22438 9693 31860 17942 7993]

Combined Postion Key

block-beta
  columns 2
  user_pos["user position key:\n[24890  2120 45550 47291 61945 28551 49488 49734 20771]"]
  customer_pos["customer position key:\n[29587 60364 47856 53105 61491 65374 34021  4048 33167]"]
  space:2
  xor(("XOR")):2
  user_pos --> xor
  customer_pos --> xor
  space:2
  comb_pos["combined position key\n[40967 35807 54041 52517 31281 56961 42242 11385  1018]"]:2
  xor --> comb_pos

User Keypad

  • keypad:
  • user passcode indices: [12, 4, 51, 33]

nKode Cipher

Passcode Hash

block-beta
    columns 2
    cprop["customer_property_key\n[12683 37623 46427 24232 53244 25444 34138 18278 52542 17394 45705 57706
 22403 60684 20477 13672 47069 29025  8419  8211 36163 21756 45607 31517
 44312 19522 17814 41879 18325  2622 43956 30841 59391 52171 51029 44917
 28846 25756 24212  4239 11940 31284 58701  7692 31504 25629 20378 35504
 45861 59860  4819 52686 62304 58952]"]
    uprop["user_property_key\n[14398 56125 29659 36184 61716 58844 42259 48679 36351 53209 63475 35295
  1927 35139 48674 32220  3724 62784 11332 63262 61320 62990 59038 61659
 31829 24135 49167 50519 23410  2470 22259 32544 30127 27527 18620 39840
   105 31222 38444 37307 58991 39926 16285 42364   843 30922 30467 43324
 13596  3432 28064 33665 35252  8733]"]
    space:2
    xor1(("XOR")):2
    cprop --> xor1
    uprop --> xor1
    space:2
    prop["combined_property_key\n[32565 54767  5127 26787 61372  9024 10051 31192 36215 25953 63643  7907
 34275 49131 65253 35224 52025 49525 36214 22719 57589  6411 46986 50058
 38701   701 36150  6894 36770 58151 63226 62425  5898  2177  3529 29703
 30896 41755  9016 47283 14611 18887 54104 55155 32367  2577 31449 39233
 18953  7162 61412  6044 61623  4668]"]
    xor1 --> prop
    pass["user_passcode_indices\n[12, 4, 51, 33]"]
    space:2
    sel(("select\nproperties")):2
    pass --> sel
    prop --> sel
    space:2
    passcode["user passcode properties:\n[34275 61372  6044  2177]"]:2
    sel --> passcode
    space:2
    pad["zero pad to\nmax nkode length: 10"]:2
    passcode -->pad
    space:2
    paddedpasscode["padded passcode:\n[34275 61372  6044  2177     0     0     0     0     0     0]"]
    pad --> paddedpasscode
    passkey["passcode key:\n[43892 51915  3968 29221     4 52573 20838 48052 39138 14671]"]
    space:2
    xor2(("XOR")):2
    passkey --> xor2
    paddedpasscode --> xor2
    space:2
    cipheredpass["ciphered passcode:\n[11927  9591  6172 31396     4 52573 20838 48052 39138 14671]"]:2
    xor2 --> cipheredpass
    space:2
    hash(("hash")):2
    cipheredpass --> hash
    space:2
    cipheredhashed["hashed ciphered passcode:\n$2b$12$Jf48A5rmjkxb0II7CkuD8.Qg3GCuROgbS99pMbthC2gXt9szx9gmm"]:2
    hash --> cipheredhashed

Mask Encipher

block-beta
    columns 3
    passcode_idx["passcode indices:\n[12, 4, 51, 33]"]
    comb_pos["combined position key:\n[40967 35807 54041 52517 31281 56961 42242 11385  1018]"]
    cust_pos["customer position key:\n[29587 60364 47856 53105 61491 65374 34021  4048 33167]"]
    
    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, 4, 6, 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, 4, 6, 6, 3, 3, 7, 5, 0, 8]"]
    pad1 --> posidx
    space:1
    user_pos["user position key:\n[24890  2120 45550 47291 61945 28551 49488 49734 20771]"]
    xor1 --> user_pos
    
    space:4
    sel(("select positions"))
    user_pos --> sel
    posidx --> sel
    space:5
    passcode_pos["ordered user passcode positions:\n[47291 61945 49488 49488 47291 47291 49734 28551 24890 20771]"]
    sel --> passcode_pos
    mask_key["mask key\n[57731 56088  1801 26915 40765 22438  9693 31860 17942  7993]"]
    space:4
    xor2(("XOR"))
    mask_key --> xor2
    passcode_pos --> xor2
    space:5
    mask["enciphered mask:\n [22840 10977 50777 43123 10118 61213 59291  5107 10028 19994]"]
    xor2 --> mask

Validate nKode

block-beta
    columns 3
    selected_keys["selected keys:\n[1, 0, 5, 0]"]
    login_keypad["login keypad:\nKey 0: [45 46 29 48  4 50 33 16 17]
Key 1: [18  1 20 12 49  5 15 34 44]
Key 2: [27 10 38  3 31 14 24  7 26]
Key 3: [ 0 37 11 39 22 23 42 52  8]
Key 4: [36 19  2 21 40 32  6 25 35]
Key 5: [ 9 28 47 30 13 41 51 43 53]
"]
    space:4
    
    selectkeys(("select keys"))
    mask["enciphered mask:\n [22840 10977 50777 43123 10118 61213 59291  5107 10028 19994]"]
    mask_key["mask key:\n[57731 56088  1801 26915 40765 22438  9693 31860 17942  7993]"]
    space:2
    
    xor1(("XOR"))
    mask --> xor1
    mask_key --> xor1
    selected_keys --> selectkeys
    login_keypad --> selectkeys
    space:3 
    
    ordered_keys["ordered keys:\n[[18  1 20 12 49  5 15 34 44]
 [45 46 29 48  4 50 33 16 17]
 [ 9 28 47 30 13 41 51 43 53]
 [45 46 29 48  4 50 33 16 17]]"]
    user_position_key["user position key:\n[24890  2120 45550 47291 61945 28551 49488 49734 20771]"]
    passcode_pos["ordered user passcode positions:\n[47291 61945 49488 49488 47291 47291 49734 28551 24890 20771]"]
    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, 4, 6, 6, 3, 3, 7, 5, 0, 8]"]
    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[12, 4, 51, 33]"]
    prop["combined_property_key\n[32565 54767  5127 26787 61372  9024 10051 31192 36215 25953 63643  7907
 34275 49131 65253 35224 52025 49525 36214 22719 57589  6411 46986 50058
 38701   701 36150  6894 36770 58151 63226 62425  5898  2177  3529 29703
 30896 41755  9016 47283 14611 18887 54104 55155 32367  2577 31449 39233
 18953  7162 61412  6044 61623  4668]"]
    cipheredhashed["hashed ciphered passcode:\n$2b$12$Jf48A5rmjkxb0II7CkuD8.Qg3GCuROgbS99pMbthC2gXt9szx9gmm"]
    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[34275 61372  6044  2177]"]
    sel --> passcode_prop
    space:5
    
    cipher(("encipher"))
    passcode_prop --> cipher
    space:5
    
    cipheredpass["ciphered passcode:\n[11927  9591  6172 31396     4 52573 20838 48052 39138 14671]"]
    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/>[18187  3794 26588 58875  7848 50844 33360 51199   136 43704  3944 38716
 33380 13992 16583 62532 50613 13365 41266 44961  3965 61189 20756 13137
 60280 23802 19769 57273 54480 60033 40969 36089 25253 25350 17781 61351
 30937 56045 46356 10504 57212 53809 60613 29199 32036 29403  3546 12413
 32533  5778 33348 37917 30979 12321]`"]
        new_prop["`new customer property key:<br/>[12683 37623 46427 24232 53244 25444 34138 18278 52542 17394 45705 57706
 22403 60684 20477 13672 47069 29025  8419  8211 36163 21756 45607 31517
 44312 19522 17814 41879 18325  2622 43956 30841 59391 52171 51029 44917
 28846 25756 24212  4239 11940 31284 58701  7692 31504 25629 20378 35504
 45861 59860  4819 52686 62304 58952]`"]
        old_pos["`old customer position key:<br/>[49469 33687 25335 30110 35784 45318 25682 60991 21209]`"]
        new_pos["`new customer position key:<br/>[29587 60364 47856 53105 61491 65374 34021  4048 33167]`"]
        xor1(("XOR"))
        xor2(("XOR"))
        xor_prop["`xor property key:<br/>[30336 39973 53895 47955 53588 42488  1802 32921 52662 59722 48609 30294
 54759 56228  3898 49452 29288 17748 33233 36786 33342 48121 58163 18508
 18016  4280  2223 31790 37701 57535  3005 62592 34138 43213 33312 16594
  2167 48753 60288 14727 61912 43013  2440 27651  1588  5830 16960 47821
 52272 65350 37015 22995 35427 54889]`"]
        xor_pos["`xor position key:<br/>[45742 26715 55303 47855 31739 20056 57527 57839 54102]`"]
        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/>[24890  2120 45550 47291 61945 28551 49488 49734 20771]`"]
                old_user_prop["`property key:<br/>[14398 56125 29659 36184 61716 58844 42259 48679 36351 53209 63475 35295
  1927 35139 48674 32220  3724 62784 11332 63262 61320 62990 59038 61659
 31829 24135 49167 50519 23410  2470 22259 32544 30127 27527 18620 39840
   105 31222 38444 37307 58991 39926 16285 42364   843 30922 30467 43324
 13596  3432 28064 33665 35252  8733]`"]
                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/>[ 4777 58244  2846 30666   458 37081 17845 52630 53420]`"]
                inter_user_prop["`property key:<br/>[20158 18200 41308 13835  8256 16420 41497 16062 16457  9875 18962 65417
 53856 21223 45336 48368 31972 45076 44437 30892 28086 19959  1453 47255
 14901 20223 51360 47481 51255 59673 23886 35744 61685 49994 51868 56178
  2078 51079 32172 43068  6071 13299 13845 51583  1407 28172 13635  5105
 63788 61998 64823 55890   983 62580]`"]
                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/>[37567 32382 36425  6535 11819 18071 35301 38878 29144]`"]
            new_user_prop["`property key:<br/>[63204 21530 24393 63295 52024 46102 24361 23381 41968  3713 26133 17989
 14193 46059 12280 45683 35436  9340 17577 37219 15797 39388 52148 29719
 48300 18038 25938 62757 21612 28454 23892 12945 18057 62761 37107 25062
 27001 30212 20943 35287 60202 25046 29690 64376 57055  1554 42998 36674
 45138 58609 25837 59944  8395 52185]`"]
            new_renew["renew: False"]
        end
        login --> new_user
    end