feat: Improved data obfuscation

This commit is contained in:
Tibo De Peuter 2025-11-11 20:23:56 +01:00
parent 5b01a34c78
commit abb296ac11
Signed by: tdpeuter
GPG key ID: 38297DE43F75FFE2
3 changed files with 98 additions and 5 deletions

View file

@ -620,30 +620,49 @@
<!-- </ol>-->
</footer>
<script>
import ('/src/lib/crypto.js').then(module => {
window.decode = module.decode;
});
function reveal() {
const locationHref = atob("aHR0cHM6Ly93d3cub3BlbnN0cmVldG1hcC5vcmcvcmVsYXRpb24vMTMzNTEwMA==");
const locationText = atob("TG9jaHJpc3RpIDkwODAsIEJlbGdp6w==");
const locationHrefCode = "NHtnf0QfKwd3KAFJD2BSJiAaIydZXStKIwZgGAYKDBg5Pk9RJiJMXC0yIR8KBhUwAncSFmsGbxMHBg4eHx8aXXhUPwZoYxNeFXM1EgRPclg2DTkFIClMXQsIA2Yee3ptOAxPBgEtWwYVLClddjE5Gwp4A1N1fQc/Oy4mTWQdECYyOBx/GHVzKl8/HgVoFVo6aW0ILAR0X0sCHAIkby0kDW4zImYDVlMSDH4uOj4ROHwVfwo/EWFwIjwNMlxvEzUvBCoWBXUaeXttLlU6Kw1DAyI/AgBkHRoXHTlVMntZdgtYTksHbXVSAj8PFgpNMSs4TGIkQ2AgFRxqP3soMBgkMU4ySXhZV0JJYVdrK2FtSWpYelI1WWs0dldtQWxmblVrS1hOSWF6MDVNMTQvZUdWSFZUMW5ZWEkvYzMxU2FGQXNQbHB0WmwxK2NVbFJjaTFnZTBoRlFnPT0=";
const locationHrefMask = "VTM1TydXZjE7UTh6a1MxU0IpYUs7M2V6QGs2dGJNPXBafXonRU8vKk5fd2xTXkdAYEUmYCZSImlJUktpUltPay0uU08xUSMnWyZdV04hPDJsYUldcUUjMl1yQSV6LUtVaU92VVhXY3Fwb2c6Jl9sYltKVis7TkZXXUBCJTAtc01qe3NJSjY1Wz1nckMwbG5DMDhnVVY3L35ndmZqI0dhdD9Ze1VaZDA9QCtNQGlESD9COG5pSDlBel9nSiw6VHtuYVBAQixfSCE1aWB5Zls0M2xSM2MudGJneWo9UDdoTjw9fX5jJzExLWVKfnMuckRNLzFXKS13fXsnfDFgaXNiRg==";
const locationHref = decode(locationHrefCode, locationHrefMask, 46);
const locationTextCode = "bQIeUgAlaTBEXGkafD1MNz8wDDNraHRQJyFcKC4dWUYWHBYaOCsqDGoiB1BBKjQkFyovTggUHEAtAhhPC2Z7fCRGWjENOnEbFx86ATA9Iy0BewIFclJCBgM4fFs+BG81AQUgHBh3WCMKJQQ8ATgTUHhfcyEmE2x9XFBtD3IsIBc5HzMZdRMCBHM7dy0WEzwjEhVQbRFle0Z8YUl7EhUWLmUELhl6KGBpKARFBQMtJwwbPl11KHgNKUgRPwcNW3cdIhMjAwARKUU1S1dHKRY4c3NyRXIEP0pbaFYhXDgKAEYlLik7GgRScjpPDS0yNgsEBSRzADI1HDBiRA4xAicQAlZGMUpNVzlzSjFJa1pHaFBYalZnUUd0TVRFMDNha0VoTkdVaVdYMVVUM0JWV0Y1Zk0xMUtRUzVvSjJwN01ERW9NVXdyU1hSZlczSkJXRHcvYVdKUmZRPT0=";
const locationTextMask = "OUUnOGFtI0AnbztqNXknQHB0TUAiLT48RWY4WEpKaStaWideYFFCSzlxMnsnYlNXdG1iOF15dCF7bEklX1dOLEV1bltUbidUXi5wc1JWcUxXIzNJJjwqT1pCMmtkNVZUU1NlLUgjYFBbT2B+ZVMiIjMxJVNwSy4nPWA/bSR0UGBtdlxrOSJMRiJ+Tl9YV0xEcyQ0NUk2SjMqUXgxWydyRT1Qdy0wfVVZeUdwN2ZBZT1NeDlFSy88YS59aWhcNyEsQ2pPbkojUXV7MTg1eGxXWCM1IkdUeiVuOThvNlpCaC9peEFKT1NjKHV9QFR7WG9QU2dLempeXUg0L3ZmYE5aVA==";
const locationText = decode(locationTextCode, locationTextMask, 23);
const locationLink = document.querySelector('#location');
if (locationLink) {
locationLink.href = locationHref;
locationLink.textContent = locationText;
}
const birthYear = atob("MjAwMw==");
const birthYearCode = "ezEuMW59TwYcFw5APH50EiltRxYsJT0uKWMKYWciDAMbPQQ6EzVnMWEvOCUvBDohPxYwPQJmMDMiHTB6CmMFDiRjUV5pFDYFGyZ2DAdrHW4uEU1PfQBAD2QYXGQDcU0nOUchBxdrEhVVHy8MZEEqVCItJQ0wcRFCMitpGmsIeBtrPC4qL08eFGFkFENEei4gRi8lDXxnWRICegYiCRdRQX4yByoyMXlzNHExcCMlSgsJNQNiYEEbbiEZQhYeCHMsYhUbDmIMRXAIcCp0KRxmPi54EF5vPQc8BjAKXhMnJB82FUYACTUnUyM3EwwWQ3EJHRMLb2B6FhhvRhsaTSgFCFNTczZYWFZ0ZFVwRmNqVlFSMEloTG50bFpXMTJVWGNqTkRrd09GcFRaVmg3S0h3cFNHeFBYRFI5VWw5TVBTOHZjVDEwUUNkcktHWnBibmQwWUNabUxRPT0=";
const birthYearMask = "NltvRiNNI1VQQV93bysme3NeI3NhfUlZSDdMKjF2QnVCREpscU81Ui5Fdld2N2hIblJ6TktWfndARWVJRitmOUY0aWk/UlFyT1xHR1YuSydNWTolK0Y4WDZiaVVUQipUcyxFXkMtUCYzWn54PnFZIXZ6b0BpMml0ZmM4aDNMTHYiaFZgeCIreC88cHMlSHhIJEVWNCs/IUFjS2pzQiZlMSlIM1N+SDRcfkN7NHpcc3haXlk7MSpROkJcIWRGTj1LO3lefjFZNUJqJ2g5Zy0jRmM9ZG0/REl5ZUp9K3JiSEd4Rnd2QkxUK2hhRTVfLkl8fiFdPDMyel4iLGwpLHtfUg==";
const birthYear = decode(birthYearCode, birthYearMask, 4);
const birthdayElement = document.querySelector('#birthday');
if (birthdayElement) {
birthdayElement.textContent = birthYear;
birthdayElement.setAttribute('datetime', birthYear);
}
const emailAddress = atob("dGlib0BkZXBldXRlci5kZXY=");
const emailAddressCode = "KCsbPg5XalgSGDcbHiAuG11HB0QfOWREMnljRwZgFSMPE1oaXX4QCisbRB8iICYZcyM3DQUkKjEoKyYyGiErBW5VVX4CVhwjbBkgBQkqPlppYAlZZg8+FTQ8HmtRECc1Pw1jMHRxJRYGDk0fZBx8LVVZP3UnOCRZB21iWl86DF1wfA00UhINagcschc4Cgk0ESAMEDV5aGZaTlQnfgJhMmkvcD9Rc2IcNksHCREwCEtEVhJGfWtsQnJOQwwRBE0RPj9vZxwXYD4KETpZGR9HVjsREg4pAGA5PEEhfQk3EStmPQgQDjJ+KXVsPz0rG0JeYysAXCgJfGNvUVxKM1YgS2ZuQWhNMGx2V0VwY0xHTjRmRGRzUW5OQlNFOTROanRkZGx0elBTOGtMbUJLVmtzb0lUQmRXSGR6ZkRkb1IxMWtQaThsZUdzbGNXNHJQRzVMT1U0dE5RPT0=";
const emailAddressMask = "TGx3V2xnKDNIQHV3enh8dz4uMi9FYT58ZEsldkhSR2RYVSpDOz0pRnMpcVRoTXdrOHdPRFZPZFt7RUJGQnJyMDplMk9LZHBXO09tc1lscDUmNk8vL1xOUHppVC00fU92dnc2SC4nVX5XWilUKFglXTcydSZpfU80Yj43aTxUOTg/KUBaN0d1W0tAR0dicE99cGZOZ1c/WVE/NG1zJ24sQSZnOUw3NjMrfXlvMV53SSYhP1dwLCxVOzgkK3pYNClYa3tfUkhANU9AR1EwTHJ+ZHBUIzlPVDZPbS9ZL1N0W00seEJkWnYwWDw5R298cHdsKHNVNn1wTFU4OG0tZzxHeQ==";
const emailAddress = decode(emailAddressCode, emailAddressMask, 17);
const emailElement = document.querySelector('#email');
if (emailElement) {
emailElement.href = `mailto:${emailAddress}`;
emailElement.textContent = emailAddress;
}
const phoneNumber = atob("KzMyNDg3NjU2OTc1");
const phoneNumberCode = "IigvOgkNQx4hUDBVIRIsRgA9OgtrfR5HDDILNGNkEh9oGWRaGFpeMUADVksueTcVWwNgOxYmOio3FH07JypgGyd0LShDCnAFHlNbUSRcDmkuUU4HcQk2bwdAfR5sCwgrZGYScycJYGINDgp/ZSYuGhhFLF18MGZcKDlgGyMcZxkgIiNjezsJIAJCNFF/Mxg6CFwuaHoEVh8gAW8xdGcwdAlEJlctDykTYzkxB3V6KxMcYltkAHokDDkwRl4pQGUFHSJ1cztNLhUeEz8MCk8PEA0UTFA7NWssCVILcRMgR3UtOCM0B2NeTRZiEDZ0AT4DNU4lXCxaKQ0PZxgKLhE4WlgyRW5MSGd6UFhKNVNVNDhNVEZyV3lsZlQweE5KaWs4VlQxZUxXWmpNVVFyYkRGM0lVVjBSRHcyYkRnMFNYNTBPMTlnUFZoWFAzeFVmSGxPYmxaMVl3PT0=";
const phoneNumberMask = "aVJiQ0dJJC1vOmVnbkZPd0poVk84Tk9+amVnbTkwW2slXS4qU2omdSVQJT57SkMnPWlZTkxIeHt5UkhMdkYyWGtFXkEncDI0SmI3YUBtRCZPYCk0KEF7REwuSFomYmRSLyJAKkNkKVBURj87K0pefFIvW2UvXTAyTm8iS2lLVmpwS1RRIXM4elsodT41d2BpRzBnUSs1Oi1FVD1lOFdmIVwpZCdPYl11KUNnVTkpR0JMJ243TS5mY3RdKSlIcydkSkwvMHF+XXx8RHl8R302aFVDI2dpTyl1RitBNl5MIzl+bHFVTCRrKnc1QUA/VGQoejRGM31qeGNuL2h+Z0l6Yw==";
const phoneNumber = decode(phoneNumberCode, phoneNumberMask, 12);
const phoneElement = document.querySelector('#phone');
if (phoneElement) {
phoneElement.href = `tel:${phoneNumber}`;

49
src/lib/crypto.js Normal file
View file

@ -0,0 +1,49 @@
function generateRandomCharacters(length) {
const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' +
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'; // All printable characters
let result = '';
for (let i = 0; i < length; i++) {
const randomIndex = Math.floor(Math.random() * characters.length);
result += characters[randomIndex];
}
return result;
}
export function encode(input, paddedInputLength=256) {
const paddedInput = input + generateRandomCharacters(paddedInputLength - input.length);
const encoded = btoa(paddedInput);
const mask = generateRandomCharacters(paddedInputLength);
// Take the XOR of encoded and mask
let maskedEncoded = '';
for (let i = 0; i < encoded.length; i++) {
const charCodeEncoded = encoded.charCodeAt(i);
const charCodeMask = mask.charCodeAt(i);
const maskedCharCode = charCodeEncoded ^ charCodeMask;
maskedEncoded += String.fromCharCode(maskedCharCode);
}
const maskEncoded = btoa(mask);
const finalEncoded = btoa(maskedEncoded);
return [finalEncoded, maskEncoded];
}
export function decode(finalEncoded, maskEncoded, length) {
const mask = atob(maskEncoded);
const maskedEncoded = atob(finalEncoded);
let encoded = '';
for (let i = 0; i < maskedEncoded.length; i++) {
const charCodeMasked = maskedEncoded.charCodeAt(i);
const charCodeMask = mask.charCodeAt(i);
const originalCharCode = charCodeMasked ^ charCodeMask;
encoded += String.fromCharCode(originalCharCode);
}
const paddedInput = atob(encoded);
return paddedInput.slice(0, length);
}

25
src/obfuscator.js Normal file
View file

@ -0,0 +1,25 @@
import assert from 'assert';
import { encode, decode } from './lib/crypto.js';
const inputs = [];
process.stdin.on('data', (data) => {
const userInput = data.toString().trim();
if (userInput.length === 0) {
inputs.forEach(input => {
const [encoded, mask] = encode(input);
assert(decode(encoded, mask, input.length) === input, 'Decoded value does not match original input');
console.log(`Input: ${input}`);
console.log(`Encoded: ${encoded}`);
console.log(`Mask: ${mask}`);
console.log(`Length: ${input.length}`);
});
process.exit(0);
}
inputs.push(userInput);
console.log(inputs);
});