用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - java代码库

java加解密工具类,支持RSA,AES

2014-06-18 作者: 路易斯陈凯瑞举报

[java]代码库

package security;

import java.security.Key;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.spec.KeySpec;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.SecretKeySpec;


/**
 * 加解密统一接口,支持流行的对称和非对称算法
 * 目前可以使用3DES,AES,RSA进行加解密
 * @author luis.chen
 * @version $Id: EncryptUtil.java, v 0.1 2014年6月17日 上午11:08:28 luis.chen Exp $
 */
public class EncryptUtil {

    public static void main(String args[]){
        String plainText = "我是一只小小鸟";       
        try {
            
            System.out.println("开始使用AES加密....");
            //使用AES加密
            byte[] asKey = getDefaultKey(EncryptAlgorithm.AES);
            String encStr = testSymmEncry(plainText,asKey,EncryptAlgorithm.AES);
            System.out.println("AES加密之后:"+encStr);
            //使用AES解密
            String decStr = testSymmDecry(encStr,asKey,EncryptAlgorithm.AES);
            System.out.println("AES解密之后:"+decStr);
            
            System.out.println("开始使用RSA加密....");
            
            KeyPair kp = getDefaultKeyPair(EncryptAlgorithm.RSA);
            String rsaEncStr = testAsymmEncry(plainText,kp.getPublic(),EncryptAlgorithm.RSAWithPadding);
            System.out.println("RSA加密之后:"+rsaEncStr);
            //使用RSA解密
            String desDecStr = testAsymmDecry(rsaEncStr,kp.getPrivate(),EncryptAlgorithm.RSAWithPadding);
            System.out.println("RSA解密之后:"+desDecStr);
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }
    
    public static String testSymmEncry(String plainText,byte[] key,EncryptAlgorithm alg) throws Exception{
        /*测试对称加密方法的应用场景类*/
        byte[] encResult = encryt(EncryptStringUtils.getEncByteFromStr(plainText),key,alg);
        String encStr = EncryptStringUtils.byte2hex(encResult);
        return encStr;
    }
    public static String testAsymmEncry(String plainText,Key key,EncryptAlgorithm alg) throws Exception{
        /*测试非对称加密方法的应用场景类*/
//        byte[] encResult = encryt(EncryptStringUtils.getEncByteFromStr(plainText),key,alg);
        byte[] encResult = encryt(plainText.getBytes(),key,alg);
        String encStr = EncryptStringUtils.byte2hex(encResult);
        return encStr;
    }
    
    
    public static String testSymmDecry(String ciperText, byte[] key,EncryptAlgorithm alg) throws Exception{
        /*测试解密方法的应用场景类*/
        byte[] decResult = decryt(EncryptStringUtils.getDecByteFromStr(ciperText),key,alg);
        String decStr = new String(decResult);
        return decStr;
    }
    
    public static String testAsymmDecry(String ciperText, Key key,EncryptAlgorithm alg) throws Exception{
        /*测试非对称解密方法的应用场景类*/
        byte[] decResult = decryt(EncryptStringUtils.getDecByteFromStr(ciperText),key,alg);
        String decStr = new String(decResult);
        return decStr;
    }
    
    /**
     * 对称加密方法
     * @param plainText 明文的16进制字节数组
     * @param encrytKey 16进制的密钥数组
     * @param alg 加密算法的枚举
     * @return 加密结果,返回加密后的字节数组
     * @throws Exception
     * */
    public static byte[] encryt(byte[] plainText, byte[] encrytKey,EncryptAlgorithm alg) throws Exception{
        Key k = toKey(encrytKey,alg);        
        return encryt(plainText,k,alg);
    }
    
    /**
     * 非对称加密方法
     * @param plainText 明文的16进制字节数组
     * @param key 通过KeyPair获得的公钥
     * @param alg 加密算法的枚举
     * @return 加密结果,返回加密后的字节数组
     * @throws Exception
     * */
    public static byte[] encryt(byte[] plainText, Key key,EncryptAlgorithm alg) throws Exception{
        Cipher cipher = Cipher.getInstance(alg.getAlgorithm());
        cipher.init(Cipher.ENCRYPT_MODE, key);
        return cipher.doFinal(plainText);
    }
    /**
     * 对称加密解密方法
     * @param ciperText 密文的16进制字节数组
     * @param decrytKey 16进制的密钥数组
     * @param alg 加密算法的枚举
     * @return 解密结果,返回解密后的字节数组
     * @throws Exception
     * */
    public static byte[] decryt(byte[] ciperText, byte[] decrytKey,EncryptAlgorithm alg) throws Exception{
        Key k = toKey(decrytKey,alg);
        return decryt(ciperText,k,alg);
    }
    /**
     * 非对称加密解密方法
     * @param ciperText 密文的16进制字节数组
     * @param key 通过keypair得到的非对称加密私钥
     * @param alg 加密算法的枚举
     * @return 解密结果,返回解密后的字节数组
     * @throws Exception
     * */
    public static byte[] decryt(byte[] ciperText, Key key,EncryptAlgorithm alg) throws Exception{
        Cipher cipher = Cipher.getInstance(alg.getAlgorithm());
        cipher.init(Cipher.DECRYPT_MODE, key);
        return cipher.doFinal(ciperText);
    }
    
    /**
     * 获取对称加密算法算法的密钥
     * @param alg 加密算法枚举
     * @return 16进制的密钥数组
     * @throws
     * */
    public static byte[] getDefaultKey(EncryptAlgorithm alg) throws Exception{
        KeyGenerator keygen = KeyGenerator.getInstance(alg.getAlgorithm());        
        SecretKey deskey = keygen.generateKey();        
        return deskey.getEncoded();
    }
    /**
     * 获取非对称加密算法的密钥
     * @param alg 加密算法枚举
     * @return 16进制的密钥数组
     * @throws
     * */
    public static KeyPair getDefaultKeyPair(EncryptAlgorithm alg) throws Exception{
        KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(alg.getAlgorithm());
        //密钥位数
        keyPairGen.initialize(1024);
        //密钥对
        KeyPair keyPair = keyPairGen.generateKeyPair();
        return keyPair;
    }
    /**
     * 通过key的字节数组和特定的算法得到用于加解密的密钥对象
     * @param key 密钥数组
     * @param alg 加解密算法的枚举 
     * @return KEY 
     * @throws Exception
     */
    private static Key toKey(byte[] key, EncryptAlgorithm alg) throws Exception {
        SecretKeySpec spec = new SecretKeySpec(key,alg.getAlgorithm());
        if(alg.getAlgorithm().indexOf("DES") > -1 ){
            KeySpec desKey = null;
            SecretKeyFactory keyFactory = null;
            if("DES".equals(alg.getAlgorithm())){
                desKey = new DESKeySpec(key);
                keyFactory = SecretKeyFactory.getInstance(alg.getAlgorithm()); 
            }
            else{
                desKey = new DESedeKeySpec(key);
                keyFactory = SecretKeyFactory.getInstance(EncryptAlgorithm.ThreeDES.getAlgorithm());  
            }// 将DESKeySpec对象转换成SecretKey对象  
            SecretKey securekey = keyFactory.generateSecret(desKey);  
            return securekey;
        }
        
        return spec;
    }
    
    
}

[源代码打包下载]




网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...