无线&移动互联网技术研发

换位思考·····
posts - 19, comments - 53, trackbacks - 0, articles - 283
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

DES 加密工具类(二)

Posted on 2009-06-02 09:34 Gavin.lee 阅读(402) 评论(0)  编辑  收藏 所属分类: java SE & EE

续加密工具类(一),这个我没用过,但是看上去没什么问题,而且详细到受不了。

package com.Gavin.tools.des;

import
 java.util.ResourceBundle;
/**
 * @descripte load resource
 * 
@author Gavin.lee
 * @date 2009-5-19上午09:49:32
 * 
@version
 1.0
 *
 
*/

public class ResourceLoader {
    
private
 ResourceBundle resBundle;
    
    
public ResourceLoader(String resourceName) 
{
        resBundle 
=
 ResourceBundle.getBundle(resourceName);
    }

    
    
public String getString(String key) {
        
return
 resBundle.getString(key);
    }

    
    
public static void main(String args[]) {
        
new ResourceLoader("config").getString("username"
);
    }

}



package com.Gavin.tools.des;

import
 java.io.BufferedInputStream;
import
 java.io.File;
import
 java.io.BufferedOutputStream;
import
 java.io.IOException;
import
 java.io.FileInputStream;
import
 java.io.FileOutputStream;
import
 java.util.ResourceBundle;
import
 java.util.Locale;

public class Util 
{

    
/**
     * 资源读取类
     
*/

    
private static ResourceBundle resources = null;
    
/**
     * 初始化资源
     
*/

    
static {
        
new
 Util();
    }


    
public Util() {
        resources 
= ResourceBundle.getBundle("algorithm"
, Locale.getDefault());

    }


    
/**
     * 读取源文件内容
     * 
@param filename String 文件路径
     * 
@throws
 IOException
     * 
@return
 byte[] 文件内容
     
*/

    
public static byte[] readFile(String filename) throws IOException {

        File file 
= new
 File(filename);
        
if (filename == null || filename.equals("")) 
{
            
throw new NullPointerException("无效的文件路径"
);
        }

        
long len = file.length();
        
byte[] bytes = new byte[(int
) len];

        BufferedInputStream bufferedInputStream 
= new BufferedInputStream(new
 FileInputStream(file));
        
int r =
 bufferedInputStream.read(bytes);
        
if (r !=
 len)
            
throw new IOException("读取文件不正确"
);
        bufferedInputStream.close();

        
return
 bytes;

    }


    
/**
     * 将加密的数据写入文件
     * 
@param data byte[]
     * 
@throws
 IOException
     
*/

    
public static void writeFile(byte[] data, String filename)
            
throws IOException 
{
        File file 
= new
 File(filename);
//        System.out.println(file.getParentFile());

        file.getParentFile().mkdirs();
        BufferedOutputStream bufferedOutputStream 
= new BufferedOutputStream(new
 FileOutputStream(file));
        bufferedOutputStream.write(data);
        bufferedOutputStream.close();

    }


    
/**
     * 从jar文件里读取class
     * 
@param filename String
     * 
@throws
 IOException
     * 
@return
 byte[]
     
*/

    
public byte[] readFileJar(String filename) throws IOException {
        BufferedInputStream bufferedInputStream 
= new
 BufferedInputStream(
                getClass().getResource(filename).openStream());
        
int len =
 bufferedInputStream.available();
        
byte[] bytes = new byte
[len];
        
int r =
 bufferedInputStream.read(bytes);
        
if (len != r) 
{
            bytes 
= null
;
            
throw new IOException("读取文件不正确"
);
        }

        bufferedInputStream.close();
        
return bytes;
    }


    
/**
     * 获得密码生成法则
     * 
@return String
     
*/

    
public static String getAlgorithm() {
        
return resources.getString("algorithm"
);
    }


    
/**
     * 获得值
     * 
@param skey String
     * 
@return
 String
     
*/

    
public static String getValue(String skey) {
        
return
 resources.getString(skey);
    }

}



package com.Gavin.tools.des;

