import java.io.ByteArrayInputStream;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.apache.xml.security.encryption.EncryptedData;
import org.apache.xml.security.encryption.XMLCipher;
import org.apache.xml.security.keys.KeyInfo;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class TestExtraXmlns
{
	public static void main(String[] argv) throws Exception
	{
	    final String DATA = "<env:Envelope xmlns:env=\"http://schemas.xmlsoap.org/soap/envelope/\"><env:Body><elem>11</elem><elem>22</elem></env:Body></env:Envelope>";

        org.apache.xml.security.Init.init();
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        dbf.setNamespaceAware(true);
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(new ByteArrayInputStream(DATA.getBytes("UTF8")));
        printDoc("Original:", doc);

        byte[] bits192 = "abcdefghijklmnopqrstuvwx".getBytes();
        DESedeKeySpec keySpec = new DESedeKeySpec(bits192);
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
        SecretKey secretKey = keyFactory.generateSecret(keySpec);

        XMLCipher dataCipher = XMLCipher.getInstance(XMLCipher.TRIPLEDES);
        dataCipher.init(XMLCipher.ENCRYPT_MODE, secretKey);

        KeyInfo keyInfo = new KeyInfo(doc);
    	keyInfo.addKeyName("mykey");

    	EncryptedData encryptedData = dataCipher.getEncryptedData();
        encryptedData.setKeyInfo(keyInfo);

        NodeList dataToEncrypt = doc.getElementsByTagName("elem");
        for (int i = 0; i < dataToEncrypt.getLength(); i++) {
            dataCipher.doFinal(doc, (Element) dataToEncrypt.item(i));
        }
        printDoc("Encrypted:", doc);
        
        XMLCipher deCipher = XMLCipher.getInstance(XMLCipher.TRIPLEDES);
        deCipher.init(XMLCipher.DECRYPT_MODE, secretKey);
        
        NodeList dataToDecrypt = doc.getElementsByTagNameNS("http://www.w3.org/2001/04/xmlenc#", "EncryptedData");
        for (int i = 0; i < dataToDecrypt.getLength(); i++) {
            deCipher.doFinal(doc, (Element) dataToDecrypt.item(i));
        }
        printDoc("Decrypted:", doc);
    }
	
	private static void printDoc(String label, Document doc) throws Exception
	{
        System.out.println(label);
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer t = tf.newTransformer();
        t.transform(new DOMSource(doc), new StreamResult(System.out));
        System.out.println("\n\n");
	}
}
