I am having a problem in XML decryption. My XML Encryption(element's content) is running absolutely fine. While Decrypting I am getting an error
" XMLCipher::decryptElement called without a key and unable to resolve org.apache.xml.security.encryption.XMLEncryptionException: No Key Encryption Key loaded and cannot determine using key resolvers" How do i Get the key value with which will i decrypt from the KeyInfo Element which is in the encrypted document???????? Please help me out. Thanks a lot in advance. __________________________________________________ Do You Yahoo!? Tired of spam? Yahoo! Mail has the best spam protection around http://mail.yahoo.com
/* * Created on Mar 22, 2005 * * TODO To change the template for this generated file go to * Window - Preferences - Java - Code Generation - Code and Comments */ import java.io.File; import java.io.FileOutputStream; import java.security.Key; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESedeKeySpec; import org.apache.xml.security.encryption.XMLCipher; import org.apache.xml.security.utils.JavaUtils; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import javax.xml.transform.TransformerFactory; import javax.xml.transform.Transformer; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.OutputKeys; import org.apache.xml.security.utils.EncryptionConstants; import org.apache.xml.security.encryption.XMLEncryptionException; /** * @author Anshuk_PalChaudhuri * * TODO To change the template for this generated type comment go to * Window - Preferences - Java - Code Generation - Code and Comments */ public class Decrypter { /** [EMAIL PROTECTED] org.apache.commons.logging} logging facility */ static org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog( Decrypter.class.getName()); static { org.apache.xml.security.Init.init(); } private static Document loadEncryptionDocument() throws Exception { String fileName = "encryptedInfo.xml"; File encryptionFile = new File(fileName); javax.xml.parsers.DocumentBuilderFactory dbf = javax.xml.parsers.DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); javax.xml.parsers.DocumentBuilder db = dbf.newDocumentBuilder(); Document document = db.parse(encryptionFile); System.out.println( "Encryption document loaded from " + encryptionFile.toURL().toString()); return document; } private static SecretKey loadKeyEncryptionKey() throws Exception { String fileName = "kek"; String jceAlgorithmName = "DESede"; File kekFile = new File(fileName); DESedeKeySpec keySpec = new DESedeKeySpec(JavaUtils.getBytesFromFile(fileName)); SecretKeyFactory skf = SecretKeyFactory.getInstance(jceAlgorithmName); SecretKey key = skf.generateSecret(keySpec); System.out.println("Key Value: " + key); System.out.println( "Key encryption key loaded from " + kekFile.toURL().toString()); return key; } private static void outputDocToFile(Document doc, String fileName) throws Exception { File encryptionFile = new File(fileName); FileOutputStream f = new FileOutputStream(encryptionFile); TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer(); transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); DOMSource source = new DOMSource(doc); StreamResult result = new StreamResult(f); transformer.transform(source, result); f.close(); System.out.println( "Wrote document containing decrypted data to " + encryptionFile.toURL().toString()); } public static void main(String args[]) throws Exception { Document document = loadEncryptionDocument(); /*NodeList nodeList = document.getElementsByTagName("xenc:CipherValue"); Element encryptedElement = (Element) nodeList.item(0); System.out.println(encryptedElement.getFirstChild());*/ Element encryptedData = (Element) document.getElementsByTagNameNS( EncryptionConstants.EncryptionSpecNS, EncryptionConstants._TAG_ENCRYPTEDDATA).item(0); NodeList childNodes = encryptedData.getChildNodes(); Element getElement = (Element) childNodes.item(2); System.out.println(getElement.getFirstChild().getFirstChild().getNodeValue()); /*NodeList childNodes = encryptedElement.getChildNodes(); Element getElement = (Element) childNodes.item(2); System.out.println(getElement.getFirstChild().getFirstChild().getNodeValue());*/ /*NodeList enKeynl = document.getElementsByTagName("xenc:EncryptedKey"); Element enKey = (Element) enKeynl.item(0); NodeList childKeyNodes = enKey.getChildNodes(); Element getKeyEle = (Element) childKeyNodes.item(1); System.out.println(getKeyEle.getFirstChild().getFirstChild().getNodeValue());*/ /* * Load the key to be used for decrypting the xml data * encryption key. */ Key kek = loadKeyEncryptionKey(); XMLCipher xmlCipher = XMLCipher.getInstance(); /* * The key to be used for decrypting xml data would be obtained * from the keyinfo of the EncrypteData using the kek. */ xmlCipher.init(XMLCipher.DECRYPT_MODE, null); xmlCipher.setKEK(kek); try { byte[] a = xmlCipher.decryptToByteArray(encryptedData); } catch(XMLEncryptionException xencrexcep) { System.out.println(xencrexcep.toString()); } //xmlCipher.loadEncryptedData(document,encryptedElement); /* * The following doFinal call replaces the encrypted data with * decrypted contents in the document.*/ // xmlCipher.doFinal(document,encryptedData); /* * The key to be used for decrypting xml data would be obtained * from the keyinfo of the EncrypteData using the kek. * xmlCipher.init(XMLCipher.DECRYPT_MODE, null); xmlCipher.setKEK(kek); System.out.print(kek); /* * The following doFinal call replaces the encrypted data with * decrypted contents in the document. * //System.out.println(); //xmlCipher.doFinal(document,encryptedElement); //outputDocToFile(document, "decryptedInfo.xml");*/ } }
/* * Created on Mar 22, 2005 * * TODO To change the template for this generated file go to * Window - Preferences - Java - Code Generation - Code and Comments */ import java.io.File; import java.io.FileOutputStream; import java.security.Key; import javax.crypto.SecretKey; import javax.crypto.KeyGenerator; import org.apache.xml.security.keys.KeyInfo; import org.apache.xml.security.encryption.EncryptedKey; import org.apache.xml.security.encryption.XMLCipher; import org.apache.xml.security.encryption.EncryptedData; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import javax.xml.transform.TransformerFactory; import javax.xml.transform.Transformer; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.OutputKeys; /** * @author Anshuk_PalChaudhuri * * TODO To change the template for this generated type comment go to * Window - Preferences - Java - Code Generation - Code and Comments */ public class Encrypter { /** [EMAIL PROTECTED] org.apache.commons.logging} logging facility */ static org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog( Encrypter.class.getName()); static { org.apache.xml.security.Init.init(); } private static Document createSampleDocument() throws Exception { javax.xml.parsers.DocumentBuilderFactory dbf = javax.xml.parsers.DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); javax.xml.parsers.DocumentBuilder db = dbf.newDocumentBuilder(); Document document = db.newDocument(); /** * Build a sample document. It will look something like: * * <RootElement> * <text1>ABC</text1> * <text2>ABC</text2> * </RootElement> */ Element root = document.createElement("RootElement"); document.appendChild(root); root.appendChild(document.createTextNode("\n")); Element childElement1 = document.createElement("text1"); childElement1.appendChild( document.createTextNode("ABC")); root.appendChild(childElement1); root.appendChild(document.createTextNode("\n")); Element childElement2 = document.createElement("text2"); childElement2.appendChild( document.createTextNode("XYZ")); root.appendChild(childElement2); root.appendChild(document.createTextNode("\n")); return document; } private static SecretKey GenerateAndStoreKeyEncryptionKey() throws Exception { String jceAlgorithmName = "DESede"; KeyGenerator keyGenerator = KeyGenerator.getInstance(jceAlgorithmName); SecretKey kek = keyGenerator.generateKey(); byte[] keyBytes = kek.getEncoded(); File kekFile = new File("kek"); FileOutputStream f = new FileOutputStream(kekFile); f.write(keyBytes); f.close(); System.out.println( "Key encryption key stored in " + kekFile.toURL().toString()); return kek; } private static SecretKey GenerateDataEncryptionKey() throws Exception { String jceAlgorithmName = "AES"; KeyGenerator keyGenerator = KeyGenerator.getInstance(jceAlgorithmName); keyGenerator.init(128); return keyGenerator.generateKey(); } private static void outputDocToFile(Document doc, String fileName) throws Exception { File encryptionFile = new File(fileName); FileOutputStream f = new FileOutputStream(encryptionFile); TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer(); transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); DOMSource source = new DOMSource(doc); StreamResult result = new StreamResult(f); transformer.transform(source, result); f.close(); System.out.println( "Wrote document containing encrypted data to " + encryptionFile.toURL().toString()); } public static void main(String args[]) throws Exception { Document document = createSampleDocument(); /* * Get a key to be used for encrypting the element. * Here we are generating an AES key. */ Key symmetricKey = GenerateDataEncryptionKey(); System.out.println("Data: " + symmetricKey.getAlgorithm()); /* * Get a key to be used for encrypting the symmetric key. * Here we are generating a DESede key. */ Key kek = GenerateAndStoreKeyEncryptionKey(); System.out.println(kek); System.out.println("Key: " + kek.getEncoded()); String algorithmURI = XMLCipher.TRIPLEDES; System.out.println(" algorithmURI " + algorithmURI); /*------------------------------------------*/ XMLCipher keyCipher = XMLCipher.getInstance(algorithmURI); keyCipher.init(XMLCipher.WRAP_MODE,kek); EncryptedKey encryptedKey = keyCipher.encryptKey(document,kek); /*-----------------------------------------*/ //System.out.println(" EncryptedKey " + encryptedKey); /* * Let us encrypt the contents of the document element. */ //Mention which particular element content we want to encrypt NodeList nodeList = document.getElementsByTagName(args[0]); Element encryptElement = (Element) nodeList.item(0); algorithmURI = XMLCipher.AES_128; XMLCipher xmlCipher = XMLCipher.getInstance(algorithmURI); xmlCipher.init(XMLCipher.ENCRYPT_MODE, symmetricKey); /* * Setting keyinfo inside the encrypted data being prepared. */ EncryptedData encryptedData = xmlCipher.getEncryptedData(); KeyInfo keyInfo = new KeyInfo(document); keyInfo.add(encryptedKey); encryptedData.setKeyInfo(keyInfo); /* * doFinal - * "true" below indicates that we want to encrypt element's content * and not the element itself. Also, the doFinal method would * modify the document by replacing the EncrypteData element * for the data to be encrypted. */ xmlCipher.doFinal(document, encryptElement, true); /* * Output the document containing the encrypted information into * a file. */ outputDocToFile(document, "encryptedInfo.xml"); } }