Managed .Net (.NET 8) compatible ChaCha20 cipher written in C#
Because I needed this for my personal project
Scott Bennett wrote C# implementation called ChaCha20-csharp, which works as base for my code. That is why the license is same for both projects
YOu can find OLD .NET Standard and .NET 6 compatible version from older branch
Either copy the CSChaCha20.cs to your project or use LibChaCha20 nuget package
Then do code like
using CSChaCha20;
byte[] mySimpleTextAsBytes = Encoding.ASCII.GetBytes("Plain text I want to encrypt");
// Do not use these key and nonce values in your own code!
byte[] key = new byte[32] { 142, 26, 14, 68, 43, 188, 234, 12, 73, 246, 252, 111, 8, 227, 57, 22, 168, 140, 41, 18, 91, 76, 181, 239, 95, 182, 248, 44, 165, 98, 34, 12 };
byte[] nonce = new byte[12] { 139, 164, 65, 213, 125, 108, 159, 118, 252, 180, 33, 88 };
uint counter = 1;
// Encrypt
ChaCha20 forEncrypting = new ChaCha20(key, nonce, counter);
byte[] encryptedContent = new byte[mySimpleTextAsBytes.Length];
forEncrypting.EncryptBytes(encryptedContent, mySimpleTextAsBytes);
// Decrypt
ChaCha20 forDecrypting = new ChaCha20(key, nonce, counter);
byte[] decryptedContent = new byte[encryptedContent.Length];
forDecrypting.DecryptBytes(decryptedContent, encryptedContent);
You can try out the code in .NET Fiddle
You can run test cases by moving to tests folder and running following command
dotnet test
You can run benchmarks (which compare this implementation to the original version) by moving to benchmarks folder and running following command
dotnet run -c Release
there are three different input sizes (64 bytes, 1024 bytes and 1 MiB) and comparisons are done between the original version (made by Scott Bennett) and this project
All the code is licensed under ISC License