import
 java.security.SecureRandom;
import
 javax.crypto.KeyGenerator;
import
 java.security.NoSuchAlgorithmException;
import
 java.util.Locale;
import
 java.util.ResourceBundle;

import
 javax.crypto.SecretKey;

import
 com.Gavin.tools.util.WriteLog;

import java.io.*
;

public class CreateKey 
{
    String keyfilepath 
= ""
;

    
public CreateKey() 
{        
        
this.keyfilepath = new ResourceLoader("algorithm").getString("keypath"
);
    }


    
/**
     * 获得密匙字节内容
     * 
@throws IOException
     * 
@return
 byte[]
     
*/

    
public byte[] getKeyByte() throws IOException {
        
byte[] bytes =
 Util.readFile(keyfilepath);
        
return
 bytes;
    }


    
public void CreateKeyFile(String filename) throws IOException,
            NoSuchAlgorithmException 
{
        
this.keyfilepath =
 filename;
        
if (filename == null || filename.equals("")) 
{
            
throw new NullPointerException("无效的文件路径"
);
        }

        createKey();
    }


    
/**
     * 生成密匙
     * 
@throws NoSuchAlgorithmException
     * 
@throws
 IOException
     
*/

    
private void createKey() throws NoSuchAlgorithmException, IOException {
        SecureRandom secureRandom 
= new
 SecureRandom();
        
// 为我们选择的DES算法生成一个KeyGenerator对象

        KeyGenerator kg = KeyGenerator.getInstance(Util.getValue("algorithm"));
//        keyfilepath = Util.getValue("keypath");

        kg.init(secureRandom);
        
// 生成密钥

        SecretKey key = kg.generateKey();
        
// 将密钥数据保存为文件供以后使用

        
        System.out.println(Util.getValue(
"algorithm"
));
        System.out.println(keyfilepath);
        
        Util.writeFile(key.getEncoded(), keyfilepath);
    }


    
/**
     * 获得密匙文件路径
     * 
@return String
     
*/

    
public String getKeyFilePath() {
        
return
 keyfilepath;
    }

    
    
public static void main(String args[]) {
        CreateKey cKey 
= new
 CreateKey();
        
try 
{
            cKey.createKey();
        }
 catch (NoSuchAlgorithmException e) 
{
            e.printStackTrace();
        }
 catch (IOException e) 
{
            e.printStackTrace();
        }

    }

}



package com.Gavin.tools.des;

import
 java.security.SecureRandom;
import java.io.*
;
import
 javax.crypto.spec.DESKeySpec;
import
 javax.crypto.SecretKey;
import
 javax.crypto.SecretKeyFactory;
import
 javax.crypto.Cipher;
import
 java.security.InvalidKeyException;
import
 java.security.NoSuchAlgorithmException;
import
 java.security.spec.InvalidKeySpecException;
import
 javax.crypto.NoSuchPaddingException;
import
 javax.crypto.BadPaddingException;
import
 javax.crypto.IllegalBlockSizeException;
import
 java.lang.reflect.Constructor;
import
 java.security.spec.KeySpec;
import
 java.lang.reflect.InvocationTargetException;

