में सार्वजनिक/निजी कुंजी का आदान-प्रदान करें मेरे पास केवल आरएसए के बारे में कुछ प्राथमिक सैद्धांतिक ज्ञान है।पीकेसीएस # 1 ओएईपी एन्क्रिप्शन/डिक्रिप्शन
अभ्यास में इसका उपयोग करने के तरीके के बारे में विभिन्न स्रोतों को पढ़ने के दौरान, ऐसा लगता है कि पीकेसीएस # 1 ओएईपी एक अच्छी बात होगी।
एक परीक्षण कार्यान्वयन के लिए, मैं PyCrypto के साथ पायथन का उपयोग करता हूं। जैसे this पीकेसीएस # 1 ओएईपी का उपयोग कर एक उदाहरण है।
सार्वजनिक कुंजी का उपयोग करके एन्क्रिप्ट करना और फिर निजी कुंजी का उपयोग करके डिक्रिप्ट करना ठीक काम करता है। जैसे जनता व्यक्तिगत कुंजी के साथ व्यक्ति एक्स को कुछ डेटा भेज सकती है।
आरएसए कैसे काम करता है, इसकी मूलभूत समझ से, मैंने सोचा कि मैं सिर्फ सार्वजनिक/निजी कुंजी का आदान-प्रदान कर सकता हूं, यानी मैं एन्क्रिप्टिंग के लिए सार्वजनिक कुंजी और डिक्रिप्टिंग के लिए निजी कुंजी का उपयोग कर सकता हूं। जैसे व्यक्ति एक्स कुछ डेटा को अपनी निजी कुंजी से एन्क्रिप्ट कर सकता है और जनता सार्वजनिक कुंजी का उपयोग करके इसे डिक्रिप्ट कर सकती है। यदि डिक्रिप्शन ठीक काम करता है, तो यह किसी प्रकार का सबूत देता है कि डेटा एक्स से आता है एक्स
जब मैं सार्वजनिक कुंजी का उपयोग करके डिक्रिप्ट करने का प्रयास करता हूं तो PyCrypto शिकायत करता है।
PyCrypto स्रोत कोड को पढ़ने, _RSAKey._decrypt
समारोह (here) में से ऐसा प्रतीत होता कुंजी वस्तु ही जानता है कि अगर यह निजी या सार्वजनिक कुंजी है और (मेरे आश्चर्य, फिर से मेरी बहुत ही बुनियादी आधार पर करने के लिए उन दोनों के बीच अलग है आरएसए समझ)।
वहां से, ऐसा लगता है कि मैं डिक्रिप्ट फ़ंक्शन को हैक कर सकता हूं ताकि यह सार्वजनिक कुंजी का उपयोग कर सके। या कुछ हद तक अलग: मैं मुख्य वस्तुओं में सार्वजनिक एक्सपोनेंट e
और निजी एक्सपोनेंट d
का आदान-प्रदान कर सकता हूं।
लेकिन ऐसा लगता है कि इसका उपयोग इस तरह से किया/हैक करने का इरादा नहीं है। तो मैं यहां अपनी गलतफहमी के बारे में पूछना चाहता था।
इसके अलावा, बस जिज्ञासा से बाहर, मैं कुछ कुंजियों (RSA.generate(2048)
) उत्पन्न और n
, e
और d
को देखा। सभी मामलों में, n
और d
बहुत विशाल था जबकि e
सभी मामलों में निरंतर (65537) (मुझे उम्मीद नहीं थी)।
मुझे लगता है कि मुझे वास्तव में e
और d
का आदान-प्रदान नहीं करना चाहिए।
तो मुझे लगता है कि मुझे PKCS1_PSS जैसे हस्ताक्षर के लिए किसी अन्य विधि का उपयोग करना चाहिए।
एनक्रिप्टिंग/decrypting के लिए कुछ कोड, अगर कोई रुचि रखता है: (। binstruct
एक छोटे से मॉड्यूल जो सांकेतिक शब्दों में बदलना कर सकते हैं/डिकोड पेड़ डेटा संरचना है - JSON/BSON के समान)
def randomString(l):
import random
return ''.join(chr(random.randint(0, 0xFF)) for i in range(l))
def genkeypair():
from Crypto.PublicKey import RSA
key = RSA.generate(2048)
pubkey = key.publickey().exportKey("DER")
privkey = key.exportKey("DER")
return (pubkey,privkey)
def encrypt(v, rsapubkey):
from Crypto.PublicKey import RSA
rsakey = RSA.importKey(rsapubkey)
from Crypto.Cipher import PKCS1_OAEP
rsa = PKCS1_OAEP.new(rsakey)
import binstruct
from array import array
aeskey = randomString(32)
iv = randomString(16)
from Crypto.Cipher import AES
aes = AES.new(aeskey, AES.MODE_CBC, iv)
data = binstruct.varEncode(v)
data += array("B", (0,) * (-len(data) % 16))
out = binstruct.strEncode(rsa.encrypt(aeskey + iv))
out += array("B", aes.encrypt(data))
return out
def decrypt(stream, rsaprivkey):
from array import array
from StringIO import StringIO
if isinstance(stream, array): stream = stream.tostring()
if isinstance(stream, str): stream = StringIO(stream)
from Crypto.PublicKey import RSA
rsakey = RSA.importKey(rsaprivkey)
from Crypto.Cipher import PKCS1_OAEP
rsa = PKCS1_OAEP.new(rsakey)
import binstruct
aesdata = binstruct.strDecode(stream)
aesdata = rsa.decrypt(aesdata)
aeskey = aesdata[0:32]
iv = aesdata[32:]
from Crypto.Cipher import AES
aes = AES.new(aeskey, AES.MODE_CBC, iv)
class Stream:
buffer = []
def read1(self):
if len(self.buffer) == 0:
nextIn = stream.read(16)
self.buffer += list(aes.decrypt(nextIn))
return self.buffer.pop(0)
def read(self, n):
return "".join([self.read1() for i in range(n)])
v = binstruct.varDecode(Stream())
return v
यही वह जगह है जहां मैंने सोचा था कि मैं निजी कुंजी के साथ encrypt
और सार्वजनिक कुंजी के साथ decrypt
का भी उपयोग कर सकता हूं।
(उम्मीद है कि) सही पर हस्ताक्षर/प्रमाणीकरण के साथ अंतिम कार्यान्वयन here in binstruct पाया जा सकता है।
"जब मैं सार्वजनिक कुंजी का उपयोग करके डिक्रिप्ट करने का प्रयास करता हूं तो पीईक्रिप्टो शिकायत करता है"। कृपया अधिक विशिष्ट हो, और कृपया अपना कोड दिखाएं। –
@ ग्रेग्स: यह '_RSAKey._decrypt' में' TypeError ("कोई निजी कुंजी") उठाता है। जैसा कि आप लिंक किए गए कोड से देख सकते हैं। वही तो मैंने कहा। ऐसा लगता है कि इसे डिक्रिप्टिंग में निजी कुंजी की आवश्यकता है। – Albert
यदि आपके पास केवल क्रिप्टोग्राफी का प्राथमिक ज्ञान है, तो यह एपीआई का उपयोग उन तरीकों से करने के लिए नहीं करता है, जिनका उपयोग नहीं किया जाना चाहिए। मुझे 10 साल का अनुभव मिला है और यहां तक कि मैं बहुत सावधान हूं जब मैं क्रिप्टोग्राफिक पुस्तकालयों का उपयोग उन तरीकों से कर रहा हूं जिनके बारे में मुझे नहीं माना जाता है - और मैं ऐसा करने के लिए इतना संभव प्रयास करने से बचने की कोशिश करता हूं। –