Skip to content

Commit

Permalink
Feature/41 major imporvement (#44)
Browse files Browse the repository at this point in the history
* Fix encrypt and decrypt files with general improvement (reported by and thanks to @TK-SMF) #41
Tom Kersting
* unit test refactoring, adding cli examples refactoring, adding file test
* Fix cross-system compatibility
* Update documentation and add code coverage
---------
Co-authored-by: Maytham Fahmi <maythamfahmi@nextbix.dk>
  • Loading branch information
maythamfahmi committed Aug 15, 2023
1 parent 0b7ec83 commit c0c3240
Show file tree
Hide file tree
Showing 24 changed files with 660 additions and 518 deletions.
2 changes: 2 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,5 @@ jobs:
run: dotnet test --configuration Release --no-build
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v3
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
19 changes: 17 additions & 2 deletions CryptoNet.Cli/CryptoNet.Cli.csproj
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
Expand All @@ -11,4 +11,19 @@
<ProjectReference Include="..\CryptoNet\CryptoNet.csproj" />
</ItemGroup>

<ItemGroup>
<None Update="TestFiles\test.docx">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="TestFiles\test.pdf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="TestFiles\test.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="TestFiles\test.xlsx">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>

</Project>
170 changes: 93 additions & 77 deletions CryptoNet.Cli/ExampleAes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,111 +9,127 @@
using System.Security.Cryptography;
using System.Text;
using CryptoNet.Models;
using CryptoNet.Utils;

namespace CryptoNet.Cli;

public class ExampleAes
namespace CryptoNet.Cli
{
private const string ConfidentialDummyData = @"Some Secret Data";

private static readonly string BaseFolder = AppDomain.CurrentDomain.BaseDirectory;
private static readonly string SymmetricKeyFile = Path.Combine(BaseFolder, $"{KeyType.SymmetricKey}.xml");

public static void Test()
public class ExampleAes
{
Example_1_Encrypt_Decrypt_Content_With_SelfGenerated_SymmetricKey();
Example_2_SelfGenerated_And_Save_SymmetricKey();
Example_3_Encrypt_Decrypt_Content_With_Own_SymmetricKey();
Example_4_Encrypt_Decrypt_Content_With_Human_Readable_Key_Secret_SymmetricKey();
}
protected ExampleAes() { }

public static void Example_1_Encrypt_Decrypt_Content_With_SelfGenerated_SymmetricKey()
{
ICryptoNet cryptoNet = new CryptoNetAes();
var key = cryptoNet.ExportKey();
private const string ConfidentialDummyData = @"Some Secret Data";

ICryptoNet encryptClient = new CryptoNetAes(key);
var encrypt = encryptClient.EncryptFromString(ConfidentialDummyData);
private static readonly string BaseFolder = AppDomain.CurrentDomain.BaseDirectory;
private readonly static string SymmetricKeyFile = Path.Combine(BaseFolder, $"{KeyType.SymmetricKey}.xml");

ICryptoNet decryptClient = new CryptoNetAes(key);
var decrypt = decryptClient.DecryptToString(encrypt);
public static void Example_1_Encrypt_Decrypt_Content_With_SelfGenerated_SymmetricKey()
{
ICryptoNet cryptoNet = new CryptoNetAes();
var key = cryptoNet.ExportKey();

Debug.Assert(ConfidentialDummyData == decrypt);
}
ICryptoNet encryptClient = new CryptoNetAes(key);
var encrypt = encryptClient.EncryptFromString(ConfidentialDummyData);

public static void Example_2_SelfGenerated_And_Save_SymmetricKey()
{
ICryptoNet cryptoNet = new CryptoNetAes();
var file = new FileInfo(SymmetricKeyFile);
cryptoNet.ExportKeyAndSave(file);
ICryptoNet decryptClient = new CryptoNetAes(key);
var decrypt = decryptClient.DecryptToString(encrypt);

Debug.Assert(File.Exists(file.FullName));
Debug.Assert(ConfidentialDummyData == decrypt);
}

var encrypt = cryptoNet.EncryptFromString(ConfidentialDummyData);

ICryptoNet cryptoNetKeyImport = new CryptoNetAes(file);
var decrypt = cryptoNetKeyImport.DecryptToString(encrypt);
public static void Example_2_SelfGenerated_And_Save_SymmetricKey()
{
ICryptoNet cryptoNet = new CryptoNetAes();
var file = new FileInfo(SymmetricKeyFile);
cryptoNet.ExportKeyAndSave(file);

Debug.Assert(ConfidentialDummyData == decrypt);
}
Debug.Assert(File.Exists(file.FullName));

public static void Example_3_Encrypt_Decrypt_Content_With_Own_SymmetricKey()
{
var symmetricKey = "12345678901234567890123456789012";
if (symmetricKey.Length != 32)
{
Console.WriteLine("key should be 32 character long");
Environment.Exit(0);
var encrypt = cryptoNet.EncryptFromString(ConfidentialDummyData);

ICryptoNet cryptoNetKeyImport = new CryptoNetAes(file);
var decrypt = cryptoNetKeyImport.DecryptToString(encrypt);

Debug.Assert(ConfidentialDummyData == decrypt);
}

var secret = "1234567890123456";
if (secret.Length != 16)
public static void Example_3_Encrypt_Decrypt_Content_With_Own_SymmetricKey()
{
Console.WriteLine("key should be 16 character long");
Environment.Exit(1);
var symmetricKey = "12345678901234567890123456789012";
if (symmetricKey.Length != 32)
{
Console.WriteLine("key should be 32 character long");
Environment.Exit(0);
}

var secret = "1234567890123456";
if (secret.Length != 16)
{
Console.WriteLine("key should be 16 character long");
Environment.Exit(1);
}

var key = Encoding.UTF8.GetBytes(symmetricKey);
var iv = Encoding.UTF8.GetBytes(secret);

ICryptoNet encryptClient = new CryptoNetAes(key, iv);
var encrypt = encryptClient.EncryptFromString(ConfidentialDummyData);

ICryptoNet decryptClient = new CryptoNetAes(key, iv);
var decrypt = decryptClient.DecryptToString(encrypt);

Debug.Assert(ConfidentialDummyData == decrypt);
}

var key = Encoding.UTF8.GetBytes(symmetricKey);
var iv = Encoding.UTF8.GetBytes(secret);
public static void Example_4_Encrypt_Decrypt_Content_With_Human_Readable_Key_Secret_SymmetricKey()
{
var symmetricKey = UniqueKeyGenerator("symmetricKey");
var secret = new string(UniqueKeyGenerator("password").Take(16).ToArray());

ICryptoNet encryptClient = new CryptoNetAes(key, iv);
var encrypt = encryptClient.EncryptFromString(ConfidentialDummyData);
var key = Encoding.UTF8.GetBytes(symmetricKey);
var iv = Encoding.UTF8.GetBytes(secret);

ICryptoNet decryptClient = new CryptoNetAes(key, iv);
var decrypt = decryptClient.DecryptToString(encrypt);
ICryptoNet encryptClient = new CryptoNetAes(key, iv);
var encrypt = encryptClient.EncryptFromString(ConfidentialDummyData);

Debug.Assert(ConfidentialDummyData == decrypt);
}
ICryptoNet decryptClient = new CryptoNetAes(key, iv);
var decrypt = decryptClient.DecryptToString(encrypt);

public static void Example_4_Encrypt_Decrypt_Content_With_Human_Readable_Key_Secret_SymmetricKey()
{
var symmetricKey = UniqueKeyGenerator("symmetricKey");
var secret = new string(UniqueKeyGenerator("password").Take(16).ToArray());
Debug.Assert(ConfidentialDummyData == decrypt);
}

var key = Encoding.UTF8.GetBytes(symmetricKey);
var iv = Encoding.UTF8.GetBytes(secret);
public static void Example_5_Encrypt_And_Decrypt_PdfFile_With_SymmetricKey_Test(string filename)
{
ICryptoNet cryptoNet = new CryptoNetAes();
var key = cryptoNet.ExportKey();

ICryptoNet encryptClient = new CryptoNetAes(key, iv);
var encrypt = encryptClient.EncryptFromString(ConfidentialDummyData);
FileInfo fi = new FileInfo(filename);

ICryptoNet decryptClient = new CryptoNetAes(key, iv);
var decrypt = decryptClient.DecryptToString(encrypt);
ICryptoNet encryptClient = new CryptoNetAes(key);
string pdfFilePath = Path.Combine(BaseFolder, filename);
byte[] pdfFileBytes = File.ReadAllBytes(pdfFilePath);
var encrypt = encryptClient.EncryptFromBytes(pdfFileBytes);

Debug.Assert(ConfidentialDummyData == decrypt);
}
ICryptoNet decryptClient = new CryptoNetAes(key);
var decrypt = decryptClient.DecryptToBytes(encrypt);
string pdfDecryptedFilePath = $"TestFiles\\{Path.GetFileNameWithoutExtension(fi.Name)}-decrypted.{fi.Extension}";
File.WriteAllBytes(pdfDecryptedFilePath, decrypt);

public static string UniqueKeyGenerator(string input)
{
MD5 md5 = MD5.Create();
byte[] inputBytes = Encoding.ASCII.GetBytes(input);
byte[] hash = md5.ComputeHash(inputBytes);
var isIdenticalFile = CryptoNetUtils.ByteArrayCompare(pdfFileBytes, decrypt);
Debug.Assert(isIdenticalFile);
}

StringBuilder sb = new StringBuilder();
foreach (var t in hash)
public static string UniqueKeyGenerator(string input)
{
sb.Append(t.ToString("X2"));
byte[] inputBytes = Encoding.ASCII.GetBytes(input);
byte[] hash = MD5.HashData(inputBytes);

StringBuilder sb = new StringBuilder();
foreach (var t in hash)
{
sb.Append(t.ToString("X2"));
}
return sb.ToString();
}
return sb.ToString();
}

}
}

0 comments on commit c0c3240

Please sign in to comment.