`
xueshuanglong
  • 浏览: 24329 次
  • 性别: Icon_minigender_1
  • 来自: 山西
社区版块
存档分类
最新评论

加密、解密

阅读更多

关注1:http://hello-nick-xu.iteye.com/blog/2103775
关注2:http://hello-nick-xu.iteye.com/blog/2103781
package com.rock;

import java.io.IOException; 
import java.security.Key; 
import java.security.KeyPair; 
import java.security.KeyPairGenerator; 
import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 
import java.security.PrivateKey; 
import java.security.PublicKey; 
import java.security.SecureRandom; 
import java.security.Signature; 
 
import javax.crypto.Cipher; 
import javax.crypto.SecretKey; 
import javax.crypto.SecretKeyFactory; 
import javax.crypto.spec.DESKeySpec; 
 
import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 
 
import sun.misc.BASE64Decoder; 
import sun.misc.BASE64Encoder;

public class EncryptUtil {
private static Log logger = LogFactory.getLog(EncryptUtil.class); 
   
    private static final int KEY_SIZE = 1024; 
    private static final String  MD5_ALGORITHM= "md5"; 
    private static final String  DES_ALGORITHM= "des"; 
    private static final String  RSA_ALGORITHM= "rsa"; 
    private static final String  SIGNATURE_ALGORITHM= "MD5withRSA"; 
     
    private static MessageDigest md5; 
    private static BASE64Encoder encoder; 
    private static BASE64Decoder decoder; 
    private static SecureRandom random; 
    private static KeyPair keyPair; 
     
    private EncryptUtil() { 
    } 
     
    static { 
        try { 
            md5 = MessageDigest.getInstance(MD5_ALGORITHM); 
             
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(RSA_ALGORITHM); 
            keyPairGenerator.initialize(KEY_SIZE); 
            keyPair = keyPairGenerator.generateKeyPair(); 
        } 
        catch (NoSuchAlgorithmException e) { 
            // Exception handler 
            logger.error(e); 
        } 
        encoder = new BASE64Encoder(); 
        decoder = new BASE64Decoder(); 
        random = new SecureRandom(); 
    } 
     
    /**
     * 功能简述: 使用md5进行单向加密.
     */ 
    public static String encryptMD5(String plainText) { 
        byte[] cipherData = md5.digest(plainText.getBytes()); 
        StringBuilder builder = new StringBuilder(); 
        for(byte cipher : cipherData) { 
            String toHexStr = Integer.toHexString(cipher & 0xff); 
            builder.append(toHexStr.length() == 1 ? "0" + toHexStr : toHexStr); 
        } 
        return builder.toString(); 
    } 
     
   
//    public static void main(String[] args) {
// System.out.println("=======>>MD5加密:   "+encryptMD5("xueshuanglong_198822"));
// //8ff95d3b0db752ac6d10b21bc05dec38
// }
   
   
    /**
     * 功能简述: 使用BASE64进行加密.
     * @param plainData 明文数据
     * @return 加密之后的文本内容
     */ 
    public static String encryptBASE64(byte[] plainData) { 
        return encoder.encode(plainData); 
    } 
     
//    public static void main(String[] args) {
//
//    System.out.println("=======>>BASE64加密:   "+encryptBASE64("xueshuanglong_198822".getBytes()));
//    //eHVlc2h1YW5nbG9uZ18xOTg4MjI=
// }
  
    /**
     * 功能简述: 使用BASE64进行解密.
     * @param cipherText 密文文本
     * @return 解密之后的数据
     */ 
    public static byte[] decryptBASE64(String cipherText) { 
        byte[] plainData = null; 
        try { 
            plainData =  decoder.decodeBuffer(cipherText); 
        } 
        catch (IOException e) { 
            // Exception handler 
            logger.error(e); 
        } 
        return plainData; 
    } 
    
//  public static void main(String[] args) {
//
// System.out.println("=======>>BASE64解密:   "+new String(decryptBASE64("eHVlc2h1YW5nbG9uZ18xOTg4MjI=")));
// //eHVlc2h1YW5nbG9uZ18xOTg4MjI=
//}
   
    /**
     * 功能简述: 使用DES算法进行加密.
     * @param plainData 明文数据
     * @param key   加密密钥
     * @return  
     */ 
    public static byte[] encryptDES(byte[] plainData, String key) { 
        return processCipher(plainData, createSecretKey(key), Cipher.ENCRYPT_MODE, DES_ALGORITHM); 
    } 
     
//    public static void main(String[] args) {
//    System.out.println("=======>>DES加密:   "+encryptBASE64(encryptDES("xueshuanglong_198822".getBytes(), "1234567890")));
//    //AW+L+c1d/zTRW0xFkA05Wft+S8LmvkCL
// }
    /**
     * 功能简述: 使用DES算法进行解密.
     * @param cipherData    密文数据
     * @param key   解密密钥
     * @return
     */ 
    public static byte[] decryptDES(byte[] cipherData, String key) { 
        return processCipher(cipherData, createSecretKey(key), Cipher.DECRYPT_MODE, DES_ALGORITHM); 
    } 
     
//    public static void main(String[] args) {
//    System.out.println("=======>>DES解密:   "+new String(decryptDES(decryptBASE64("AW+L+c1d/zTRW0xFkA05Wft+S8LmvkCL"),"1234567890")));
//   
// }
   
   
    /**
     * 功能简述: 根据key创建密钥SecretKey.
     * @param key 
     * @return
     */ 
    private static SecretKey createSecretKey(String key) { 
        SecretKey secretKey = null; 
        try { 
            DESKeySpec keySpec = new DESKeySpec(key.getBytes()); 
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES_ALGORITHM); 
            secretKey = keyFactory.generateSecret(keySpec); 
        } 
        catch (Exception e) { 
            // Exception handler 
            logger.error(e); 
        } 
        return secretKey; 
    } 
     
    /**
     * 功能简述: 加密/解密处理流程.
     * @param processData   待处理的数据
     * @param key   提供的密钥
     * @param opsMode   工作模式
     * @param algorithm   使用的算法
     * @return  
     */ 
    private static byte[] processCipher(byte[] processData, Key key, int opsMode, String algorithm) { 
        try{  
            Cipher cipher = Cipher.getInstance(algorithm); 
            cipher.init(opsMode, key, random); 
            return cipher.doFinal(processData); 
        } 
        catch (Exception e) { 
            // Exception handler 
            logger.error(e); 
        } 
        return null; 
    } 
     
    /**
     * 功能简述: 创建私钥,用于RSA非对称加密.
     * @return
     */ 
    public static PrivateKey createPrivateKey() { 
        return keyPair.getPrivate(); 
    } 
     
    /**
     * 功能简述: 创建公钥,用于RSA非对称加密.
     * @return
     */ 
    public static PublicKey createPublicKey() { 
        return keyPair.getPublic(); 
    } 
     
    /**
     * 功能简述: 使用RSA算法加密.
     * @param plainData 明文数据
     * @param key   密钥
     * @return
     */ 
    public static byte[] encryptRSA(byte[] plainData, Key key) { 
        return processCipher(plainData, key, Cipher.ENCRYPT_MODE, RSA_ALGORITHM); 
    } 
     
//    public static void main(String[] args) {
//   
//    System.out.println("=======>>RSA加密:   "+new BASE64Encoder().encode(encryptRSA("Hello , world !".getBytes(), createPrivateKey())));
// }
   
    /**
     * 功能简述: 使用RSA算法解密.
     * @param cipherData    密文数据
     * @param key   密钥
     * @return
     */ 
    public static byte[] decryptRSA(byte[] cipherData, Key key) { 
        return processCipher(cipherData, key, Cipher.DECRYPT_MODE, RSA_ALGORITHM); 
    } 
     
    public static void main(String[] args) {
    byte[] cipherData = encryptRSA("Hello , world !".getBytes(), createPrivateKey());
    System.out.println("=======>>RSA加密:   "+new BASE64Encoder().encode(cipherData));
    System.out.println("=======>>RSA解密:   "+new String(decryptRSA(cipherData, createPublicKey())));
    byte[] signData=createSignature(cipherData,createPrivateKey());
    System.out.println("=======>>使用私钥对加密数据创建数字签名:   "+new BASE64Encoder().encode(signData));
    System.out.println("=======>>使用公钥对数字签名进行验证:   "+verifySignature(cipherData,signData,createPublicKey()));
}
   
    /**
     * 功能简述: 使用私钥对加密数据创建数字签名.
     * @param cipherData     已经加密过的数据
     * @param privateKey    私钥
     * @return
     */ 
    public static byte[] createSignature(byte[] cipherData, PrivateKey privateKey) { 
        try { 
            Signature signature  = Signature.getInstance(SIGNATURE_ALGORITHM); 
            signature.initSign(privateKey); 
            signature.update(cipherData); 
            return signature.sign(); 
        } 
        catch (Exception e) { 
            // Exception handler 
            logger.error(e);  
        } 
        return null; 
    } 
     
    /**
     * 功能简述: 使用公钥对数字签名进行验证.
     * @param signData  数字签名
     * @param publicKey 公钥
     * @return
     */ 
    public static boolean verifySignature(byte[] cipherData, byte[] signData, PublicKey publicKey) { 
        try { 
            Signature signature  = Signature.getInstance(SIGNATURE_ALGORITHM); 
            signature.initVerify(publicKey); 
            signature.update(cipherData); 
            return signature.verify(signData); 
        } 
        catch (Exception e) { 
            // Exception handler 
            logger.error(e); 
        } 
        return false; 
    }
   
  
}
分享到:
评论

相关推荐

    C#加密解密DeEncryptHelper.zip

    MD5 单向加密 SHA1 单向加密 DES 双向,可解密 加密字符串 ...RSA加密解密及RSA签名和验证 RSA 的密钥产生 产生私钥 和公钥 RSA 方式加密 RSA的解密函数 获取Hash描述表 RSA签名 RSA 签名验证

    易飞用户加密解密

    《易飞用户加密解密详解》 在信息技术领域,数据安全是至关重要的议题,而用户加密解密技术正是保障信息安全的重要手段。本文将围绕“易飞用户加密解密”这一主题,深入探讨其原理、应用及操作流程,帮助读者更好地...

    SpringBoot接口加密解密统一处理

    在本文中,我们将深入探讨如何在SpringBoot中实现接口的加密解密统一处理,以及如何通过自定义注解来灵活控制加密解密的执行。 首先,我们创建两个自定义注解,`DecryptRequest`和`EncryptResponse`,用于标识哪些...

    C语言实现DES加密解密算法

    DES加密解密算法的C语言实现 DES(Data Encryption Standard)是一种对称密钥 BLOCK 加密算法,使用 56 位密钥对 64 位数据块进行加密。下面是 DES 加密解密算法的 C 语言实现的知识点总结。 字节与二进制转换 在...

    Qt实现AES加密解密

    这个程序应当包含了上述知识点的具体应用,你可以通过阅读源代码、编译和运行来进一步理解和学习AES加密解密的实现细节。这个实战例程可以帮助开发者更好地掌握Qt环境下的加密解密操作,提高数据安全保护能力。

    URL参数加密解密,URL参数加密解密

    URL参数加密解密;使用简便;URL参数加密解密;使用简便;URL参数加密解密;使用简便;URL参数加密解密;使用简便;

    Java实现的RSA加密解密算法示例

    Java实现的RSA加密解密算法示例 本文主要介绍了Java实现的RSA加密解密算法,结合实例形式分析了Java RSA加密解密算法的相关实现技巧。 知识点1:RSA加密解密算法简介 RSA加密解密算法是一种非对称加密算法,由Ron...

    C# RSA加密解密

    **C# RSA加密解密详解** 在信息安全领域,加密技术是一种至关重要的手段,用于保护数据的隐私和安全性。RSA(Rivest-Shamir-Adleman)算法是一种非对称加密算法,广泛应用于网络通信、数据存储等领域。C#作为.NET...

    ENC文件加密解密工具

    《深入理解ENC文件加密解密工具:以PrimaSoft Encryption Utility为例》 在信息安全日益重要的今天,文件加密解密工具成为保护数据隐私的关键工具。"ENC文件加密解密工具",特别是PrimaSoft Encryption Utility,是...

    3DES加密解密工具

    标题中的“3DES加密解密工具”指的是一个用于执行三重数据加密标准(3DES,Triple DES)的软件工具,这种工具通常用于保护敏感数据的安全,确保信息在传输过程中的机密性。3DES是DES(Data Encryption Standard,...

    六个经典的PHP加密解密算法

    经典代码(带详解) 函数authcode($string, $operation, $key, ...第六种 函数encrypt($string,$operation,$key)中$string:需要加密解密的字符串;$operation:判断是加密还是解密,E表示加密,D表示解密;$key:密匙。

    C#文件加密解密(完整项目)

    本项目"文件加密解密(完整项目)"专注于利用C#进行文件的安全处理,确保数据在传输和存储时的隐私性。 一、C#加密技术基础 C#中实现文件加密主要依赖于.NET Framework提供的加密类库,如System.Security....

    java实现文件加密解密

    "java实现文件加密解密" Java 实现文件的加密与解密是指利用 Java 语言将资源文件(包括图片、动画等类型)进行简单的加密和解密。这种策略的原因和好处是将准备好的资源存储在云上,使用时通过网络进行读取即可,...

    JAVA数据加密解密的实例

    本实例将聚焦于JAVA数据加密解密的实践应用。 首先,让我们理解加密和解密的基本概念。加密是一种将明文(可读信息)转化为密文(不可读信息)的过程,以保护数据不被未经授权的用户访问。解密则是加密的逆过程,将...

    C# .net MD5加密解密工具及加密解密类

    C# .net MD5加密解密工具及加密解密类。使用方便,可直接下载加密解密代码在项目中使用。

    MFC 实现文本文件加密解密

    在这个特定的案例中,"MFC实现文本文件加密解密"是一个使用MFC框架编写的程序,它允许用户对文本文件进行加密和解密操作,确保敏感数据在传输或存储时的安全性。 在VC2010环境下,开发者通常会利用MFC的类库,如...

    脚本加密解密器脚本加密解密器

    脚本加密解密器是一种工具,它的主要功能是将脚本代码进行加密处理,以使其在未经授权的情况下无法被轻易读取或理解,同时也能提供解密机制,使得在需要执行时能够正确解读并运行加密后的脚本。 脚本加密通常涉及到...

    vb.net加密解密源代码

    这个名为"vb.net加密解密源代码"的项目,是利用Visual Studio 2008开发的一个小型应用程序,提供了对数据进行加解密的功能。下面我们将详细探讨相关的知识点。 1. **VB.NET基础**: VB.NET是微软公司开发的一种...

    QT C++ AES字符串加密解密类库,引入即可使用

    QT C++ AES字符串加密解密类库是一种在C++编程环境中使用QT框架实现的高级加密标准(AES)加密和解密工具。QT是一个流行的开源跨平台应用开发框架,广泛应用于桌面、移动和嵌入式系统。AES是目前广泛应用的对称加密...

    Android APK 加密 解密工具

    "Android APK 加密 解密工具"就是这样一个专门用于加密和解密APK文件的实用程序,它可以帮助开发者增加额外的安全层,确保只有经过授权的用户能够安装和运行应用。 首先,我们需要理解APK加密的基本原理。通常,APK...

Global site tag (gtag.js) - Google Analytics