Skip to content

Instantly share code, notes, and snippets.

Avatar
🏠
Working from home

Adam White AdamWhiteHat

🏠
Working from home
View GitHub Profile
View IsValidIPv6Address.cs
public static bool IPv6Check(string input)
{
if (string.IsNullOrWhiteSpace(input))
{
return false;
}
if (input.IndexOf("::") != input.LastIndexOf("::")) // 'The "::" can only appear once in an address.'
{
return false;
@AdamWhiteHat
AdamWhiteHat / GenericArithmeticFactory.cs
Created Dec 22, 2020
Generic arithmetic operations with an example
View GenericArithmeticFactory.cs
public static class GenericArithmeticFactory<T>
{
private static Dictionary<ExpressionType, Func<T, T, T>> _binaryOperationDictionary;
private static Func<T, T> _sqrtOperation = null;
static GenericArithmeticFactory()
{
_binaryOperationDictionary = new Dictionary<ExpressionType, Func<T, T, T>>();
}
@AdamWhiteHat
AdamWhiteHat / FastFactorial.cs
Created Dec 22, 2020
A fast factorial implementation using the divide and conquer method.
View FastFactorial.cs
public static class FastFactorial
{
public static BigInteger Factorial(BigInteger n)
{
return MultiplyRange(2, n);
}
private static BigInteger MultiplyRange(BigInteger from, BigInteger to)
{
var diff = to - from;
@AdamWhiteHat
AdamWhiteHat / PasswordHashing.cs
Created Dec 22, 2020
Don't use SHA256 to hash your passwords! Hash passwords the correct way, using BCrypt.
View PasswordHashing.cs
/// <summary>
/// Requires the BCrypt nuget package. Available here: https://www.nuget.org/packages/BCrypt.Net-Next
/// </summary>
public static class PasswordHashing
{
public static string HashPassword(string password, int workFactor)
{
return BCrypt.Net.BCrypt.HashPassword(password, workFactor);
}
@AdamWhiteHat
AdamWhiteHat / NumberTheory.Maths.cs
Last active Dec 22, 2020
NumberTheory functions, including Legendre Symbol, Tonelli-Shanks, Chinese Remainder Theorem, Modular Multiplicative Inverse, Primitive Root, Multiplicative Order, Discrete Logarithm, Discrete Root, Eulers Totient Phi, Carmichael Lambda Function, LCM, and GCD.
View NumberTheory.Maths.cs
public static class Maths
{
/// <summary>
/// Legendre Symbol returns 1 for a (nonzero) quadratic residue mod p, -1 for a non-quadratic residue (non-residue), or 0 on zero.
/// </summary>
public static int LegendreSymbol(BigInteger a, BigInteger p)
{
if (p < 2) throw new ArgumentOutOfRangeException(nameof(p), $"Parameter '{nameof(p)}' must not be < 2, but you have supplied: {p}");
if (a == 0) return 0;
if (a == 1) return 1;
@AdamWhiteHat
AdamWhiteHat / CryptoRandomSingleton.cs
Last active Dec 22, 2020
Cryptographically secure random number generator. Safe, secure, & correct implementation. Numbers are evenly distributed across entire range; avoids modulo bias. Internal buffers always cleared after every value returned--leaves nothing in memory. Singleton intended to be instantiated only once. Remember to call Dispose.
View CryptoRandomSingleton.cs
/// <summary>
/// Cryptographically secure random number generator. Features a safe, secure, and correct implementation.
/// Numbers are evenly distributed across the whole range; avoids modulo bias.
/// Internal buffers always cleared after every value returned--leaves nothing in memory.
/// Singleton intended to be instantiated only once for the lifetime of the application.
/// Remember to call Dispose when no longer needed.
/// </summary>
public static class CryptoRandomSingleton
{
@AdamWhiteHat
AdamWhiteHat / ANS1PrivateKey.cs
Created Dec 22, 2020
ANS1 parser for a RSA PrivateKey. Can also create a private key from just a P and Q by calculating the D, DP, DQ, and InverseQ. Create real private keys from small primes for CTFs, factoring challenges or the lulz.
View ANS1PrivateKey.cs
public class ANS1PrivateKey : IDisposable
{
public BigInteger Modulus = BigInteger.MinusOne;
public BigInteger Exponent = BigInteger.MinusOne;
public BigInteger P = BigInteger.MinusOne;
public BigInteger Q = BigInteger.MinusOne;
public BigInteger D = BigInteger.MinusOne;
public BigInteger DP = BigInteger.MinusOne;
public BigInteger DQ = BigInteger.MinusOne;
public BigInteger InverseQ = BigInteger.MinusOne;
@AdamWhiteHat
AdamWhiteHat / Factorization.cs
Last active Dec 22, 2020
Factorization class. Provides prime factorization, primality testing, limitless prime enumeration. Requires PrimeFactory class.
View Factorization.cs
public static class Factorization
{
private static BigInteger _cacheCeiling;
private static List<BigInteger> _primeCache;
private static BigInteger _cacheLargestPrimeCurrently;
private static BigInteger[] _probablePrimeCheckBases;
static Factorization()
{
_cacheCeiling = BigInteger.Pow(11, 8);
@AdamWhiteHat
AdamWhiteHat / PrimeFactory.cs
Last active Dec 22, 2020
PrimeFactory class (with caching). Required by Factorization class.
View PrimeFactory.cs
public static class PrimeFactory
{
private static BigInteger _cacheLargestPrimeCurrently;
private static BigInteger _cacheCeiling;
internal static BigInteger[] _primeCache;
static PrimeFactory()
{
_cacheCeiling = BigInteger.Pow(11, 7);
_primeCache = new BigInteger[] { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47 };
@AdamWhiteHat
AdamWhiteHat / BigIntegerExtensionMethods.cs
Last active Dec 22, 2020
BigInteger ExtensionMethods
View BigIntegerExtensionMethods.cs
public static class BigIntegerExtensionMethods
{
public static BigInteger Sum(this IEnumerable<BigInteger> source)
{
return source.Aggregate((accumulator, current) => accumulator + current);
}
public static BigInteger Product(this IEnumerable<BigInteger> source)
{
return source.Aggregate((accumulator, current) => accumulator * current);