# ============================================================================== # DATA OBFUSCATOR - DE-IDENTIFICATION KEY (keymap.txt) # The secret that turns the masked dataset back into the original. # ============================================================================== # # !! CONFIDENTIAL - KEEP OFFLINE !! # Anyone who holds this file together with the masked dataset can undo the masking. # Never send it to an LLM, a vendor, a CRO or a collaborator, and do not paste it # into a chat. Share only the masked dataset (and llm.txt), never this file. # # Program : data-obfuscator 0.0.0.23 (released 2026-10-13) # Source dataset : pk_study.csv # Masked dataset : obfuscated.csv # Masked SHA-256 : 8b9336c3cc1b5be73df07d5bf8ffb4a0d37e5691b7b09b5a63b81103b432d035 # Masking level : 4 (maximum) # Random seed : 2026 # ID style : sequential # Per-value file : keymap_columns.txt (180 rows) - needed to reverse level 4 exactly; keep it with this file # # To undo the masking run: data-obfuscator reverse --input --keymap keymap.txt # # WHAT IS IN THIS FILE # 1. COLUMN RENAMING none (no column was renamed) # 2. NUMERIC SCALING 2 column(s) multiplied or divided # 3. DATE SHIFT 50.8 day(s) added to: DATE # 4. IDENTIFIER AND LABEL RECODING 57 value(s) in 9 column(s) # 5. COLUMN ORDER, NOT RESTORABLE 19 column(s) in order; 3 column(s) whose values are not stored # # HOW TO READ IT # - Lines that start with '#' are comments. Every other line is TAB-separated. # - Column names in sections 2-4 are the ORIGINAL names; section 1 shows what each # renamed column is called in the masked dataset. # - Using the same input, options and seed always gives this same key and the same # masked dataset (compare the SHA-256 above). # ============================================================================== # # ------------------------------------------------------------------------------ # 1. COLUMN RENAMING - column names that were changed in the masked dataset. # Format: renamed_columnoriginal namenew name # ------------------------------------------------------------------------------ # (no columns were renamed: see rename_columns / rename_except) # # ------------------------------------------------------------------------------ # 2. NUMERIC SCALING - every valid number in the column was multiplied or divided by the factor. # To restore the original: masked value divided by factor (multiply) or times factor (divide). # Variation 'none' (level 3): that one factor was used for every value, so the restore is exact. # Variation '+/-15%' (level 4): the factor is only the BASE; each value was multiplied or divided by # its own random factor within +/-15 % of the base. Those per-value factors are in keymap_columns.txt # (the 'reverse' command uses it); without that file a restore is only approximate (within about 15 %). # Blank, '.' and text cells are unchanged. # Format: columnoperationbase factorvalues changedvariation per value # (the column is listed under its ORIGINAL name; see section 1 for its new name) # ------------------------------------------------------------------------------ WT multiply 12.90867401536603 180 +/-15% AGE divide 5.670939852151072 180 +/-15% # # ------------------------------------------------------------------------------ # 3. DATE SHIFT - one random number of days (a decimal, e.g. 23.6) was ADDED to every date in the # date columns. It is the same for the whole dataset, so intervals between dates are preserved. # Date-times (date plus a time of day) and numeric day counts moved by the exact value; date-only # text dates moved by the whole days only (the fraction is dropped). To restore the originals, # subtract the same amount. Format: namedayscolumns # ------------------------------------------------------------------------------ date_shift_days 50.8 DATE date_shift_whole_days 50 DATE # # ------------------------------------------------------------------------------ # 4. IDENTIFIER AND LABEL RECODING - original value and what it became. # Format: columnoriginalmasked # ------------------------------------------------------------------------------ column original masked ARM Active 50mg ARM_A ARM Placebo ARM_B COUNTRY USA C001 COUNTRY CAN C002 COUNTRY GBR C003 ID 101 1 ID 110 10 ID 111 11 ID 112 12 ID 113 13 ID 114 14 ID 115 15 ID 116 16 ID 117 17 ID 118 18 ID 119 19 ID 102 2 ID 120 20 ID 103 3 ID 104 4 ID 105 5 ID 106 6 ID 107 7 ID 108 8 ID 109 9 INVESTIGATOR JSMITH USER001 INVESTIGATOR ALEE USER002 INVESTIGATOR MCHEN USER003 RACE ASIAN CAT001 RACE BLACK OR AFRICAN AMERICAN CAT002 RACE WHITE CAT003 SEX M 0 SEX F 1 SITEID 0142 SITE001 SITEID 0087 SITE002 SITEID 1103 SITE003 STUDYID ABC-PK-2024 STU001 USUBJID ABC-PK-2024-0142-0001 SUBJ001 USUBJID ABC-PK-2024-0087-0002 SUBJ002 USUBJID ABC-PK-2024-1103-0003 SUBJ003 USUBJID ABC-PK-2024-0142-0004 SUBJ004 USUBJID ABC-PK-2024-0087-0005 SUBJ005 USUBJID ABC-PK-2024-1103-0006 SUBJ006 USUBJID ABC-PK-2024-0142-0007 SUBJ007 USUBJID ABC-PK-2024-0087-0008 SUBJ008 USUBJID ABC-PK-2024-1103-0009 SUBJ009 USUBJID ABC-PK-2024-0142-0010 SUBJ010 USUBJID ABC-PK-2024-0087-0011 SUBJ011 USUBJID ABC-PK-2024-1103-0012 SUBJ012 USUBJID ABC-PK-2024-0142-0013 SUBJ013 USUBJID ABC-PK-2024-0087-0014 SUBJ014 USUBJID ABC-PK-2024-1103-0015 SUBJ015 USUBJID ABC-PK-2024-0142-0016 SUBJ016 USUBJID ABC-PK-2024-0087-0017 SUBJ017 USUBJID ABC-PK-2024-1103-0018 SUBJ018 USUBJID ABC-PK-2024-0142-0019 SUBJ019 USUBJID ABC-PK-2024-0087-0020 SUBJ020 # # ------------------------------------------------------------------------------ # 5. COLUMN ORDER, AND WHAT CANNOT BE RESTORED # column_order lists the columns in the order they were written to the masked dataset. # Format: column_orderpositionoriginal namename in the masked dataset # not_restorable lists columns whose original values are not stored in any file. # Format: not_restorableoriginal namewhy # ------------------------------------------------------------------------------ column_order 1 ID ID column_order 2 USUBJID USUBJID column_order 3 STUDYID STUDYID column_order 4 SITEID SITEID column_order 5 ARM ARM column_order 6 TIME TIME column_order 7 TAD TAD column_order 8 AMT AMT column_order 9 DV DV column_order 10 EVID EVID column_order 11 MDV MDV column_order 12 CMT CMT column_order 13 WT WT column_order 14 AGE AGE column_order 15 SEX SEX column_order 16 RACE RACE column_order 17 DATE DATE column_order 18 INVESTIGATOR INVESTIGATOR column_order 19 COUNTRY COUNTRY not_restorable COMMENT not in the masked dataset (dropped, or not listed in keep): its values are not stored not_restorable EMAIL not in the masked dataset (dropped, or not listed in keep): its values are not stored not_restorable SUBJINIT not in the masked dataset (dropped, or not listed in keep): its values are not stored