Code/Obfuscation/Obfuscation.cs
using System;
using System.Runtime.CompilerServices;
namespace SandbankDatabase;
static class Obfuscation
{
[MethodImpl( MethodImplOptions.AggressiveInlining )]
private static int[] GenerateShiftMask()
{
int[] result = new int[32];
for ( int i = 0; i < 32; i++ )
result[i] = Random.Shared.Next( 256 );
return result;
}
[MethodImpl( MethodImplOptions.AggressiveInlining )]
public static string ObfuscateFileText( string originalText )
{
var textArray = originalText.ToCharArray();
var shiftMask = GenerateShiftMask();
var maskN = 0;
for ( int i = 0; i < textArray.Length; i++ )
{
textArray[i] = (char)(textArray[i] + shiftMask[maskN]);
if ( textArray[i] > char.MaxValue )
textArray[i] = (char)(textArray[i] - char.MaxValue);
maskN = (maskN + 1) % 32;
}
return $"OBFS|{string.Join( '-', shiftMask )}|{new string( textArray )}";
}
[MethodImpl( MethodImplOptions.AggressiveInlining )]
public static string UnobfuscateFileText( string obfuscatedText )
{
var maskStart = obfuscatedText.IndexOf( '|' ) + 1;
var maskEnd = obfuscatedText.IndexOf( '|', maskStart ) - 1;
var mask = obfuscatedText.Substring( maskStart, maskEnd - maskStart + 1 );
var maskParts = mask.Split( '-' );
var shiftMask = new int[32];
for ( int i = 0; i < 32; i++ )
shiftMask[i] = int.Parse( maskParts[i] );
var textArray = obfuscatedText.ToCharArray().AsSpan();
var maskN = 0;
for ( int c = maskEnd + 2; c < textArray.Length; c++ )
{
textArray[c] = (char)(textArray[c] - shiftMask[maskN]);
if ( textArray[c] < 0 )
textArray[c] = (char)(textArray[c] + char.MaxValue);
maskN = (maskN + 1) % 32;
}
return new string( textArray.Slice( maskEnd + 2 ) );
}
}