我用jdom这个工具生成了xml文档,然后上传到别的机器上再利用java中的jdom程序解析入库,请问如何对生成的这个xml文档进行加密呢?就是在磁盘上直接打开这个xml文件的时候,看不到里面的内容,或者里面的内容乱码显示!谢谢。

解决方案 »

  1.   

    xml加密不是简单的用个加密算法就行的,xml中的数据可以有二进制的或非二进制
      

  2.   

    写个加密的类或方法,在生成的时候调用一下就行,就像批处理一样。用des就行,具体的 des类,网上很多呢。
      

  3.   

    下面的代码演示了DES加密文件的方法
    你在用的时候,记得2边要用一样的Key,Key是实现了java.io.Serializable的,因此可以把它保存到文件,也可以从文件中把它恢复成一个对象。
    import java.io.*;import javax.crypto.*;
    import java.security.*;public class DESCryptoTest {
      public static void main(String[] args) {
    //    Security.addProvider(new com.sun.crypto.provider.SunJCE());
        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
        KeyGenerator kg = null;
        try {
          //指定算法,这里为DES;如果想用Blowfish算法,则用 getInstance("Blowfish")
          //BouncyCastle基本上支持所有通用标准算法
          kg = KeyGenerator.getInstance("DES", "BC");      //指定密钥长度,长度越高,加密强度越大
          kg.init(56);      //产生密钥
          Key key = kg.generateKey();
          System.out.println("Key format: " + key.getFormat());
          System.out.println("Key algorithm: " + key.getAlgorithm());      //加密要用Cipher来实现
          Cipher cipher = Cipher.getInstance("DES");
          System.out.println("Cipher provider: " + cipher.getProvider());
          System.out.println("Cipher algorithm: " + cipher.getAlgorithm());      byte[] data = "Hello World!".getBytes();
          System.out.println("Original data : [" + data.length + "]" +
                             new String(data));      //设置加密模式
          cipher.init(Cipher.ENCRYPT_MODE, key);
          byte[] result = cipher.doFinal(data);
          System.out.println("Encrypted data: [" + result.length + "]" +
                             new String(result));      //设置解密模式
          cipher.init(Cipher.DECRYPT_MODE, key);
          byte[] original = cipher.doFinal(result);
          System.out.println("Decrypted data: [" + original.length + "]" +
                             new String(original));      String filename = "d:\\加密前.txt";
          //读入并加密文件
          try {
            //输入流
            cipher.init(Cipher.ENCRYPT_MODE, key);
            BufferedInputStream in = new BufferedInputStream(new FileInputStream(filename));
            //输出流
            CipherOutputStream out = new CipherOutputStream(new BufferedOutputStream(new FileOutputStream("d:\\加密后.txt")), cipher);
            int i;
            do {
              i = in.read();
              if (i != -1)
                out.write(i);
            }
            while (i != -1);        in.close();
            out.close();
            System.out.println("加密文件完成!");
          }
          catch (Exception ey5) {
            System.out.println("Error when encrypt the file");
            System.exit(0);
          }      try {
            cipher.init(Cipher.DECRYPT_MODE, key);
            //输出流
            BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("d:\\解密后.txt"));
            //输入流
            CipherInputStream in = new CipherInputStream(new BufferedInputStream(
                new FileInputStream("d:\\加密后.txt")), cipher);        int i;
            do {
              i = in.read();
              if (i != -1)
                out.write(i);
            }
            while (i != -1);        in.close();
            out.close();
            System.out.println("解密文件完成!");
          }
          catch (Exception ey5) {
            System.out.println("Error when encrypt the file");
            System.exit(0);
          }
        }
        catch (Exception e) {
          e.printStackTrace();
        }
      }
    }
      

  4.   

    java JCE自己提供了DES算法,把上面的代码改一下:    Security.addProvider(new com.sun.crypto.provider.SunJCE());//    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
        KeyGenerator kg = null;
        try {
          //指定算法,这里为DES;如果想用Blowfish算法,则用 getInstance("Blowfish")
          //BouncyCastle基本上支持所有通用标准算法
          kg = KeyGenerator.getInstance("DES");
      

  5.   


    兄弟,请您给个xml中包含二进制数据(例如图片什么的)的文件来让我开开眼界...千万别是FireFox的搜索引擎配置文件啊
      

  6.   

    有没有基于xml的加密的这方面的文章呢?纯理论的也可以呀?想学习一下。。
      

  7.   

    8楼的小弟弟,我就利用上班前的几分钟向你这种自以为是的人说明几点喽:第一,我不是什么兄弟,做软件并非只有男的才可以;
    第二,你这个表情似乎有些瞧不起人啊,只能说你水平有限,知识浅薄;
    第三,你对XML的使用,也只能停留在当配置文件使用的水平了;
    第四,我还就说一个图片的应用,让你长长见识。XML不只是用来传输纯文本数据,用来传输二进制数据也[b]绝对没问题/b]。请问,二进制数据不能转化为字节序列吗?!一个图片加密的字节序列难道和纯文本数据有区别吗,不能做为元素的内容吗?!
      

  8.   


    稍微浏览了一下你回复帖子的记录,真的是很糟糕。就说你最近的一次回复http://topic.csdn.net/u/20081214/22/a07cabd3-121b-482d-af5f-2d34704b4599.html#replyachor这是谁教你的,你连最基础的servlet怎么用都搞不清楚,还敢回复人家这个问题,别解释说自己是做cs,临时客串web开发的
      

  9.   

    duoduo MM:关于XML,runshine没说错
    在那个帖子里面的回复也是对的
      

  10.   

    每个字符的ascii码加10在写进去
      

  11.   


    呵呵,么想到duoduo竟是个MM,还是个有点敏感的MM,关于那个表情...你不喜欢,那我给你道个歉先,我只是觉得这个表情比较搞、轻松而已,没有你说的那意思,不过么想到...对不起了哈当我以忐忑不安地心情诚惶诚恐的翻开了你说的那个我回复的帖子,入木三分的阅读了一遍,可是还是么发现什么错误,只是语言简练了点而已...不过如果那帖子的LZ知道的话,这种提示已经足够;如果不知道的话,恐怕我不把代码给他,他还是不知道我在说什么,幸而在我楼下下的兄弟(希望不是MM,否则,我又错了)贴出了代码...
    谢谢hbwhwang兄的支持xml文件只是普通的文本文档,并不是里面写上010101就代表它包含了二进制代码...
    字节序列和纯文本数据在底层来看是没区别...但应用层的解释就不同了
    约定好的话,即使个000110000001的txt文件,把它解释成100+100的运算都没问题
    图片加密的字节序列....当你能看见它的时候,它就已经不再是字节序列了我之所以提到FireFox的搜索引擎配置文件,不是拿它当语气助词的...- -!
    2.0版以后的是xml(之前不是,图片和配置分开)...里面确实包含了图片信息,不过并不是你想象的二进制文件信息,依然是文本信息--把二进制信息经base64编码之后的文本信息."小弟弟"...萧瑟的寒风,脊背一阵冷意
      

  12.   


    不好意思,再问您一下,如果我的加密和解密的过程是在不同的机器上来执行的,是不是需要把加密过程中生成的key做成文件也一块传给需要解密的机器呢?如果是的话,这个过程怎么来实现呢,我是菜鸟,希望能再仔细说说,嘿嘿!
    还有这个加密算法是基于XML的么?
      

  13.   

    加解密算法无论是对称还是非对称,都需要密钥,加密方和解密方的密钥要配套。对称加密需要2者一直,非对称需要2者匹配(密钥对)。
    上面给的DES算法是对称算法,所以需要2边用一样的密钥。
    我给的代码里面:
         //产生密钥
          Key key = kg.generateKey();
    这个Key就是密钥,2边都要用的。
    这个Key类是实现了Serialize接口的,所以可以用对象的形式写到文件里面,也可以从文件读到对象里面(还原成对象)。
    你先写一个程序,用Key key = kg.generateKey();产生Key,然后把它保存到文件里面,把这个文件复制到2边。
    在加密端,你写代码从这个文件读出密钥,用这个密钥加密文件。
    在解密端,你写代码从这个文件读出密钥,用这个密钥解密文件。
     
    XML从本质上来讲就是文本文件,我上面给的例子就是对文本文件加解密的。
      

  14.   

     hbwhwang 大哥,真的谢谢你这么详细的解答!最后弱弱的问个问题。。这个key,用对象的形式写到文件里面,是怎么写的呢?能否再给点提示。。我不大很会写。。还有,我们的项目鉴定,人家问我们是怎么加密的,我告诉他用的是des加密算法,人家会不会说这个已经过时了,不让用了呢?
      

  15.   


          //以对象方式保存私钥
          ObjectOutputStream keyFile = new ObjectOutputStream(new FileOutputStream("key.dat"));
          keyFile.writeObject(key);
          keyFile.close();要是还不清楚,你就得去看看JAVA IO的内容了DES加密算法的确是一个比较老的算法了,如果你要新一点的,可以用Blowfish,它是可以替代DES的对称加密算法。
    我的代码里面已经写了怎么用Blowfish算法
    //指定算法,这里为DES;如果想用Blowfish算法,则用 getInstance("Blowfish")
      

  16.   

    知道了,谢谢,呵呵!
    用这个算法的话,其他地方,比如生成key文件之类的操作,同des都是一样的对吧?
    真的谢谢你的细心帮助!
      

  17.   

    嗯。一般采用des加密的比较多。