
Simple and sane cryptographic wrapper library.
AdvSim.Cryptography NuGet में क्रिप्टोग्राफ़िक रैपर फ़ंक्शनों का एक सेट शामिल है, जो पुन: प्रयोज्य हैं, उचित डिफ़ॉल्ट के साथ कॉन्फ़िगर किए गए हैं और उपयोग में आसान हैं। अधिक विवरण नीचे विभिन्न उप-शीर्षकों के अंतर्गत उपलब्ध हैं।
AdvSim.Cryptography NuGet विभिन्न प्रकार के .Net संस्करणों का समर्थन करता है। सामान्यतः लाइब्रेरी में शामिल फ़ंक्शनों की लक्षित फ्रेमवर्क पर अच्छी कवरेज होती है। जहाँ फ़ंक्शन विशिष्ट फ्रेमवर्क तक सीमित हैं, वहाँ उस निर्भरता को उजागर करने के लिए एक बैज जोड़ा गया है।
NuGet URL: https://www.nuget.org/packages/AdvSim.Cryptography
जहाँ क्रिप्टोग्राफ़िक कंस्ट्रक्टर के भाग के रूप में कुंजी सामग्री प्रदान की जाती है, वहाँ एन्क्रिप्शन और डिक्रिप्शन ऑपरेशनों को सीड करने के लिए स्यूडो-रैंडम बाइट ऐरे लौटाने हेतु Rfc2898DeriveBytes का उपयोग किया जाता है। ये बाइट ऐरे उच्च गुणवत्ता वाले होते हैं, साथ ही यह भी सुनिश्चित करते हैं कि समान कुंजी सामग्री के साथ समान फ़ंक्शन को कॉल करने पर समान स्यूडो-रैंडम सीड प्राप्त हो।
यह फ़ंक्शन एक बाइट ऐरे लेता है और कंस्ट्रक्टर में प्रदान की गई कुंजी सामग्री का उपयोग करके उसे या तो एन्क्रिप्ट या डिक्रिप्ट करता है। पूरा होने पर यह एक बाइट ऐरे लौटाता है।
AES test = new AES("Lovecraft");
Byte[] bEncrypted = test.Encrypt(bTestData);
Byte[] bDecrypted = test.Decrypt(bEncrypted);
यह फ़ंक्शन एक बाइट ऐरे लेता है और कंस्ट्रक्टर में प्रदान की गई कुंजी सामग्री का उपयोग करके उसे या तो एन्क्रिप्ट या डिक्रिप्ट करता है। पूरा होने पर यह एक बाइट ऐरे लौटाता है।
TripleDES test = new TripleDES("Lovecraft");
Byte[] bEncrypted = test.Encrypt(bTestData);
Byte[] bDecrypted = test.Decrypt(bEncrypted);
यह फ़ंक्शन एक बाइट ऐरे लेता है और कंस्ट्रक्टर में प्रदान की गई कुंजी सामग्री का उपयोग करके उसे या तो एन्क्रिप्ट या डिक्रिप्ट करता है। पूरा होने पर यह एक बाइट ऐरे लौटाता है।
RC4 test = new RC4("Lovecraft");
Byte[] bEncrypted = test.Encrypt(bTestData);
Byte[] bDecrypted = test.Decrypt(bEncrypted);
यह फ़ंक्शन एक बाइट ऐरे लेता है और कंस्ट्रक्टर में प्रदान की गई कुंजी सामग्री का उपयोग करके उसे या तो एन्क्रिप्ट या डिक्रिप्ट करता है। पूरा होने पर यह एक बाइट ऐरे लौटाता है।
RC2 test = new RC2("Lovecraft");
Byte[] bEncrypted = test.Encrypt(bTestData);
Byte[] bDecrypted = test.Decrypt(bEncrypted);
यह फ़ंक्शन एक बाइट ऐरे लेता है और कंस्ट्रक्टर में प्रदान की गई कुंजी सामग्री का उपयोग करके उसे या तो एन्क्रिप्ट या डिक्रिप्ट करता है। पूरा होने पर यह एक बाइट ऐरे लौटाता है।
MultiXOR test = new MultiXOR("Lovecraft");
Byte[] bEncrypted = test.Encrypt(bTestData);
Byte[] bDecrypted = test.Decrypt(bEncrypted);
यह फ़ंक्शन एक बाइट ऐरे लेता है और कंस्ट्रक्टर में प्रदान की गई कुंजी सामग्री का उपयोग करके उसे या तो एन्क्रिप्ट या डिक्रिप्ट करता है। पूरा होने पर यह एक बाइट ऐरे लौटाता है।
XTEA test = new XTEA("Lovecraft");
Byte[] bEncrypted = test.Encrypt(bTestData);
Byte[] bDecrypted = test.Decrypt(bEncrypted);
यहाँ ध्यान दें कि v2.0.0 में ECDH NuGet में उपलब्ध सभी .Net संस्करणों पर समर्थित है। हालाँकि, कुछ वास्तव में संदिग्ध .Net डिज़ाइन निर्णयों के कारण, सभी समर्थित लक्ष्यों के बीच इंटरऑप प्राप्त करना सरल नहीं है।
परिणामस्वरूप, Framework < .Net 4.7 और बाकी सबके बीच कार्यान्वयन भिन्नताएँ मौजूद हैं। सफलतापूर्वक कुंजी विनिमय करने के लिए दोनों क्लाइंट एक ही समूह में आने चाहिए। उदाहरण के लिए, यदि आपको एक क्लाइंट .Net 6 पर और दूसरा .Net 4.5.1 पर चाहिए, तो आपको इसके बजाय RSA का उपयोग करना चाहिए।
.Net संस्करणों के बारे में अधिक समझने के लिए आप निम्नलिखित संसाधन देख सकते हैं।
Framework < .Net 4.7
ये लक्ष्य केवल nistP256 का समर्थन करते हैं और लाइब्रेरी का उपयोग निम्नानुसार कर सकते हैं।
// 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
ये लक्ष्य कंस्ट्रक्टर के लिए तर्क के रूप में एक कर्व लेते हैं।
public enum ECCurveType
{
brainpoolP160r1,
brainpoolP160t1,
brainpoolP192r1,
brainpoolP192t1,
brainpoolP224r1,
brainpoolP224t1,
brainpoolP256r1,
brainpoolP256t1,
brainpoolP320r1,
brainpoolP320t1,
brainpoolP384r1,
brainpoolP384t1,
brainpoolP512r1,
brainpoolP512t1,
nistP256,
nistP384,
nistP521
}
उपयोग नीचे दिखाया गया है।
// 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);
ध्यान दें कि यह कार्यक्षमता आवश्यक रूप से दो क्लाइंटों की आवश्यकता रखती है, क्योंकि सार्वजनिक कुंजियों को साझा रहस्य प्राप्त करने के लिए विनिमय करना आवश्यक नहीं है, जैसा कि ECDH के मामले में होता है। बेशक, जैसा ऊपर बताया गया है, आप अपनी सार्वजनिक कुंजी को नेटवर्क पर किसी भिन्न क्लाइंट को भेज सकते हैं, जो तब केवल उस डेटा को एन्क्रिप्ट कर सकता है जिसे केवल आप ही डिक्रिप्ट कर सकते हैं।
RSA test = new RSA();
Byte[] bPublicKey = test.GetPublicKeyArray();
Byte[] bEncrypted = test.Encrypt(bPublicKey, bTestData);
Byte[] bDecrypted = test.Decrypt(bEncrypted);
एन्क्रिप्ट और डिक्रिप्ट किया जाने वाला डेटा मशीन के दायरे तक सीमित होता है। डेटा को होस्ट के बाहर डिक्रिप्ट नहीं किया जा सकता।
// 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);
एन्क्रिप्ट और डिक्रिप्ट किया जाने वाला डेटा वर्तमान उपयोगकर्ता के दायरे तक सीमित होता है। डेटा को किसी भिन्न उपयोगकर्ता संदर्भ में डिक्रिप्ट नहीं किया जा सकता।
// 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);
एक समय-आधारित एक-बार पासवर्ड (TOTP) का उपयोग, क्रियाएँ निष्पादित करते समय यह सत्यापित करने के लिए एक अतिरिक्त जाँच के रूप में किया जा सकता है कि वे प्रामाणिक हैं। लाइब्रेरी द्वारा उत्पन्न TOTP एक पूरे UtcNow मिनट के लिए मान्य होते हैं। इन संख्यात्मक रहस्यों का उपयोग सममित एन्क्रिप्शन एल्गोरिदम के लिए घूमती हुई कुंजियों को गतिशील रूप से सीड करने के लिए भी किया जा सकता है। यदि क्लाइंट विभिन्न मशीनों पर समान सीड का उपयोग करते हैं, तो उन्हें समान 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);