public class EncryptData 
{

    
private String keyfilepath = null
;

//
    public EncryptData() {
//    }


    
public EncryptData() {
        
this.keyfilepath = new ResourceLoader("algorithm").getString("keypath"
);
    }


    
/**
     * 加密文件
     * 
@param filename String 源路径
     * 
@param
 filenamekey String 加密后的路径
     
*/

    
public void createEncryptData(String filename, String filenamekey)
            
throws
 IllegalStateException, IllegalBlockSizeException,
            BadPaddingException, NoSuchPaddingException,
            InvalidKeySpecException, NoSuchAlgorithmException,
            InvalidKeyException, IOException, InstantiationException,
            IllegalAccessException, IllegalArgumentException,
            InvocationTargetException, NoSuchMethodException,
            SecurityException, ClassNotFoundException, IllegalStateException,
            IllegalBlockSizeException, BadPaddingException,
            NoSuchPaddingException, InvalidKeySpecException,
            NoSuchAlgorithmException, InvalidKeyException, IOException 
{
        
//验证keyfile

        if (keyfilepath == null || keyfilepath.equals("")) {
            
throw new NullPointerException("无效的key文件路径"
);
        }


        encryptData(filename, filenamekey);
    }


    
/**
     * 加密类文件
     * 
@param filename String 原始的类文件
     * 
@param
 encryptfile String 加密后的类文件
     * 
@throws
 IOException
     * 
@throws
 InvalidKeyException
     * 
@throws
 NoSuchAlgorithmException
     * 
@throws
 InvalidKeySpecException
     * 
@throws
 NoSuchPaddingException
     * 
@throws
 NoSuchAlgorithmException
     * 
@throws
 BadPaddingException
     * 
@throws
 IllegalBlockSizeException
     * 
@throws
 IllegalStateException
     
*/

    
private void encryptData(String filename, String encryptfile)
            
throws
 IOException, InvalidKeyException, NoSuchAlgorithmException,
            InvalidKeySpecException, NoSuchPaddingException,
            NoSuchAlgorithmException, BadPaddingException,
            IllegalBlockSizeException, IllegalStateException,
            ClassNotFoundException, SecurityException, NoSuchMethodException,
            InvocationTargetException, IllegalArgumentException,
            IllegalAccessException, InstantiationException 
{

        
byte data[] =
 Util.readFile(filename);
        
// 执行加密操作

        byte encryptedClassData[] = getencryptData(data);
        
// 保存加密后的文件,覆盖原有的类文件。

        Util.writeFile(encryptedClassData, encryptfile);
    }


    
/**
     * 直接获得加密数据
     * 
@param bytes byte[]
     * 
@throws
 IllegalStateException
     * 
@throws
 IllegalBlockSizeException
     * 
@throws
 BadPaddingException
     * 
@throws
 InvalidKeyException
     * 
@throws
 NoSuchPaddingException
     * 
@throws
 InvalidKeySpecException
     * 
@throws
 NoSuchAlgorithmException
     * 
@throws
 InstantiationException
     * 
@throws
 IllegalAccessException
     * 
@throws
 IllegalArgumentException
     * 
@throws
 InvocationTargetException
     * 
@throws
 NoSuchMethodException
     * 
@throws
 SecurityException
     * 
@throws
 ClassNotFoundException
     * 
@throws
 IOException
     * 
@return
 byte[]
     
*/

    
public byte[] createEncryptData(byte[] bytes) throws IllegalStateException,
            IllegalBlockSizeException, BadPaddingException,
            InvalidKeyException, NoSuchPaddingException,
            InvalidKeySpecException, NoSuchAlgorithmException,
            InstantiationException, IllegalAccessException,
            IllegalArgumentException, InvocationTargetException,
            NoSuchMethodException, SecurityException, ClassNotFoundException,
            IOException 
{
        bytes 
=
 getencryptData(bytes);
        
return
 bytes;
    }


    
private byte[] getencryptData(byte[] bytes) throws IOException,
            ClassNotFoundException, SecurityException, NoSuchMethodException,
            InvocationTargetException, IllegalArgumentException,
            IllegalAccessException, InstantiationException,
            NoSuchAlgorithmException, InvalidKeySpecException,
            NoSuchPaddingException, NoSuchAlgorithmException,
            InvalidKeyException, BadPaddingException,
            IllegalBlockSizeException, IllegalStateException 
{
        
// 产生一个可信任的随机数源

        SecureRandom sr = new SecureRandom();
        
//从密钥文件key Filename中得到密钥数据

        byte[] rawKeyData = Util.readFile(keyfilepath);
        
// 从原始密钥数据创建DESKeySpec对象

        Class classkeyspec = Class.forName(Util.getValue("keyspec"));
        Constructor constructor 
=
 classkeyspec
                .getConstructor(
new Class[] byte[].class }
);
        KeySpec dks 
=
 (KeySpec) constructor
                .newInstance(
new Object[] { rawKeyData }
);
        
// 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象

        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(Util
                .getAlgorithm());
        SecretKey key 
=
 keyFactory.generateSecret(dks);
        
// Cipher对象实际完成加密操作

        Cipher cipher = Cipher.getInstance(Util.getAlgorithm());
        
// 用密钥初始化Cipher对象

        cipher.init(Cipher.ENCRYPT_MODE, key, sr);
        
// 执行加密操作

        bytes = cipher.doFinal(bytes);
        
// 返回字节数组

        return bytes;
    }


    
/**
     * 设置key文件路径
     * 
@param keyfile String
     
*/

    
public void setKeyFile(String keyfile) {
        
this.keyfilepath =
 keyfile;
    }


}



