
Simple and sane cryptographic wrapper library.
Le package NuGet AdvSim.Cryptography contient un ensemble de fonctions d’encapsulation cryptographiques réutilisables, configurées avec des valeurs par défaut raisonnables et faciles à utiliser. Plus de détails sont disponibles sous les différentes sous-rubriques ci-dessous.
Le package NuGet AdvSim.Cryptography prend en charge une grande variété de versions de .Net. En général, les fonctions incluses dans la bibliothèque offrent une bonne couverture des frameworks cibles. Lorsque certaines fonctions sont restreintes à des frameworks spécifiques, un badge a été ajouté pour mettre en évidence cette dépendance.
NuGet URL: https://www.nuget.org/packages/AdvSim.Cryptography
Lorsque le matériel de clé est fourni dans le constructeur cryptographique, Rfc2898DeriveBytes est utilisé pour renvoyer des tableaux d’octets pseudo-aléatoires afin d’initialiser les opérations de chiffrement et de déchiffrement. Ces tableaux d’octets sont de haute qualité tout en garantissant que l’appel de la même fonction avec le même matériel de clé produira la même graine pseudo-aléatoire.
Cette fonction prend un tableau d’octets et le chiffre ou le déchiffre à l’aide du matériel de clé fourni dans le constructeur. À la fin, elle renvoie un tableau d’octets.
AES test = new AES("Lovecraft");
Byte[] bEncrypted = test.Encrypt(bTestData);
Byte[] bDecrypted = test.Decrypt(bEncrypted);
Cette fonction prend un tableau d’octets et le chiffre ou le déchiffre à l’aide du matériel de clé fourni dans le constructeur. À la fin, elle renvoie un tableau d’octets.
TripleDES test = new TripleDES("Lovecraft");
Byte[] bEncrypted = test.Encrypt(bTestData);
Byte[] bDecrypted = test.Decrypt(bEncrypted);
Cette fonction prend un tableau d’octets et le chiffre ou le déchiffre à l’aide du matériel de clé fourni dans le constructeur. À la fin, elle renvoie un tableau d’octets.
RC4 test = new RC4("Lovecraft");
Byte[] bEncrypted = test.Encrypt(bTestData);
Byte[] bDecrypted = test.Decrypt(bEncrypted);
Cette fonction prend un tableau d’octets et le chiffre ou le déchiffre à l’aide du matériel de clé fourni dans le constructeur. À la fin, elle renvoie un tableau d’octets.
RC2 test = new RC2("Lovecraft");
Byte[] bEncrypted = test.Encrypt(bTestData);
Byte[] bDecrypted = test.Decrypt(bEncrypted);
Cette fonction prend un tableau d’octets et le chiffre ou le déchiffre à l’aide du matériel de clé fourni dans le constructeur. À la fin, elle renvoie un tableau d’octets.
MultiXOR test = new MultiXOR("Lovecraft");
Byte[] bEncrypted = test.Encrypt(bTestData);
Byte[] bDecrypted = test.Decrypt(bEncrypted);
Cette fonction prend un tableau d’octets et le chiffre ou le déchiffre à l’aide du matériel de clé fourni dans le constructeur. À la fin, elle renvoie un tableau d’octets.
XTEA test = new XTEA("Lovecraft");
Byte[] bEncrypted = test.Encrypt(bTestData);
Byte[] bDecrypted = test.Decrypt(bEncrypted);
Notez ici qu’en v2.0.0, ECDH est pris en charge sur toutes les versions de .Net disponibles dans le package NuGet. Cependant, en raison de décisions de conception .Net vraiment discutables, l’interopérabilité entre toutes les cibles prises en charge n’est pas triviale.
Par conséquent, il existe des différences d’implémentation entre Framework < .Net 4.7 et tout le reste. Les deux clients doivent appartenir au même groupe pour réussir un échange de clés. Si, par exemple, vous avez besoin qu’un client soit sur .Net 6 et un autre sur .Net 4.5.1, vous devez alors utiliser RSA à la place.
Pour mieux comprendre le versionnage de .Net, vous pouvez consulter la ressource suivante.
Framework < .Net 4.7
Ces cibles ne prennent en charge que nistP256 et peuvent utiliser la bibliothèque comme suit.
// Initialize both clients
ECDH test1 = new ECDH();
ECDH test2 = new ECDH();
// Exchange public keys
Byte[] bPublic1 = test1.GetPublicKeyArray();
Byte[] bPublic2 = test2.GetPublicKeyArray();
// Derive
test1.DeriveSharedKey(bPublic2);
test2.DeriveSharedKey(bPublic1);
// Encrypt / Decrypt
Byte[] bEncrypted1 = test1.Encrypt(bTestData);
Byte[] bDecrypted2 = test2.Decrypt(bEncrypted1);
.Net 4.7+ || Standard 2.1 || .Net 6
Ces cibles prennent une courbe comme argument du constructeur.
public enum ECCurveType
{
brainpoolP160r1,
brainpoolP160t1,
brainpoolP192r1,
brainpoolP192t1,
brainpoolP224r1,
brainpoolP224t1,
brainpoolP256r1,
brainpoolP256t1,
brainpoolP320r1,
brainpoolP320t1,
brainpoolP384r1,
brainpoolP384t1,
brainpoolP512r1,
brainpoolP512t1,
nistP256,
nistP384,
nistP521
}
L’utilisation est présentée ci-dessous.
// Initialize both clients
ECDH test1 = new ECDH(ECDH.ECCurveType.nistP521);
ECDH test2 = new ECDH(ECDH.ECCurveType.nistP521);
// Exchange public keys
Byte[] bPublic1 = test1.GetPublicKeyArray();
Byte[] bPublic2 = test2.GetPublicKeyArray();
// Derive
test1.DeriveSharedKey(bPublic2);
test2.DeriveSharedKey(bPublic1);
// Encrypt / Decrypt
Byte[] bEncrypted1 = test1.Encrypt(bTestData);
Byte[] bDecrypted2 = test2.Decrypt(bEncrypted1);
Notez que cette fonctionnalité ne nécessite pas obligatoirement deux clients, car les clés publiques n’ont pas à être échangées pour dériver un secret partagé comme c’est le cas pour ECDH. Bien sûr, comme ci-dessus, vous pouvez envoyer votre clé publique sur le réseau à un autre client qui peut ensuite chiffrer des données que vous seul pouvez déchiffrer.
RSA test = new RSA();
Byte[] bPublicKey = test.GetPublicKeyArray();
Byte[] bEncrypted = test.Encrypt(bPublicKey, bTestData);
Byte[] bDecrypted = test.Decrypt(bEncrypted);
Les données chiffrées et déchiffrées sont limitées à la machine. Les données ne peuvent pas être déchiffrées hors de l’hôte.
// Without entropy
DPAPI test = new DPAPI();
Byte[] bEncrypted = test.EncryptUserDPAPI(bTestData);
Byte[] bDecrypted = test.DecryptUserDPAPI(bEncrypted);
// With entropy
DPAPI test = new DPAPI("Lovecraft");
Byte[] bEncrypted = test.EncryptUserDPAPI(bTestData);
Byte[] bDecrypted = test.DecryptUserDPAPI(bEncrypted);
Les données chiffrées et déchiffrées sont limitées à l’utilisateur actuel. Les données ne peuvent pas être déchiffrées dans un contexte utilisateur différent.
// Without entropy
DPAPI test = new DPAPI();
Byte[] bEncrypted = test.EncryptMachineDPAPI(bTestData);
Byte[] bDecrypted = test.DecryptMachineDPAPI(bEncrypted);
// With entropy
DPAPI test = new DPAPI("Lovecraft");
Byte[] bEncrypted = test.EncryptMachineDPAPI(bTestData);
Byte[] bDecrypted = test.DecryptMachineDPAPI(bEncrypted);
Un mot de passe à usage unique basé sur le temps (TOTP) peut être utilisé comme vérification supplémentaire lors de l’exécution d’actions pour valider leur authenticité. Les TOTP générés par la bibliothèque sont valables pendant une minute complète de UtcNow. Ces secrets numériques peuvent également être utilisés pour alimenter dynamiquement des clés rotatives pour les algorithmes de chiffrement symétrique. Si les clients utilisent la même graine sur différentes machines, ils recevront le même TOTP.
// Generate a TOTP using a string seed
TOTP test = new TOTP("Lovecraft");
Console.WriteLine("[+] TOPT Code : " + oOTP.Code);
Console.WriteLine("[+] TOPT Last Code: " + oOTP.LastCode);
Console.WriteLine("[+] TOPT Validity : " + oOTP.Seconds);
// Validate TOTP based on string seed
Boolean bValid = test.ValidateTOTP("Lovecraft", oTOTP.Code);
// Validate TOTP with forgiveness, this allows the previous TOTP
// to also be counted as valid
Boolean bValid = test.ValidateTOTP("Lovecraft", oTOTP.LastCode, true);