- package test;
- import java.io.FileInputStream; <pre class="java" name="code"></pre>
- <br>import java.io.FileOutputStream;
- <br>import java.io.IOException;
- <br>import java.io.ObjectInputStream;
- <br>import java.io.ObjectOutputStream;
- <br>import java.security.*;
- <br>import javax.crypto.Cipher;
- <br>import javax.crypto.KeyGenerator;
- <br>import javax.crypto.SecretKey;
- <br>/**
- <br> * 加密解密
- <br> *
- <br> * @author shy.qiu
- <br> * @since http://blog.csdn.net/qiushyfm
- <br> */
- <br>public class CryptTest {
- <br> /**
- <br> * 进行MD5加密
- <br> *
- <br> * @param info
- <br> * 要加密的信息
- <br> * @return String 加密后的字符串
- <br> */
- <br> public String encryptToMD5(String info) {
- <br> byte[] digesta = null;
- <br> try {
- <br> // 得到一个md5的消息摘要
- <br> MessageDigest alga = MessageDigest.getInstance("MD5");
- <br> // 添加要进行计算摘要的信息
- <br> alga.update(info.getBytes());
- <br> // 得到该摘要
- <br> digesta = alga.digest();
- <br> } catch (NoSuchAlgorithmException e) {
- <br> e.printStackTrace();
- <br> }
- <br> // 将摘要转为字符串
- <br> String rs = byte2hex(digesta);
- <br> return rs;
- <br> }
- <br> /**
- <br> * 进行SHA加密
- <br> *
- <br> * @param info
- <br> * 要加密的信息
- <br> * @return String 加密后的字符串
- <br> */
- <br> public String encryptToSHA(String info) {
- <br> byte[] digesta = null;
- <br> try {
- <br> // 得到一个SHA-1的消息摘要
- <br> MessageDigest alga = MessageDigest.getInstance("SHA-1");
- <br> // 添加要进行计算摘要的信息
- <br> alga.update(info.getBytes());
- <br> // 得到该摘要
- <br> digesta = alga.digest();
- <br> } catch (NoSuchAlgorithmException e) {
- <br> e.printStackTrace();
- <br> }
- <br> // 将摘要转为字符串
- <br> String rs = byte2hex(digesta);
- <br> return rs;
- <br> }
- <br> // //
- <br> /**
- <br> * 创建密匙
- <br> *
- <br> * @param algorithm
- <br> * 加密算法,可用 DES,DESede,Blowfish
- <br> * @return SecretKey 秘密(对称)密钥
- <br> */
- <br> public SecretKey createSecretKey(String algorithm) {
- <br> // 声明KeyGenerator对象
- <br> KeyGenerator keygen;
- <br> // 声明 密钥对象
- <br> SecretKey deskey = null;
- <br> try {
- <br> // 返回生成指定算法的秘密密钥的 KeyGenerator 对象
- <br> keygen = KeyGenerator.getInstance(algorithm);
- <br> // 生成一个密钥
- <br> deskey = keygen.generateKey();
- <br> } catch (NoSuchAlgorithmException e) {
- <br> e.printStackTrace();
- <br> }
- <br> // 返回密匙
- <br> return deskey;
- <br> }
- <br> /**
- <br> * 根据密匙进行DES加密
- <br> *
- <br> * @param key
- <br> * 密匙
- <br> * @param info
- <br> * 要加密的信息
- <br> * @return String 加密后的信息
- <br> */
- <br> public String encryptToDES(SecretKey key, String info) {
- <br> // 定义 加密算法,可用 DES,DESede,Blowfish
- <br> String Algorithm = "DES";
- <br> // 加密随机数生成器 (RNG),(可以不写)
- <br> SecureRandom sr = new SecureRandom();
- <br> // 定义要生成的密文
- <br> byte[] cipherByte = null;
- <br> try {
- <br> // 得到加密/解密器
- <br> Cipher c1 = Cipher.getInstance(Algorithm);
- <br> // 用指定的密钥和模式初始化Cipher对象
- <br> // 参数:(ENCRYPT_MODE, DECRYPT_MODE, WRAP_MODE,UNWRAP_MODE)
- <br> c1.init(Cipher.ENCRYPT_MODE, key, sr);
- <br> // 对要加密的内容进行编码处理,
- <br> cipherByte = c1.doFinal(info.getBytes());
- <br> } catch (Exception e) {
- <br> e.printStackTrace();
- <br> }
- <br> // 返回密文的十六进制形式
- <br> return byte2hex(cipherByte);
- <br> }
- <br> /**
- <br> * 根据密匙进行DES解密
- <br> *
- <br> * @param key
- <br> * 密匙
- <br> * @param sInfo
- <br> * 要解密的密文
- <br> * @return String 返回解密后信息
- <br> */
- <br> public String decryptByDES(SecretKey key, String sInfo) {
- <br> // 定义 加密算法,
- <br> String Algorithm = "DES";
- <br> // 加密随机数生成器 (RNG)
- <br> SecureRandom sr = new SecureRandom();
- <br> byte[] cipherByte = null;
- <br> try {
- <br> // 得到加密/解密器
- <br> Cipher c1 = Cipher.getInstance(Algorithm);
- <br> // 用指定的密钥和模式初始化Cipher对象
- <br> c1.init(Cipher.DECRYPT_MODE, key, sr);
- <br> // 对要解密的内容进行编码处理
- <br> cipherByte = c1.doFinal(hex2byte(sInfo));
- <br> } catch (Exception e) {
- <br> e.printStackTrace();
- <br> }
- <br> // return byte2hex(cipherByte);
- <br> return new String(cipherByte);
- <br> }
- <br> // /
- <br> /**
- <br> * 创建密匙组,并将公匙,私匙放入到指定文件中
- <br> *
- <br> * 默认放入mykeys.bat文件中
- <br> */
- <br> public void createPairKey() {
- <br> try {
- <br> // 根据特定的算法一个密钥对生成器
- <br> KeyPairGenerator keygen = KeyPairGenerator.getInstance("DSA");
- <br> // 加密随机数生成器 (RNG)
- <br> SecureRandom random = new SecureRandom();
- <br> // 重新设置此随机对象的种子
- <br> random.setSeed(1000);
- <br> // 使用给定的随机源(和默认的参数集合)初始化确定密钥大小的密钥对生成器
- <br> keygen.initialize(512, random);// keygen.initialize(512);
- <br> // 生成密钥组
- <br> KeyPair keys = keygen.generateKeyPair();
- <br> // 得到公匙
- <br> PublicKey pubkey = keys.getPublic();
- <br> // 得到私匙
- <br> PrivateKey prikey = keys.getPrivate();
- <br> // 将公匙私匙写入到文件当中
- <br> doObjToFile("mykeys.bat", new Object[] { prikey, pubkey });
- <br> } catch (NoSuchAlgorithmException e) {
- <br> e.printStackTrace();
- <br> }
- <br> }
- <br> /**
- <br> * 利用私匙对信息进行签名 把签名后的信息放入到指定的文件中
- <br> *
- <br> * @param info
- <br> * 要签名的信息
- <br> * @param signfile
- <br> * 存入的文件
- <br> */
- <br> public void signToInfo(String info, String signfile) {
- <br> // 从文件当中读取私匙
- <br> PrivateKey myprikey = (PrivateKey) getObjFromFile("mykeys.bat", 1);
- <br> // 从文件中读取公匙
- <br> PublicKey mypubkey = (PublicKey) getObjFromFile("mykeys.bat", 2);
- <br> try {
- <br> // Signature 对象可用来生成和验证数字签名
- <br> Signature signet = Signature.getInstance("DSA");
- <br> // 初始化签署签名的私钥
- <br> signet.initSign(myprikey);
- <br> // 更新要由字节签名或验证的数据
- <br> signet.update(info.getBytes());
- <br> // 签署或验证所有更新字节的签名,返回签名
- <br> byte[] signed = signet.sign();
- <br> // 将数字签名,公匙,信息放入文件中
- <br> doObjToFile(signfile, new Object[] { signed, mypubkey, info });
- <br> } catch (Exception e) {
- <br> e.printStackTrace();
- <br> }
- <br> }
- <br> /**
- <br> * 读取数字签名文件 根据公匙,签名,信息验证信息的合法性
- <br> *
- <br> * @return true 验证成功 false 验证失败
- <br> */
- <br> public boolean validateSign(String signfile) {
- <br> // 读取公匙
- <br> PublicKey mypubkey = (PublicKey) getObjFromFile(signfile, 2);
- <br> // 读取签名
- <br> byte[] signed = (byte[]) getObjFromFile(signfile, 1);
- <br> // 读取信息
- <br> String info = (String) getObjFromFile(signfile, 3);
- <br> try {
- <br> // 初始一个Signature对象,并用公钥和签名进行验证
- <br> Signature signetcheck = Signature.getInstance("DSA");
- <br> // 初始化验证签名的公钥
- <br> signetcheck.initVerify(mypubkey);
- <br> // 使用指定的 byte 数组更新要签名或验证的数据
- <br> signetcheck.update(info.getBytes());
- <br> System.out.println(info);
- <br> // 验证传入的签名
- <br> return signetcheck.verify(signed);
- <br> } catch (Exception e) {
- <br> e.printStackTrace();
- <br> return false;
- <br> }
- <br> }
- <br> /**
- <br> * 将二进制转化为16进制字符串
- <br> *
- <br> * @param b
- <br> * 二进制字节数组
- <br> * @return String
- <br> */
- <br> public String byte2hex(byte[] b) {
- <br> String hs = "";
- <br> String stmp = "";
- <br> for (int n = 0; n 0xEF
- <br> *
- <br> * @param src0
- <br> * byte
- <br> * @param src1
- <br> * byte
- <br> * @return byte
- <br> */
- <br> public static byte uniteBytes(byte src0, byte src1) {
- <br> byte _b0 = Byte.decode("0x" + new String(new byte[] { src0 }))
- <br> .byteValue();
- <br> _b0 = (byte) (_b0
java(md5) 加密解密简单实现
最新推荐文章于 2024-08-24 18:31:16 发布