package com.Gavin.tools.des;

import
 java.security.SecureRandom;
import
 javax.crypto.spec.DESKeySpec;
import
 javax.crypto.SecretKeyFactory;
import
 javax.crypto.SecretKey;
import
 javax.crypto.Cipher;
import
 java.io.IOException;
import
 java.security.InvalidKeyException;
import
 java.security.NoSuchAlgorithmException;
import
 java.security.spec.InvalidKeySpecException;
import
 javax.crypto.NoSuchPaddingException;
import
 javax.crypto.BadPaddingException;
import
 javax.crypto.IllegalBlockSizeException;
import
 java.security.spec.KeySpec;
import
 java.lang.reflect.Constructor;
import
 java.lang.reflect.InvocationTargetException;
import
 java.io.ByteArrayInputStream;

public class UnEncryptData 
{

    
private String keyfilepath = ""
;

    
public UnEncryptData() 
{
    }


    
public UnEncryptData(String keyfile) {
        
this.keyfilepath =
 keyfile;
    }


    
public void createUnEncryptData(String encryptfile, String filename)
            
throws
 IllegalStateException, IllegalBlockSizeException,
            BadPaddingException, NoSuchPaddingException,
            InvalidKeySpecException, NoSuchAlgorithmException,
            InvalidKeyException, IOException, NoSuchMethodException,
            SecurityException, InstantiationException, IllegalAccessException,
            IllegalArgumentException, InvocationTargetException,
            ClassNotFoundException, IllegalStateException,
            IllegalBlockSizeException, BadPaddingException,
            NoSuchPaddingException, InvalidKeySpecException,
            NoSuchAlgorithmException, InvalidKeyException, IOException 
{
        
//验证keyfile

        if (keyfilepath == null || keyfilepath.equals("")) {
            
throw new NullPointerException("无效的key文件路径"
);
        }


        unEncryptData(encryptfile, filename);
    }


    
/**
     * 解密类文件
     * 
@param encryptfile String 经过加密的文件
     * 
@param
 filename String 解密后的文件
     * 
@throws
 IOException
     * 
@throws
 InvalidKeyException
     * 
@throws
 NoSuchAlgorithmException
     * 
@throws
 InvalidKeySpecException
     * 
@throws
 NoSuchPaddingException
     * 
@throws
 NoSuchAlgorithmException
     * 
@throws
 BadPaddingException
     * 
@throws
 IllegalBlockSizeException
     * 
@throws
 IllegalStateException
     
*/

    
private void unEncryptData(String encryptfile, String filename)
            
throws
 IOException, IllegalStateException,
            IllegalBlockSizeException, BadPaddingException,
            InvalidKeyException, NoSuchPaddingException,
            InvalidKeySpecException, NoSuchAlgorithmException,
            InstantiationException, IllegalAccessException,
            IllegalArgumentException, InvocationTargetException,
            NoSuchMethodException, SecurityException, ClassNotFoundException,
            IOException 
{
        
// 获得经过加密的数据

        byte[] data = Util.readFile(encryptfile);
        
//执行解密操作

        byte decryptedData[] = getunEncryptData(data);
        
// 然后将解密后的数据转化成原来的类文件。

        Util.writeFile(decryptedData, filename);
    }


    
/**
     * 解密字节数组
     * 
@param bytes byte[]
     * 
@throws
 IllegalStateException
     * 
@throws
 IllegalBlockSizeException
     * 
@throws
 BadPaddingException
     * 
@throws
 InvalidKeyException
     * 
@throws
 NoSuchPaddingException
     * 
@throws
 InvalidKeySpecException
     * 
@throws
 NoSuchAlgorithmException
     * 
@throws
 InstantiationException
     * 
@throws
 IllegalAccessException
     * 
@throws
 IllegalArgumentException
     * 
@throws
 InvocationTargetException
     * 
@throws
 NoSuchMethodException
     * 
@throws
 SecurityException
     * 
@throws
 ClassNotFoundException
     * 
@throws
 IOException
     * 
@return
 byte[]
     
*/

    
public byte[] createUnEncryptData(byte[] bytes)
            
throws
 IllegalStateException, IllegalBlockSizeException,
            BadPaddingException, InvalidKeyException, NoSuchPaddingException,
            InvalidKeySpecException, NoSuchAlgorithmException,
            InstantiationException, IllegalAccessException,
            IllegalArgumentException, InvocationTargetException,
            NoSuchMethodException, SecurityException, ClassNotFoundException,
            IOException 
{
        bytes 
=
 getunEncryptData(bytes);
        
return
 bytes;
    }


    
/**
     *
     * 
@param bytes byte[]
     * 
@throws
 IOException
     * 
@throws
 ClassNotFoundException
     * 
@throws
 SecurityException
     * 
@throws
 NoSuchMethodException
     * 
@throws
 InvocationTargetException
     * 
@throws
 IllegalArgumentException
     * 
@throws
 IllegalAccessException
     * 
@throws
 InstantiationException
     * 
@throws
 NoSuchAlgorithmException
     * 
@throws
 InvalidKeySpecException
     * 
@throws
 NoSuchPaddingException
     * 
@throws
 NoSuchAlgorithmException
     * 
@throws
 InvalidKeyException
     * 
@throws
 BadPaddingException
     * 
@throws
 IllegalBlockSizeException
     * 
@throws
 IllegalStateException
     * 
@return
 byte[]
     
*/

    
private byte[] getunEncryptData(byte[] bytes) throws IOException,
            ClassNotFoundException, SecurityException, NoSuchMethodException,
            InvocationTargetException, IllegalArgumentException,
            IllegalAccessException, InstantiationException,
            NoSuchAlgorithmException, InvalidKeySpecException,
            NoSuchPaddingException, NoSuchAlgorithmException,
            InvalidKeyException, BadPaddingException,
            IllegalBlockSizeException, IllegalStateException 
{
        
// 生成一个可信任的随机数源

        SecureRandom sr = new SecureRandom();
        
// 从密钥文件中获取原始密钥数据

        byte[] rawKeyData = Util.readFile(keyfilepath);
        
// 创建一个DESKeySpec对象

        Class classkeyspec = Class.forName(Util.getValue("keyspec"));
        Constructor constructor 
=
 classkeyspec
                .getConstructor(
new Class[] byte[].class }
);
        KeySpec dks 
=
 (KeySpec) constructor
                .newInstance(
new Object[] { rawKeyData }); //
new DESKeySpec(rawKeyData);
        
// 创建一个密钥工厂,然后用它把DESKeySpec对象转换成Secret Key对象

        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(Util
                .getAlgorithm());
        SecretKey key 
=
 keyFactory.generateSecret(dks);
        
// Cipher对象实际完成解密操作

        Cipher cipher = Cipher.getInstance(Util.getAlgorithm());
        
// 用密钥初始化Cipher对象

        cipher.init(Cipher.DECRYPT_MODE, key, sr);
        
//
 获得经过加密的数据
        
//执行解密操作

        bytes = cipher.doFinal(bytes);
        
// 然后将解密后的数据转化成原来的类文件。

        return bytes;
    }


    
public void setKeyFile(String keyfile) {
        
this.keyfilepath =
 keyfile;
    }

}


只有注册用户登录后才能发表评论。


网站导航: