के बीच आरएसए हस्ताक्षरों को पार करने में समस्या मैं पाइथन 2 में एक क्लाइंट लिख रहा हूं जिसमें पाइथन-क्रिप्टो एपीआई डिजिटल रूप से एक्सएमएल फ़ाइल पर हस्ताक्षर करने के लिए है और मेरे पास स्केल में लिखी गई एक सेवा है जो हस्ताक्षर को सत्यापित करने का अनुमान है।पाइथन और जावा/स्कैला
from Crypto.PublicKey import RSA
from Crypto.Hash import SHA
from os import urandom
import logging
...
...
कुंजी उत्पन्न करने के लिए (keysize 2048 है):: मेरे अजगर कोड कुछ इस तरह दिखता
self.__key = RSA.generate(self.keySize,urandom)
self.__private_key = self.__key.exportKey()
self.__public_key = self.__key.publickey().exportKey()
with open(pubPath,'w') as fpub:
logging.info("Writing Public Key to %s" % pubPath)
fpub.write(self.__public_key)
with open(priPath,'w') as fpri:
logging.info("Writing Private Key to %s" % priPath)
fpri.write(self.__private_key)
और कुंजी में पढ़ने के लिए:
self.__private_key = fpri.read()
self.__public_key = fpub.read()
self.__key = RSA.importKey(self.__private_key)
और डिजिटल हस्ताक्षर करने के लिए
logging.debug('Data to sign: "%s"' % data)
digest = SHA.new(data.strip()).digest()
return str(self.__key.sign(digest, None)[0])
फिर स्कैन में
package com.example.security
import com.example.action.ActionRequest
import java.io.BufferedInputStream
import java.security.spec.X509EncodedKeySpec
import java.security.KeyFactory
import java.security.PublicKey
import java.security.Signature
import org.apache.log4j.Logger
class SignatureSecurityManageer extends SecurityManagerTrait {
def loadPublicKey() : PublicKey = {
val stream : BufferedInputStream = new BufferedInputStream(this.getClass().getResourceAsStream("/com/example/security/key.der"))
var key = new Array[Byte](stream.available())
stream.read(key)
KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(key))
}
def securityFilter(req : ActionRequest) : Boolean = {
var parts = req.data.split("\n\n")
var log : Logger = Logger.getLogger(this.getClass());
log.trace("Data \"%s\"".format(parts(0)))
log.trace("Sig \"%s\"".format(parts(1)))
var sg = Signature.getInstance("SHA1withRSA");
sg.initVerify(loadPublicKey())
sg.update(parts(0).trim().getBytes())
sg.verify(parts(1).trim().getBytes())
}
}
मैं एक द्विआधारी सार्वजनिक कुंजी में पीईएम सार्वजनिक ग्राहक द्वारा उत्पन्न कुंजी बदलना तो यह जावा द्वारा पढ़ा जा सकता: आला/जावा, मैं निम्नलिखित का उपयोग
openssl rsa -in src/com/example/security/key.pub -inform PEM -out src/com/example/security/key.der -outform DER -pubin
परिवहन में, मैं एक्सएमएल और हस्ताक्षर को डबल नई लाइनों से अलग करता हूं। मैं पीछे चल एहसास खाली स्थान के लिए समस्या पेश कर सकते हैं तो मैं उन पट्टी जोड़ा/ऊपर ट्रिम और मैं लॉग की जांच और सत्यापित करें कि डेटा समान होता है:
अजगर ग्राहक:
2012-04-09 14:24:51,089: Data to sign: "<?xml version="1.0" ?><AgraData><package id="Local-Laptop" timestamp="1333945491074"><sensors><sensor id="SUMTEMP001" type="Temperature" units="C"><data>8</data></sensor><sensor id="SUMVOL001" type="Volume" units="l"><data>27</data></sensor><sensor id="SUMFLO001" type="FlowRate" units="l"><data>41.142</data></sensor></sensors></package></AgraData>"
स्काला सेवा:
[2012-04-09 14:24:51,771] com.urbanalta.agrastore.security.SignatureSecurityManageer TRACE - Data "<?xml version="1.0" ?><AgraData><package id="Local-Laptop" timestamp="1333945491074"><sensors><sensor id="SUMTEMP001" type="Temperature" units="C"><data>8</data></sensor><sensor id="SUMVOL001" type="Volume" units="l"><data>27</data></sensor><sensor id="SUMFLO001" type="FlowRate" units="l"><data>41.142</data></sensor></sensors></package></AgraData>"
लेकिन स्कैला सेवा के भीतर, जब मैं हस्ताक्षर सत्यापित करने का प्रयास करता हूं तो यह झूठा होता है। मुझे लगता है कि कहीं मैं सही हस्ताक्षर/कुंजी प्रकार निर्दिष्ट नहीं कर रहा हूं, लेकिन मुझे यकीन नहीं है कि कहां है।
क्या आप पहले यह सुनिश्चित कर सकते हैं कि हस्ताक्षरित स्ट्रिंग और सत्यापित किया जा रहा है * बिल्कुल * वही है? उदाहरण के लिए आप उनमें से एसएचए की जांच कर सकते हैं। यह संभव हो सकता है कि एन्कोडिंग ने कुछ अक्षर बदल दिए हैं। – Jus12
कुछ विचार ... (बीटीडब्ल्यू, मैंने कभी पाइथन का उपयोग नहीं किया है)। (1) क्या पाइथन की एसएचए विधि स्कैला में SHA1 विधि के समान है? [यह] देखें (http://www.rsa.com/rsalabs/node.asp?id=2252)। (2) जांचें कि पाइथन विधि आंतरिक रूप से SHA1 की गणना करती है या नहीं। पाचन के बजाय 'data.strip() '' sign' विधि को पास करने का प्रयास करें। – Jus12