读书人

应用DES 加密方式对文件进行加密!

发布时间: 2012-08-28 12:37:01 作者: rapoo

使用DES 加密方式对文件进行加密!!!
DES加密由于在java中非常方便使用,而且性能不错,所以非常流行!!!
使用DES 首先需要密钥。。2种方法:第一自己设置

//自己设置private final static String encodeKey ="moomaia";  private Key getKey() throws Exception {// 创建一个空的8位字节数组(默认值为0)byte[] arrBTmp = encodeKey.getBytes();System.out.println(arrBTmp.length);byte[] arrB = new byte[8];// 将原始字节数组转换为8位for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {arrB[i] = arrBTmp[i];}// 生成密钥System.out.println(arrB.length);Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES");return key;}    



第二种:系统生成:
 private void createKey() {        try {            // 得到密钥的实例 以什么方式加密。加密的方式比较多。            KeyGenerator kg = KeyGenerator.getInstance("DES");            kg.init(56);                        SecretKey key = kg.generateKey();            // 将生成的密钥对象写入文件。            ObjectOutputStream objectOutputStream = new ObjectOutputStream(                    new FileOutputStream(new File("e:\\key.obj")));            objectOutputStream.writeObject(key);        } catch (NoSuchAlgorithmException e) {            e.printStackTrace();        } catch (FileNotFoundException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }    } /**     * @param KeyFilePath     *            密钥Key对象的路径。注意使用该方法的时候,确保你已经生成了密钥。     * @return     * @Description 从文件中读出Key,用于加密使用。     */    private static Key getKey(String KeyFilePath) {        Key key = null;        try {            // 将生成的密钥对象从文件中读取出来,然后再强制转换成一个密钥对象。            ObjectInputStream objectInputStream = new ObjectInputStream(                    new FileInputStream(new File(KeyFilePath)));            key = (Key) objectInputStream.readObject();        } catch (FileNotFoundException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        } catch (ClassNotFoundException e) {            e.printStackTrace();        }        return key;    }



有了密钥之后开始对文件加密:详情见代码:【酷毙程序员,一切都在代码中】

 /**     *      * 字符串加密  ---byte[]     * @param source     * @return 放回一个byte数组,为什么不放回字符串,是因为解密的时候要传入这个byte数组才能进行解密,如果解密的时候传入的是字符串     *         那么就会出错,愿意是编码的问题。     * @throws Exception      * @Description 将传入的字符串进行加密 下面写了将这种byte数组转换成字符串的方法。直接在调用就行了。     */    public  String encrypt(String source) throws Exception {    byte[] target =null;    File srcFile = new File(source);    System.out.println(srcFile.getCanonicalPath());    if(!srcFile.exists()){    System.out.println("文件不存在");    }    String newName = srcFile.getAbsolutePath()+".m";    FileInputStream fis = new FileInputStream(srcFile);    int fileSize = fis.available();    FileOutputStream fos = new FileOutputStream(new File(newName));        Key key = getKey();        try {        Cipher cipher = Cipher.getInstance("DES");        cipher.init(Cipher.ENCRYPT_MODE, key);        byte[] buf = new byte[fileSize];        System.out.println(fileSize);        int c = 0;        while((c=fis.read(buf))!=-1){        target = cipher.doFinal(buf);        //base64encoder.encode(target,fos);        fos.write(target);        }        } catch (NoSuchAlgorithmException e) {            e.printStackTrace();        } catch (NoSuchPaddingException e) {            e.printStackTrace();        } catch (UnsupportedEncodingException e) {            e.printStackTrace();        } catch (InvalidKeyException e) {            e.printStackTrace();        } catch (IllegalBlockSizeException e) {            e.printStackTrace();        } catch (BadPaddingException e) {            e.printStackTrace();        }        return newName;    }


当然也可分成小点方法:代码就好的看点

把解密分开写:

/**     * 解密----byte[]     * @param source     *            加密后的byte数组。可用加密方法encrypt(“String”)生成即可     * @return 解密后的字符串。     * @throws Exception      * @Description 解密算法。     */    public  byte[] decrypt(byte[] source) {        byte[] dissect = null;        try {            Key key = getKey();            Cipher cipher = Cipher.getInstance("DES");            cipher.init(Cipher.DECRYPT_MODE, key);// 使用私钥解密            dissect = cipher.doFinal(source);        } catch (NoSuchAlgorithmException e) {            e.printStackTrace();        } catch (NoSuchPaddingException e) {            e.printStackTrace();        } catch (InvalidKeyException e) {            e.printStackTrace();        } catch (IllegalBlockSizeException e) {            e.printStackTrace();        } catch (BadPaddingException e) {            e.printStackTrace();        } catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}        return dissect;    }            /**从File ---->byte[]     * @return     * @Description 由于加密之前采用了编码的格式 所以现在采用特点的方式读出来 ,然后得到用一个byte[]用于解码。     */    public byte[] getByteFromFile(){        //BASE64Decoder base64decoder = new BASE64Decoder();     byte[] encodeByte =null;        try {           // encodeByte = base64decoder.decodeBuffer(new FileInputStream(new File("D:\\t.txt")));            FileInputStream fis =new FileInputStream(new File("D:\\ch03.pdf.m"));            int fileSize = fis.available();            encodeByte = new byte[fileSize];            fis.read(encodeByte);        } catch (FileNotFoundException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }        return encodeByte;    }        /**     * 写入文件     * @param b     * @param filePath     * @Description 将指定的字节写入到文件中。     */    public  void writeByteToFile(byte[] b, String filePath) {        File file = new File(filePath);        if (!file.exists()) {            try {                file.createNewFile();            } catch (IOException e) {                e.printStackTrace();            }        }        FileOutputStream fileOutputStream;        try {            fileOutputStream = new FileOutputStream(file);                        fileOutputStream.write(b);            fileOutputStream.close();        } catch (IOException e) {            e.printStackTrace();        }    }


测试代码:速度相当之快,DES>>base64encode.估计也是流行原因之一

 public static void main(String[] args) throws Exception {        DESofFile desf= new DESofFile();    //desf.createKey();    Date times = new Date();    long start = times.getTime();    desf.encrypt("d:\\ch03.pdf");    desf.writeByteToFile(desf.decrypt(desf.getByteFromFile()), "d:\\ch03-9.pdf");    Date times2 = new Date();    long end =times2.getTime();        System.out.println(end - start);    }


引用
本人菜鸟。错误的地方虚心请教!!谢谢

读书人网 >编程

热点推荐