java常用工具类之DES和Base64加密解密类
程序员文章站
2024-02-29 13:49:34
一、des加密和解密
package com.itjh.javautil;
import java.io.unsupportedencodingexcept...
一、des加密和解密
package com.itjh.javautil; import java.io.unsupportedencodingexception; import java.security.invalidkeyexception; import java.security.nosuchalgorithmexception; import java.security.securerandom; import java.security.spec.invalidkeyspecexception; import javax.crypto.badpaddingexception; import javax.crypto.cipher; import javax.crypto.illegalblocksizeexception; import javax.crypto.keygenerator; import javax.crypto.nosuchpaddingexception; import javax.crypto.secretkey; import javax.crypto.secretkeyfactory; import javax.crypto.spec.deskeyspec; /** * des加密和解密。 * * @author 宋立君 * @date 2014年07月03日 */ public class desutil { /** 安全密钥 */ private string keydata = "abcdefghijklmnopqrstwxyzabcdefghijklmnopqrstwxyz0123456789-_."; /** * 功能:构造 * * @author 宋立君 * @date 2014年07月03日 */ public desutil() { } /** * 功能:构造 * * @author 宋立君 * @date 2014年07月03日 * @param keydata * key */ public desutil(string key) { this.keydata = key; } /** * 功能:加密 (utf-8) * * @author 宋立君 * @date 2014年07月03日 * @param source * 源字符串 * @param charset * 编码 * @return string * @throws unsupportedencodingexception * 编码异常 */ public string encrypt(string source) throws unsupportedencodingexception { return encrypt(source, "utf-8"); } /** * * 功能:解密 (utf-8) * * @author 宋立君 * @date 2014年07月03日 * @param encrypteddata * 被加密后的字符串 * @return string * @throws unsupportedencodingexception * 编码异常 */ public string decrypt(string encrypteddata) throws unsupportedencodingexception { return decrypt(encrypteddata, "utf-8"); } /** * 功能:加密 * * @author 宋立君 * @date 2014年07月03日 * @param source * 源字符串 * @param charset * 编码 * @return string * @throws unsupportedencodingexception * 编码异常 */ public string encrypt(string source, string charset) throws unsupportedencodingexception { string encrypt = null; byte[] ret = encrypt(source.getbytes(charset)); encrypt = new string(base64.encode(ret)); return encrypt; } /** * * 功能:解密 * * @author 宋立君 * @date 2014年07月03日 * @param encrypteddata * 被加密后的字符串 * @param charset * 编码 * @return string * @throws unsupportedencodingexception * 编码异常 */ public string decrypt(string encrypteddata, string charset) throws unsupportedencodingexception { string descrypteddata = null; byte[] ret = descrypt(base64.decode(encrypteddata.tochararray())); descrypteddata = new string(ret, charset); return descrypteddata; } /** * 加密数据 用生成的密钥加密原始数据 * * @param primarydata * 原始数据 * @return byte[] * @author 宋立君 * @date 2014年07月03日 */ private byte[] encrypt(byte[] primarydata) { /** 取得安全密钥 */ byte rawkeydata[] = getkey(); /** des算法要求有一个可信任的随机数源 */ securerandom sr = new securerandom(); /** 使用原始密钥数据创建deskeyspec对象 */ deskeyspec dks = null; try { dks = new deskeyspec(keydata.getbytes()); } catch (invalidkeyexception e) { e.printstacktrace(); } /** 创建一个密钥工厂 */ secretkeyfactory keyfactory = null; try { keyfactory = secretkeyfactory.getinstance("des"); } catch (nosuchalgorithmexception e) { e.printstacktrace(); } /** 用密钥工厂把deskeyspec转换成一个secretkey对象 */ secretkey key = null; try { key = keyfactory.generatesecret(dks); } catch (invalidkeyspecexception e) { e.printstacktrace(); } /** cipher对象实际完成加密操作 */ cipher cipher = null; try { cipher = cipher.getinstance("des"); } catch (nosuchalgorithmexception e) { e.printstacktrace(); } catch (nosuchpaddingexception e) { e.printstacktrace(); } /** 用密钥初始化cipher对象 */ try { cipher.init(cipher.encrypt_mode, key, sr); } catch (invalidkeyexception e) { e.printstacktrace(); } /** 正式执行加密操作 */ byte encrypteddata[] = null; try { encrypteddata = cipher.dofinal(primarydata); } catch (illegalstateexception e) { e.printstacktrace(); } catch (illegalblocksizeexception e) { e.printstacktrace(); } catch (badpaddingexception e) { e.printstacktrace(); } /** 返回加密数据 */ return encrypteddata; } /** * 用密钥解密数据 * * @param encrypteddata * 加密后的数据 * @return byte[] * @author 宋立君 * @date 2014年07月03日 */ private byte[] descrypt(byte[] encrypteddata) { /** des算法要求有一个可信任的随机数源 */ securerandom sr = new securerandom(); /** 取得安全密钥 */ byte rawkeydata[] = getkey(); /** 使用原始密钥数据创建deskeyspec对象 */ deskeyspec dks = null; try { dks = new deskeyspec(keydata.getbytes()); } catch (invalidkeyexception e) { e.printstacktrace(); } /** 创建一个密钥工厂 */ secretkeyfactory keyfactory = null; try { keyfactory = secretkeyfactory.getinstance("des"); } catch (nosuchalgorithmexception e) { e.printstacktrace(); } /** 用密钥工厂把deskeyspec转换成一个secretkey对象 */ secretkey key = null; try { key = keyfactory.generatesecret(dks); } catch (invalidkeyspecexception e) { e.printstacktrace(); } /** cipher对象实际完成加密操作 */ cipher cipher = null; try { cipher = cipher.getinstance("des"); } catch (nosuchalgorithmexception e) { e.printstacktrace(); } catch (nosuchpaddingexception e) { e.printstacktrace(); } /** 用密钥初始化cipher对象 */ try { cipher.init(cipher.decrypt_mode, key, sr); } catch (invalidkeyexception e) { e.printstacktrace(); } /** 正式执行解密操作 */ byte decrypteddata[] = null; try { decrypteddata = cipher.dofinal(encrypteddata); } catch (illegalstateexception e) { e.printstacktrace(); } catch (illegalblocksizeexception e) { e.printstacktrace(); } catch (badpaddingexception e) { e.printstacktrace(); } return decrypteddata; } /** * 取得安全密钥 此方法作废,因为每次key生成都不一样导致解密加密用的密钥都不一样, 从而导致given final block not * properly padded错误. * * @return byte数组 * @author 宋立君 * @date 2014年07月03日 */ private byte[] getkey() { /** des算法要求有一个可信任的随机数源 */ securerandom sr = new securerandom(); /** 为我们选择的des算法生成一个密钥生成器对象 */ keygenerator kg = null; try { kg = keygenerator.getinstance("des"); } catch (nosuchalgorithmexception e) { e.printstacktrace(); } kg.init(sr); /** 生成密钥工具类 */ secretkey key = kg.generatekey(); /** 生成密钥byte数组 */ byte rawkeydata[] = key.getencoded(); return rawkeydata; } }
二、base64加密和解密
package com.itjh.javautil; import java.io.*; /** * base64 编码和解码。 * * @author 宋立君 * @date 2014年07月03日 */ public class base64 { public base64() { } /** * 功能:编码字符串 * * @author 宋立君 * @date 2014年07月03日 * @param data * 源字符串 * @return string */ public static string encode(string data) { return new string(encode(data.getbytes())); } /** * 功能:解码字符串 * * @author 宋立君 * @date 2014年07月03日 * @param data * 源字符串 * @return string */ public static string decode(string data) { return new string(decode(data.tochararray())); } /** * 功能:编码byte[] * * @author 宋立君 * @date 2014年07月03日 * @param data * 源 * @return char[] */ public static char[] encode(byte[] data) { char[] out = new char[((data.length + 2) / 3) * 4]; for (int i = 0, index = 0; i < data.length; i += 3, index += 4) { boolean quad = false; boolean trip = false; int val = (0xff & (int) data[i]); val <<= 8; if ((i + 1) < data.length) { val |= (0xff & (int) data[i + 1]); trip = true; } val <<= 8; if ((i + 2) < data.length) { val |= (0xff & (int) data[i + 2]); quad = true; } out[index + 3] = alphabet[(quad ? (val & 0x3f) : 64)]; val >>= 6; out[index + 2] = alphabet[(trip ? (val & 0x3f) : 64)]; val >>= 6; out[index + 1] = alphabet[val & 0x3f]; val >>= 6; out[index + 0] = alphabet[val & 0x3f]; } return out; } /** * 功能:解码 * * @author 宋立君 * @date 2014年07月03日 * @param data * 编码后的字符数组 * @return byte[] */ public static byte[] decode(char[] data) { int templen = data.length; for (int ix = 0; ix < data.length; ix++) { if ((data[ix] > 255) || codes[data[ix]] < 0) { --templen; // ignore non-valid chars and padding } } // calculate required length: // -- 3 bytes for every 4 valid base64 chars // -- plus 2 bytes if there are 3 extra base64 chars, // or plus 1 byte if there are 2 extra. int len = (templen / 4) * 3; if ((templen % 4) == 3) { len += 2; } if ((templen % 4) == 2) { len += 1; } byte[] out = new byte[len]; int shift = 0; // # of excess bits stored in accum int accum = 0; // excess bits int index = 0; // we now go through the entire array (not using the 'templen' value) for (int ix = 0; ix < data.length; ix++) { int value = (data[ix] > 255) ? -1 : codes[data[ix]]; if (value >= 0) { // skip over non-code accum <<= 6; // bits shift up by 6 each time thru shift += 6; // loop, with new bits being put in accum |= value; // at the bottom. if (shift >= 8) { // whenever there are 8 or more shifted in, shift -= 8; // write them out (from the top, leaving any out[index++] = // excess at the bottom for next iteration. (byte) ((accum >> shift) & 0xff); } } } // if there is still something wrong we just have to throw up now! if (index != out.length) { throw new error("miscalculated data length (wrote " + index + " instead of " + out.length + ")"); } return out; } /** * 功能:编码文件 * * @author 宋立君 * @date 2014年07月03日 * @param file * 源文件 */ public static void encode(file file) throws ioexception { if (!file.exists()) { system.exit(0); } else { byte[] decoded = readbytes(file); char[] encoded = encode(decoded); writechars(file, encoded); } file = null; } /** * 功能:解码文件。 * * @author 宋立君 * @date 2014年07月03日 * @param file * 源文件 * @throws ioexception */ public static void decode(file file) throws ioexception { if (!file.exists()) { system.exit(0); } else { char[] encoded = readchars(file); byte[] decoded = decode(encoded); writebytes(file, decoded); } file = null; } // // code characters for values 0..63 // private static char[] alphabet = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789+/=" .tochararray(); // // lookup table for converting base64 characters to value in range 0..63 // private static byte[] codes = new byte[256]; static { for (int i = 0; i < 256; i++) { codes[i] = -1; // loggerutil.debug(i + "&" + codes[i] + " "); } for (int i = 'a'; i <= 'z'; i++) { codes[i] = (byte) (i - 'a'); // loggerutil.debug(i + "&" + codes[i] + " "); } for (int i = 'a'; i <= 'z'; i++) { codes[i] = (byte) (26 + i - 'a'); // loggerutil.debug(i + "&" + codes[i] + " "); } for (int i = '0'; i <= '9'; i++) { codes[i] = (byte) (52 + i - '0'); // loggerutil.debug(i + "&" + codes[i] + " "); } codes['+'] = 62; codes['/'] = 63; } private static byte[] readbytes(file file) throws ioexception { bytearrayoutputstream baos = new bytearrayoutputstream(); byte[] b = null; inputstream fis = null; inputstream is = null; try { fis = new fileinputstream(file); is = new bufferedinputstream(fis); int count = 0; byte[] buf = new byte[16384]; while ((count = is.read(buf)) != -1) { if (count > 0) { baos.write(buf, 0, count); } } b = baos.tobytearray(); } finally { try { if (fis != null) fis.close(); if (is != null) is.close(); if (baos != null) baos.close(); } catch (exception e) { system.out.println(e); } } return b; } private static char[] readchars(file file) throws ioexception { chararraywriter caw = new chararraywriter(); reader fr = null; reader in = null; try { fr = new filereader(file); in = new bufferedreader(fr); int count = 0; char[] buf = new char[16384]; while ((count = in.read(buf)) != -1) { if (count > 0) { caw.write(buf, 0, count); } } } finally { try { if (caw != null) caw.close(); if (in != null) in.close(); if (fr != null) fr.close(); } catch (exception e) { system.out.println(e); } } return caw.tochararray(); } private static void writebytes(file file, byte[] data) throws ioexception { outputstream fos = null; outputstream os = null; try { fos = new fileoutputstream(file); os = new bufferedoutputstream(fos); os.write(data); } finally { try { if (os != null) os.close(); if (fos != null) fos.close(); } catch (exception e) { system.out.println(e); } } } private static void writechars(file file, char[] data) throws ioexception { writer fos = null; writer os = null; try { fos = new filewriter(file); os = new bufferedwriter(fos); os.write(data); } finally { try { if (os != null) os.close(); if (fos != null) fos.close(); } catch (exception e) { e.printstacktrace(); } } } // ///////////////////////////////////////////////// // end of test code. // ///////////////////////////////////////////////// }
ps:关于加密技术,本站还提供了如下加密工具供大家参考使用:
base64编码解码工具:
md5在线加密工具:http://tools.jb51.net/password/createmd5password
escape加密/解密工具:
在线sha1加密工具:
短链(短网址)在线生成工具:
短链(短网址)在线还原工具:
高强度密码生成器:http://tools.jb51.net/password/createstrongpassword