Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 9 additions & 5 deletions NuciText.Obfuscation.UnitTests/NuciTextObfuscatorTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ public class NuciTextObfuscatorTests
static int TestSeed => 123456789;
static string TestPlainString => "Test string!";
static string TestObfuscatedString => "ꓔеst strіng!";
static NuciTextObfuscatorOptions TestObfuscatorOptions => new()
{
UseApproximateReplacements = true
};

INuciTextObfuscator obfuscator;

Expand All @@ -22,38 +26,38 @@ public void GivenAnEmptyString_WhenDebfuscating_ThenTheResultIsEmpty()

[Test]
public void GivenAnEmptyString_WhenObfuscating_ThenTheResultIsEmpty()
=> Assert.That(obfuscator.Obfuscate(string.Empty), Is.Empty);
=> Assert.That(obfuscator.Obfuscate(string.Empty, TestObfuscatorOptions), Is.Empty);

[Test]
public void GivenANullString_WhenDeobfuscating_ThenTheResultIsNull()
=> Assert.That(obfuscator.Deobfuscate(null), Is.Null);

[Test]
public void GivenANullString_WhenObfuscating_ThenTheResultIsNull()
=> Assert.That(obfuscator.Obfuscate(null), Is.Null);
=> Assert.That(obfuscator.Obfuscate(null, TestObfuscatorOptions), Is.Null);

[Test]
public void GivenAValidString_WhenDeobfuscating_ThenTheResultIsNotNull()
=> Assert.That(obfuscator.Deobfuscate(TestObfuscatedString), Is.Not.Null);

[Test]
public void GivenAValidString_WhenObfuscating_ThenTheResultIsNotNull()
=> Assert.That(obfuscator.Obfuscate(TestPlainString), Is.Not.Null);
=> Assert.That(obfuscator.Obfuscate(TestPlainString, TestObfuscatorOptions), Is.Not.Null);

[Test]
public void GivenAValidString_WhenDeobfuscating_ThenTheResultIsNotEmpty()
=> Assert.That(obfuscator.Deobfuscate(TestObfuscatedString), Is.Not.Empty);

[Test]
public void GivenAValidString_WhenObfuscating_ThenTheResultIsNotEmpty()
=> Assert.That(obfuscator.Obfuscate(TestPlainString), Is.Not.Empty);
=> Assert.That(obfuscator.Obfuscate(TestPlainString, TestObfuscatorOptions), Is.Not.Empty);

[Test]
public void GivenAValidString_WhenDeobfuscating_ThenTheResultHasBeenDeobfuscated()
=> Assert.That(obfuscator.Deobfuscate(TestObfuscatedString), Is.EqualTo(TestPlainString));

[Test]
public void GivenAValidString_WhenObfuscating_ThenTheResultHasBeenObfuscated()
=> Assert.That(obfuscator.Obfuscate(TestPlainString), Is.EqualTo(TestObfuscatedString));
=> Assert.That(obfuscator.Obfuscate(TestPlainString, TestObfuscatorOptions), Is.EqualTo(TestObfuscatedString));
}
}
2 changes: 2 additions & 0 deletions NuciText.Obfuscation/INuciText.Obfuscation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,7 @@ public interface INuciTextObfuscator
string Deobfuscate(string text);

string Obfuscate(string text);

string Obfuscate(string text, NuciTextObfuscatorOptions options);
}
}
37 changes: 24 additions & 13 deletions NuciText.Obfuscation/NuciText.Obfuscation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,7 @@ public string Deobfuscate(string text)
}
}

StringBuilder builder = new StringBuilder(input.Length);
StringBuilder builder = new(input.Length);

foreach (char character in input)
{
Expand Down Expand Up @@ -258,6 +258,9 @@ public string Deobfuscate(string text)
}

public string Obfuscate(string text)
=> Obfuscate(text, new NuciTextObfuscatorOptions());

public string Obfuscate(string text, NuciTextObfuscatorOptions options)
{
if (text is null)
{
Expand All @@ -269,6 +272,8 @@ public string Obfuscate(string text)
return string.Empty;
}

options ??= new NuciTextObfuscatorOptions();

string input = text;

foreach (KeyValuePair<string, string> entry in IdenticalGroupReplacements)
Expand All @@ -287,20 +292,23 @@ public string Obfuscate(string text)
input = input.Replace(group, replacement);
}

foreach (KeyValuePair<string, string> entry in ApproximateGroupReplacements)
if (options.UseApproximateReplacements)
{
string group = entry.Key;
string candidates = entry.Value;
foreach (KeyValuePair<string, string> entry in ApproximateGroupReplacements)
{
string group = entry.Key;
string candidates = entry.Value;

string replacement = group;
string replacement = group;

if (RandomGenerator.Next(1, 11) <= 6 && candidates.Length > 0)
{
int index = RandomGenerator.Next(candidates.Length);
replacement = candidates[index].ToString();
}
if (RandomGenerator.Next(1, 11) <= 6 && candidates.Length > 0)
{
int index = RandomGenerator.Next(candidates.Length);
replacement = candidates[index].ToString();
}

input = input.Replace(group, replacement);
input = input.Replace(group, replacement);
}
}

StringBuilder builder = new(input.Length);
Expand All @@ -316,9 +324,12 @@ public string Obfuscate(string text)
candidatesBuilder.Append(IdenticalReplacements[character]);
}

if (ApproximateReplacements.ContainsKey(character))
if (options.UseApproximateReplacements)
{
candidatesBuilder.Append(ApproximateReplacements[character]);
if (ApproximateReplacements.ContainsKey(character))
{
candidatesBuilder.Append(ApproximateReplacements[character]);
}
}

string candidates = candidatesBuilder.ToString();
Expand Down
7 changes: 7 additions & 0 deletions NuciText.Obfuscation/NuciTextObfuscatorOptions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace NuciText.Obfuscation
{
public sealed class NuciTextObfuscatorOptions
{
public bool UseApproximateReplacements { get; set; } = false;
}
}