
Libreria wrapper crittografica semplice e sensata.
Il pacchetto NuGet AdvSim.Cryptography contiene un insieme di funzioni wrapper crittografiche riutilizzabili, configurate con impostazioni predefinite sensate e facili da usare. Ulteriori dettagli sono disponibili nelle diverse sottosezioni riportate di seguito.
Il pacchetto NuGet AdvSim.Cryptography supporta un'ampia varietà di versioni di .Net. In generale, le funzioni incluse nella libreria hanno una buona copertura tra i framework di destinazione. Dove le funzioni sono limitate a framework specifici, è stato aggiunto un badge per evidenziare tale dipendenza.
URL NuGet: https://www.nuget.org/packages/AdvSim.Cryptography
Quando il materiale chiave viene fornito come parte del costruttore crittografico, Rfc2898DeriveBytes viene utilizzato per restituire array di byte pseudo-casuali come seed per le operazioni di crittografia e decrittografia. Questi array di byte sono di alta qualità e garantiscono inoltre che chiamare la stessa funzione con lo stesso materiale chiave produca lo stesso seed pseudo-casuale.
Questa funzione accetta un array di byte e lo crittografa o decrittografa utilizzando il materiale chiave fornito nel costruttore. Al termine restituisce un array di byte.
AES test = new AES("Lovecraft");
Byte[] bEncrypted = test.Encrypt(bTestData);
Byte[] bDecrypted = test.Decrypt(bEncrypted);
Questa funzione accetta un array di byte e lo crittografa o decrittografa utilizzando il materiale chiave fornito nel costruttore. Al termine restituisce un array di byte.
TripleDES test = new TripleDES("Lovecraft");
Byte[] bEncrypted = test.Encrypt(bTestData);
Byte[] bDecrypted = test.Decrypt(bEncrypted);
Questa funzione accetta un array di byte e lo crittografa o decrittografa utilizzando il materiale chiave fornito nel costruttore. Al termine restituisce un array di byte.
RC4 test = new RC4("Lovecraft");
Byte[] bEncrypted = test.Encrypt(bTestData);
Byte[] bDecrypted = test.Decrypt(bEncrypted);
Questa funzione accetta un array di byte e lo crittografa o decrittografa utilizzando il materiale chiave fornito nel costruttore. Al termine restituisce un array di byte.
RC2 test = new RC2("Lovecraft");
Byte[] bEncrypted = test.Encrypt(bTestData);
Byte[] bDecrypted = test.Decrypt(bEncrypted);
Questa funzione accetta un array di byte e lo crittografa o decrittografa utilizzando il materiale chiave fornito nel costruttore. Al termine restituisce un array di byte.
MultiXOR test = new MultiXOR("Lovecraft");
Byte[] bEncrypted = test.Encrypt(bTestData);
Byte[] bDecrypted = test.Decrypt(bEncrypted);
Questa funzione accetta un array di byte e lo crittografa o decrittografa utilizzando il materiale chiave fornito nel costruttore. Al termine restituisce un array di byte.
XTEA test = new XTEA("Lovecraft");
Byte[] bEncrypted = test.Encrypt(bTestData);
Byte[] bDecrypted = test.Decrypt(bEncrypted);
Si noti che in v2.0.0 ECDH è supportato in tutte le versioni di .Net disponibili nel pacchetto NuGet. Tuttavia, a causa di alcune scelte progettuali di .Net davvero discutibili, non è banale ottenere l'interoperabilità tra tutti i target supportati.
Di conseguenza, ci sono differenze implementative tra Framework < .Net 4.7 e tutto il resto. Entrambi i client dovrebbero rientrare nello stesso gruppo per eseguire con successo uno scambio di chiavi. Se, ad esempio, hai bisogno che un client sia su .Net 6 e un altro su .Net 4.5.1, allora dovresti usare RSA.
Per comprendere meglio il versioning di .Net, puoi consultare la seguente risorsa.
Framework < .Net 4.7
Questi target supportano solo nistP256 e possono utilizzare la libreria come segue.
// 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
Questi target accettano una curva come argomento del costruttore.
public enum ECCurveType
{
brainpoolP160r1,
brainpoolP160t1,
brainpoolP192r1,
brainpoolP192t1,
brainpoolP224r1,
brainpoolP224t1,
brainpoolP256r1,
brainpoolP256t1,
brainpoolP320r1,
brainpoolP320t1,
brainpoolP384r1,
brainpoolP384t1,
brainpoolP512r1,
brainpoolP512t1,
nistP256,
nistP384,
nistP521
}
L'utilizzo è mostrato di seguito.
// 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);
Si noti che questa funzionalità non richiede necessariamente due client, poiché, a differenza dell'ECDH, le chiavi pubbliche non devono essere scambiate per derivare un segreto condiviso. Naturalmente, come sopra, puoi inviare la tua chiave pubblica a un altro client, che potrà poi crittografare dati che solo tu puoi decrittografare.
RSA test = new RSA();
Byte[] bPublicKey = test.GetPublicKeyArray();
Byte[] bEncrypted = test.Encrypt(bPublicKey, bTestData);
Byte[] bDecrypted = test.Decrypt(bEncrypted);
I dati crittografati e decrittografati sono limitati alla macchina. I dati non possono essere decrittografati al di fuori dell'host.
// 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);
I dati crittografati e decrittografati sono limitati all'utente corrente. I dati non possono essere decrittografati in un contesto utente diverso.
// 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);
Una password monouso basata sul tempo (TOTP) può essere utilizzata come controllo aggiuntivo durante l'esecuzione di azioni per verificarne l'autenticità. I TOTP generati dalla libreria sono validi per un intero minuto UtcNow. Questi segreti numerici possono anche essere utilizzati per inizializzare dinamicamente chiavi rotanti per algoritmi di crittografia simmetrica. Se i client usano lo stesso seed su macchine diverse, riceveranno lo stesso 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);