एन्क्रिप्शन का एक रूप जो एक एन्क्रिप्टेड परिणाम उत्पन्न करने वाले सिफरटेक्स्ट पर गणना की अनुमति देता है, जब डिक्रिप्ट किया जाता है, तो संचालन के परिणाम से मेल खाता है जैसे कि वे सादे टेक्स्ट पर किए गए थे। - मास्सिमो बर्टाकिनी ( )
अपने डेटा को एन्क्रिप्ट करने के लिए एक विशेष गोपनीयता समरूपता का उपयोग करें ताकि टाइम-शेयर कंप्यूटर पहले इसे डिक्रिप्ट किए बिना डेटा पर काम कर सके।
इसे दूसरे तरीके से रखने के लिए, मैं अपने डेटा की प्रोसेसिंग को उस तक पहुंच दिए बिना हटाना चाहता हूं।
इसे दूसरे तरीके से रखने के लिए, फ़ंक्शन (ए, बी) = फ़ंक्शन (ए , B
) जहां ए and B
बी क्रमशः ए और बी के एन्क्रिप्टेड मान हैं। यह तीसरे पक्ष को एन्क्रिप्टेड डेटा की गणना करने और मूल मूल्य के ज्ञान के बिना परिणाम प्रदान करने में सक्षम बनाता है। आरएसए के साथ, एक ही कुंजी से एन्क्रिप्ट किए गए दो मानों को गुणा किया जा सकता है, और उत्पाद को एन्क्रिप्टेड मानों के उत्पाद को डिक्रिप्ट किया जा सकता है।
पुस्तकालय | योजनाओं | भाषा | लाइसेंस |
---|---|---|---|
बीएफवी, बीजीवी, सीकेकेएस | सी ++/सी # रैपर | एमआईटी | |
एफएचई खोलें | बीएफवी, बीजीवी, सीकेकेएस, डीएम, सीजीजीआई | सी ++ | बीएसडी 2-क्लॉज लाइसेंस |
सीकेकेएस | सी ++ | क्रिएटिव कॉमन्स 3.0 | |
टीएफएचई (टोरस) | जंग | बीएसडी-3-क्लॉज-क्लियर | |
टीएफएचई | जंग | बीएसडी-3-क्लॉज-क्लियर | |
बीएफवी, बीजीवी, सीकेकेएस | जाओ | अपाचे 2.0 | |
एन/ए – सील, पालिसेड, एचएलआईबी का उपयोग करता है | पायथन, डॉकर | अपाचे 2.0 |
आरंभ करने के लिए, क्लाइंट द्वारा एक सार्वजनिक कुंजी बनाई जाती है और सर्वर के साथ साझा की जाती है। इसका उपयोग डेटा को एन्क्रिप्ट करने और एन्क्रिप्टेड डेटा पर अंकगणितीय संचालन करने के लिए भी किया जाता है। क्लाइंट और सर्वर दोनों एक एनक्रिप्टर का उपयोग करते हैं। क्लाइंट डिक्रिप्शन के लिए उपयोग की जाने वाली एक निजी कुंजी को उत्पन्न करता है और बनाए रखता है जिसे डिक्रिप्टर नाम दिया गया है।
using Microsoft.Research.SEAL; protected SEALContext _context; private KeyGenerator _keyGenerator; private Encryptor _encryptor; private Decryptor _decryptor; protected IFitnessTrackerApiClient _apiClient; . . . _context = SEALUtils.GetContext(_config.Value.PolyModulusDegree, this.SchemeType); _keyGenerator = new KeyGenerator(_context); _keyGenerator.CreatePublicKey(out PublicKey publicKey); _keyGenerator.CreateRelinKeys(out RelinKeys relinKeys); _encryptor = new Encryptor(_context, _publicKey); _decryptor = new Decryptor(_context, _keyGenerator.SecretKey); . . . PublicKeyModelCKKS keyModelCKKS = new( SEALUtils.KeyToBase64String(_publicKey), SEALUtils.KeyToBase64String(relinKeys)); await _apiClient.SendPublicKeyCKKSAsync(keyModelCKKS);
क्लाइंट से सर्वर तक रिलाइनराइजेशन कीज पास की जाती हैं। Microsoft SEAL के अनुसार, गुणन ऑपरेशन के बाद सिफरटेक्स्ट के आकार को कम करने के अलावा उनका कोई अर्थ नहीं है।
कमांड लाइन पर, उपयोगकर्ता समय और दूरी में प्रवेश करता है।
प्रत्येक मान प्लेनटेक्स्ट में एन्कोड किया गया है, फिर सिफरटेक्स्ट में एन्क्रिप्ट किया गया है, और अंत में इसे सर्वर पर भेजने से पहले बेस64 में एन्कोड किया गया है।
using Microsoft.Research.SEAL; var plaintext = new Plaintext(); _encoder.Encode(value, _scale, plaintext); var ciphertext = new Ciphertext(); _encryptor.Encrypt(value, ciphertext); using (var ms = new MemoryStream()) { ciphertext.Save(ms); return Convert.ToBase64String(ms.ToArray()); }
RunItemCKKS metricsRequest = new( EncryptBase64(runItem.Distance), EncryptBase64(runItem.Time), EncryptBase64(1 / runItem.Time)); await _apiClient.AddNewRunningDistanceCKKSAsync(metricsRequest);
सर्वर एक समान बूटस्ट्रैपिंग फ़ंक्शन करता है जो केवल सार्वजनिक कुंजी और पुन: रेखीयकरण कुंजियों का उपयोग करके SEALContext बनाता है, फिर अनुरोध को संसाधित करता है:
var distance = SEALUtils.BuildCiphertextFromBase64String(request.Distance, _sealContext); var time = SEALUtils.BuildCiphertextFromBase64String(request.Time, _sealContext); var timeReciprocal = SEALUtils.BuildCiphertextFromBase64String(request.TimeReciprocal, _sealContext); Ciphertext speed = new(); _evaluator.Multiply(distance, timeReciprocal, speed); _evaluator.RelinearizeInplace(speed, _relinKeys); _runListCKKS.Add(new EncryptedRunInfoCKKS(distance, time, speed));
सबमिट किए गए रन के लिए गति की गणना करने के लिए समय के एक व्युत्क्रम का उपयोग किया जाता है और RelinearizeInplace पद्धति परिणामी सिफरटेक्स्ट के आकार को कम कर देती है । दूरी, समय और गति को एक इन-मेमोरी सूची में सहेजा जाता है।
GetMetrics विधि सूची एकत्र करती है और रिटर्न करती है:
public SummaryItemCKKS GetMetrics() { int count = _runListCKKS.Count; var totalDistanceCKKS = SumEncryptedValues(_runListCKKS.Select(m => m.Distance)); var totalTimeCKKS = SumEncryptedValues(_runListCKKS.Select(m => m.Time)); var totalSpeed = SumEncryptedValues(_runListCKKS.Select(m => m.Speed)); . . . protected Ciphertext SumEncryptedValues(IEnumerable<Ciphertext> encryptedData) { . . . Ciphertext encTotal = new(); _evaluator.AddMany(encryptedData, encTotal); return encTotal; . . . }
चूंकि सर्वर रन सबमिशन की संख्या का ट्रैक रखता है, रन की कुल संख्या एक एन्क्रिप्टेड मान नहीं है। उस अनएन्क्रिप्टेड मान को प्लेनटेक्स्ट में बदला जा सकता है और सिफरटेक्स्ट पर किए गए ऑपरेशन में इस्तेमाल किया जा सकता है । हालांकि यह एक साधारण उदाहरण है, निहितार्थ ध्यान देने योग्य हैं। सर्वर एन्क्रिप्टेड डेटा पर उपयोग किए जाने वाले अतिरिक्त मान प्रदान कर सकता है, जिससे तृतीय-पक्ष प्रदाताओं को ग्राहक द्वारा प्रदान किए गए एन्क्रिप्टेड डेटा के खिलाफ गणना के लिए मालिकाना डेटा लागू करने में सक्षम बनाया जा सके।
नीचे दिए गए उदाहरण में, कुल संख्या को एक व्युत्क्रम में बदला जाता है और एक सूची <डबल> में जोड़ा जाता है। सीकेकेएस संचालन एन्क्रिप्टेड सूची मानों की अपेक्षा करता है, भले ही सूची में केवल एक मान हो। तो, List<double> को PlainText में एन्कोड किया गया है। MultiplyPlainInplace कुल गति को (1/रनों की संख्या) से गुणा करता है जिसके परिणामस्वरूप औसत गति प्राप्त होती है। स्थान बचाने के लिए, परिणाम टोटलस्पीड सिफरटेक्स्ट पर लागू होता है और री-लीनियराइज़ेशन कुंजियाँ आउटपुट के आकार को कम करती हैं।
Plaintext encodedCountReciprocal = new(); List<double> averagePaceList = new(); double runCountReciprocal = 1 / (double)count; averagePaceList.Add(runCountReciprocal); _encoder.Encode(averagePaceList, _scale, encodedCountReciprocal); _evaluator.MultiplyPlainInplace(totalSpeed, encodedCountReciprocal); _evaluator.RelinearizeInplace(totalSpeed, _relinKeys);
मान बेस 64 एन्कोडेड, लौटाए गए और क्लाइंट पर डिक्रिप्ट किए गए हैं। क्लाइंट डिक्रिप्ट किए गए प्लेनटेक्स्ट को List<double> में बदलने का अतिरिक्त कदम उठाता है।
var payload = Convert.FromBase64String(encryptedDistanceText); using var ms = new MemoryStream(payload); var ciphertext = new Ciphertext(); ciphertext.Load(_context, ms); var decryptedText = new Plaintext(); _decryptor.Decrypt(cypherText, decryptedText); List<double> distanceList = new(); _encoder.Decode(decryptedText, distanceList);
मील की दूरी पर | समय |
---|---|
2.5 | 0:35:32.643 |
2.2 | 0:32:48.826 |
2.8 | 0:34:52.036 |
Microsoft SEAL एक Microsoft अनुसंधान परियोजना है और उत्पादन अनुप्रयोग के लिए तैयार नहीं है। सभी वर्ग IDisposable को लागू करते हैं और अप्रबंधित संसाधनों का उपयोग करते हैं। उत्पादन कोड को मेमोरी लीक से बचाने की आवश्यकता होगी। SEALContext वर्ग एकल उत्तरदायित्व सिद्धांत का पालन नहीं करता है। इसमें बीजीवी/बीवीएफ और सीकेकेएस दोनों के लिए तरीके शामिल हैं। इसके अलावा, सीकेकेएस वेक्टर संचालन का समर्थन करता है, लेकिन वेक्टर जोड़ नहीं। एक एकल सूची <डबल> को एक एकल सिफरटेक्स्ट में एन्क्रिप्ट किया जा सकता है लेकिन एक सिफरटेक्स्ट में मानों को जोड़ने का कोई साधन नहीं है । यह के साथ किया जा सकता है, लेकिन यह एक उप-इष्टतम समाधान है।