जब तक ऑब्जेक्ट को धारावाहिक के रूप में चिह्नित किया जाता है, तब तक ऑब्जेक्ट को बाइट सरणी में परिवर्तित करने का एक तरीका है। नेट में बाइनरीफॉर्मेटर क्लास का उपयोग करना।
आप अपने कोड फाइल करने के लिए इस कथन का उपयोग जोड़ने की आवश्यकता होगी:
using System.Runtime.Serialization.Formatters.Binary;
एक द्विआधारी फ़ॉर्मेटर एक धारा के लिए अपने वर्ग उत्पादन कर सकते हैं। जैसा कि आप अपनी ऑब्जेक्ट को बाइट सरणी में कनवर्ट करना चाहते हैं, आप सिस्टम.आईओ.मेमरीस्ट्रीम को अस्थायी स्टोरेज के रूप में उपयोग कर सकते हैं।
MemoryStream memStream = new MemoryStream();
फिर आप एक नया बाइनरी फॉर्मेटर बना सकते हैं।
BinaryFormatter formatter = new BinarryFomatter();
और अपने ऑब्जेक्ट को क्रमबद्ध करने के लिए इसका उपयोग करें।
formatter.Serialize(memStream, someObject);
बाइट्स आप उपयोग कर सकते हैं पाने के लिए:
return memStream.ToArray();
बाइट सरणी आप एक स्मृति धारा बाइट्स लिखने की ज़रूरत deserialize करने के लिए।
memStream.Write(arrBytes, 0, arrBytes.Length);
स्ट्रीम की शुरुआत पर लौटें।
memStream.Seek(0, SeekOrigin.Begin);
फिर ऑब्जेक्ट को फिर से बनाने के लिए फ़ॉर्मेटर का उपयोग करें।
Object obj = (Object)formatter.Deserialize(memStream);
आप पहले से ही सुरक्षित तरीका कार्यक्षमताओं का उपयोग कर रहे हैं, तो आप डेटाबेस में भंडारण से पहले काफी आसानी से बनाया बाइट सरणी एन्क्रिप्ट करने के लिए सक्षम होना चाहिए।
उम्मीद है कि यह आपको सही दिशा में मदद करेगा। यदि आप भाग्यशाली हैं, तो BouncyCastle ऑब्जेक्ट्स को धारावाहिक के रूप में चिह्नित किया जाएगा, अगर आपको कुछ अतिरिक्त कोड की आवश्यकता नहीं है। बाद में, मुझे इसका परीक्षण करने में सक्षम होने के लिए बाउंसीकास्ट लाइब्रेरी को देखने का मौका मिलेगा और यदि आवश्यक हो तो अधिक कोड पोस्ट करेंगे।
... मैंने पहले कभी बाउंसीकास्टल का उपयोग नहीं किया है। कुछ परीक्षणों के बाद, ऐसा प्रतीत होता है कि सार्वजनिक और निजी कुंजी वस्तुएं क्रमबद्ध नहीं हैं, इसलिए आपको इन वस्तुओं को किसी चीज़ में परिवर्तित करने की आवश्यकता होगी!
ऐसा प्रतीत होता है कि सार्वजनिक और निजी कुंजी विभिन्न BouncyCastle.Math.BigInteger मानों के रूप में गुणों का पर्दाफाश करती हैं। (इन बिगइंटर से चाबियाँ भी बनाई जा सकती हैं)। इसके अलावा, BigIntegers के पास ToByteArray() फ़ंक्शन है और इसे बाइट सरणी से भी बनाया जा सकता है। बहुत उपयोगी ..
यह जानकर कि आप प्रत्येक कुंजी को बिगइंटर में तोड़ सकते हैं और इन्हें बाइट सरणी में बदल दिया जा सकता है और यह भी संभव है कि आप इन सभी को एक धारावाहिक वस्तु में स्टोर करने का एक तरीका भी संभव हो। एक साधारण संरचना या कक्षा उदा।
[Serializable]
private struct CipherPrivateKey
{
public byte[] modulus;
public byte[] publicExponent;
public byte[] privateExponent;
public byte[] p;
public byte[] q;
public byte[] dP;
public byte[] dQ;
public byte[] qInv;
}
[Serializable]
private struct CipherPublicKey
{
public bool isPrivate;
public byte[] modulus;
public byte[] exponent;
}
यह हमें धारावाहिक वस्तुओं का उपयोग करने में आसान बनाता है।
असीमेट्रिक कैफेरपेयर सार्वजनिक और निजी कुंजी को असममित केपे पैरामीटर वस्तुओं के रूप में उजागर करता है।
निम्नलिखित
keyPair.Public BouncyCastle.Crypto.Parameters.RsaKeyParameters को BouncyCastle.Crypto.Parameters.RsaPrivateCrtKeyParameters को keyPair.Private: अधिक विस्तृत संपत्तियों पर प्राप्त करने के लिए आप इन निम्नलिखित को कास्ट करने के लिए की आवश्यकता होगी कार्यों की घोषणा पहले के structs करने के लिए इन में परिवर्तित कर देंगे:
private static CipherPublicKey getCipherPublicKey(Org.BouncyCastle.Crypto.Parameters.RsaKeyParameters cPublic)
{
CipherPublicKey cpub = new CipherPublicKey();
cpub.modulus = cPublic.Modulus.ToByteArray();
cpub.exponent = cPublic.Exponent.ToByteArray();
return cpub;
}
private static CipherPrivateKey getCipherPrivateKey(Org.BouncyCastle.Crypto.Parameters.RsaPrivateCrtKeyParameters cPrivate)
{
CipherPrivateKey cpri = new CipherPrivateKey();
cpri.dP = cPrivate.DP.ToByteArray();
cpri.dQ = cPrivate.DQ.ToByteArray();
cpri.modulus = cPrivate.Modulus.ToByteArray();
cpri.p = cPrivate.P.ToByteArray();
cpri.privateExponent = cPrivate.Exponent.ToByteArray();
cpri.publicExponent = cPrivate.PublicExponent.ToByteArray();
cpri.q = cPrivate.Q.ToByteArray();
cpri.qInv = cPrivate.QInv.ToByteArray();
return cpri;
}
द्विआधारी फ़ॉर्मेटर पहले उल्लेख किया है का उपयोग करना, हम serializable वस्तुओं हम सिर्फ एक बाइट सरणी के लिए बनाया है बदल सकते हैं।
CipherPublicKey cpub = getCipherPublicKey((Org.BouncyCastle.Crypto.Parameters.RsaKeyParameters)keypair.Public);
MemoryStream memStream = new MemoryStream();
BinaryFormatter formatter = new BinarryFomatter();
formatter.Serialize(memStream, cpub);
return memStream.ToArray();
Desierializing पहले वर्णित जैसा ही विपरीत है। एक बार जब आपके पास सार्वजनिक या निजी structs deserialized हो, तो आप कुंजी को फिर से बनाने के लिए BouncyCastle संरचनाओं का उपयोग कर सकते हैं। ये कार्य इसका प्रदर्शन करते हैं।
private static Org.BouncyCastle.Crypto.Parameters.RsaKeyParameters recreateASymCipherPublicKey(CipherPublicKey cPublicKey)
{
Org.BouncyCastle.Crypto.Parameters.RsaKeyParameters key;
key = new Org.BouncyCastle.Crypto.Parameters.RsaKeyParameters(
cPublicKey.isPrivate,
createBigInteger(cPublicKey.modulus),
createBigInteger(cPublicKey.exponent));
return key;
}
private static Org.BouncyCastle.Crypto.Parameters.RsaPrivateCrtKeyParameters recreateASymCipherPrivateKey(CipherPrivateKey cPrivateKey)
{
Org.BouncyCastle.Crypto.Parameters.RsaPrivateCrtKeyParameters key;
key = new Org.BouncyCastle.Crypto.Parameters.RsaPrivateCrtKeyParameters(
createBigInteger(cPrivateKey.modulus),
createBigInteger(cPrivateKey.publicExponent),
createBigInteger(cPrivateKey.privateExponent),
createBigInteger(cPrivateKey.p),
createBigInteger(cPrivateKey.q),
createBigInteger(cPrivateKey.dP),
createBigInteger(cPrivateKey.dQ),
createBigInteger(cPrivateKey.qInv));
return key;
}
आप किसी भी कारण के लिए मूल कुंजी युग्म पुन: बनाने की जरूरत है:
AsymmetricKeyParameter publ = (AsymmetricKeyParameter)recreateASymCipherPublicKey(cKeyPair.publicKey);
AsymmetricKeyParameter priv = (AsymmetricKeyParameter)recreateASymCipherPrivateKey(cKeyPair.privateKey);
AsymmetricCipherKeyPair keyPair = new AsymmetricCipherKeyPair(publ, priv);
उम्मीद है कि है कि सभी समझ में आता है! कोड नमूने आपको अपने रास्ते पर मदद कर सकते हैं।
किसी को भी इस पर कुछ विचार मिल गए हैं? – TravisPUK