Javaでよく使用される暗号解読クラス

10510 ワード

最近1つのプロジェクトをして、以前のすべてのプロジェクトがユーザーの登録とログインとすべてのユーザー自身のプライバシーに関する情報をバックグラウンドに提出する時すべて暗号化処理を行っていないことを考えて、甚だしきに至っては直接明文の方式でネット上で伝送して、同時に直接明文の方式でデータベースの中に保存します.したがって,暗号化処理を先に行ってからネットワーク伝送を行い,最後に暗号化されたデータをデータベースに格納することで,システムのセキュリティを向上させることができると考えられる.
暗号化と復号化は複雑な学科であり、より深い暗号化復号化の知識を理解するには、他の資料を参照してください.本稿では、暗号化復号化の使用方法の一部だけを説明します.
一般的な暗号解読には、情報要約アルゴリズム:MD 5、SHA(すなわち、一方向暗号化は理論的には解読できない)、対称暗号アルゴリズム:DES、3 DES、AES、非対称暗号アルゴリズム:RSA、DSA
本稿では,一方向暗号化と対称暗号化についてのみ説明し,非対称暗号化については後で追加する.直接コードをアップロードし、親近テストを実行できます.
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
/**
 *        
 */
public class EncryptUtils {
	/**
	 *   MD5  
	 * 
	 * @param info       
	 * @return String        
	 */
	public String encryptToMD5(String info) {
		byte[] digesta = null;
		try {
			//     md5     
			MessageDigest alga = MessageDigest.getInstance("MD5");
			//             
			alga.update(info.getBytes());
			//      
			digesta = alga.digest();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		//         
		String rs = byte2hex(digesta);
		return rs;
	}

	/**
	 *   SHA  
	 * 
	 * @param info       
	 * @return String        
	 */
	public String encryptToSHA(String info) {
		byte[] digesta = null;
		try {
			//     SHA-1     
			MessageDigest alga = MessageDigest.getInstance("SHA-1");
			//             
			alga.update(info.getBytes());
			//      
			digesta = alga.digest();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		//         
		String rs = byte2hex(digesta);
		return rs;
	}
	

	/**
	 *             key
	 * @param src
	 * @return
	 */
	public String getKey(String algorithm,String src){
		if(algorithm.equals("AES")){
			return src.substring(0, 16);
		}else if(algorithm.equals("DES")){
			return src.substring(0, 8);
		}else{
			return null;
		}
	}
	/**
	 *   AES   key
	 * @param src
	 * @return
	 */
	public String getAESKey(String src){
		return this.getKey("AES", src);
	}
	/**
	 *   DES   key
	 * @param src
	 * @return
	 */
	public String getDESKey(String src){
		return this.getKey("DES", src);
	}
	/**
	 *     
	 * 
	 * @param algorithm     ,   AES,DES,DESede,Blowfish
	 * @return SecretKey   (  )  
	 */
	public SecretKey createSecretKey(String algorithm) {
		//   KeyGenerator  
		KeyGenerator keygen;
		//        
		SecretKey deskey = null;
		try {
			//                KeyGenerator   
			keygen = KeyGenerator.getInstance(algorithm);
			//       
			deskey = keygen.generateKey();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		//     
		return deskey;
	}

	/**
	 *     AES   
	 * @return
	 */
	public SecretKey createSecretAESKey() {
		return createSecretKey("AES");
	}

	/**
	 *     DES   
	 * @return
	 */
	public SecretKey createSecretDESKey() {
		return createSecretKey("DES");
	}

	/**
	 *          、  、       ,        
	 * @param Algorithm     :DES,AES
	 * @param key
	 * @param info
	 * @return
	 */
	public String encrypt(String Algorithm, SecretKey key, String info) {
		//         
		byte[] cipherByte = null;
		try {
			//     /   
			Cipher c1 = Cipher.getInstance(Algorithm);
			//             Cipher  
			//   :(ENCRYPT_MODE, DECRYPT_MODE, WRAP_MODE,UNWRAP_MODE)
			c1.init(Cipher.ENCRYPT_MODE, key);
			//              ,
			cipherByte = c1.doFinal(info.getBytes());
		} catch (Exception e) {
			e.printStackTrace();
		}
		//            
		return byte2hex(cipherByte);
	}

	/**
	 *          、              ,          
	 * @param Algorithm
	 * @param key
	 * @param sInfo
	 * @return
	 */
	public String decrypt(String Algorithm, SecretKey key, String sInfo) {
		byte[] cipherByte = null;
		try {
			//     /   
			Cipher c1 = Cipher.getInstance(Algorithm);
			//             Cipher  
			c1.init(Cipher.DECRYPT_MODE, key);
			//              
			cipherByte = c1.doFinal(hex2byte(sInfo));
		} catch (Exception e) {
			e.printStackTrace();
		}
		return new String(cipherByte);
	}

	/**
	 *          、                 ,          
	 * @param Algorithm     :DES,AES
	 * @param key   key            AES    16 ,DES    8 
	 * @param sInfo
	 * @return
	 */
	public static String decrypt(String Algorithm, String sSrc, String sKey) throws Exception {
		try {
			//   Key    
			if (sKey == null) {
				throw new Exception("Key  null");
			}
			//     AES      Key   16 
			if (Algorithm.equals("AES") && sKey.length() != 16) {
				throw new Exception("Key    16 ");
			}
			//     DES      Key   8 
			if (Algorithm.equals("DES") && sKey.length() != 8) {
				throw new Exception("Key    8 ");
			}
			byte[] raw = sKey.getBytes("ASCII");
			SecretKeySpec skeySpec = new SecretKeySpec(raw, Algorithm);
			Cipher cipher = Cipher.getInstance(Algorithm);
			cipher.init(Cipher.DECRYPT_MODE, skeySpec);
			byte[] encrypted1 = hex2byte(sSrc);
			try {
				byte[] original = cipher.doFinal(encrypted1);
				String originalString = new String(original);
				return originalString;
			} catch (Exception e) {
				throw e;
			}
		} catch (Exception ex) {
			throw ex;
		}
	}

	/**
	 *          、     、       ,        
	 * @param Algorithm     :DES,AES
	 * @param key   key            AES    16 ,DES    8 
	 * @param info
	 * @return
	 */
	public static String encrypt(String Algorithm, String sSrc, String sKey) throws Exception {
		//   Key    
		if (sKey == null) {
			throw new Exception("Key  null");
		}
		//     AES      Key   16 
		if (Algorithm.equals("AES") && sKey.length() != 16) {
			throw new Exception("Key    16 ");
		}
		//     DES      Key   8 
		if (Algorithm.equals("DES") && sKey.length() != 8) {
			throw new Exception("Key    8 ");
		}
		byte[] raw = sKey.getBytes("ASCII");
		SecretKeySpec skeySpec = new SecretKeySpec(raw, Algorithm);
		Cipher cipher = Cipher.getInstance(Algorithm);
		cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
		byte[] encrypted = cipher.doFinal(sSrc.getBytes());
		return byte2hex(encrypted);
	}

	/**
	 *   DES           
	 * @param key
	 * @param info
	 * @return
	 */
	public String encryptToDES(SecretKey key, String info) {
		return encrypt("DES", key, info);
	}

	/**
	 *   DES           
	 * @param key
	 * @param info
	 * @return
	 * @throws Exception
	 */
	public String encryptToDES(String key, String info) throws Exception {
		return encrypt("DES", info, key);
	}

	/**
	 *   DES             ,               
	 * @param key
	 * @param sInfo
	 * @return
	 */
	public String decryptByDES(SecretKey key, String sInfo) {
		return decrypt("DES", key, sInfo);
	}

	/**
	 *   DES             ,               
	 * @param key
	 * @param sInfo
	 * @return
	 */
	public String decryptByDES(String key, String sInfo) throws Exception {
		return decrypt("DES", sInfo, key);
	}

	/**
	 *   AES           
	 * @param key
	 * @param info
	 * @return
	 */
	public String encryptToAES(SecretKey key, String info) {
		return encrypt("AES", key, info);
	}
	/**
	 *   AES           
	 * @param key
	 * @param info
	 * @return
	 * @throws Exception
	 */
	public String encryptToAES(String key, String info) throws Exception {
		return encrypt("AES", info, key);
	}

	/**
	 *   AES             ,               
	 * @param key
	 * @param sInfo
	 * @return
	 */
	public String decryptByAES(SecretKey key, String sInfo) {
		return decrypt("AES", key, sInfo);
	}
	/**
	 *   AES             ,               
	 * @param key
	 * @param sInfo
	 * @return
	 */
	public String decryptByAES(String key, String sInfo) throws Exception {
		return decrypt("AES", sInfo, key);
	}

	/**
	 *           2  
	 * 
	 * @param hex
	 * @return
	 */
	public static byte[] hex2byte(String strhex) {
		if (strhex == null) {
			return null;
		}
		int l = strhex.length();
		if (l % 2 == 1) {
			return null;
		}
		byte[] b = new byte[l / 2];
		for (int i = 0; i != l / 2; i++) {
			b[i] = (byte) Integer.parseInt(strhex.substring(i * 2, i * 2 + 2), 16);
		}
		return b;
	}

	/**
	 *        16     
	 * 
	 * @param b        
	 * @return String
	 */
	public static String byte2hex(byte[] b) {
		String hs = "";
		String stmp = "";
		for (int n = 0; n < b.length; n++) {
			stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
			if (stmp.length() == 1) {
				hs = hs + "0" + stmp;
			} else {
				hs = hs + stmp;
			}
		}
		return hs.toUpperCase();
	}

	/**
	 *   
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		EncryptUtils encryptUtils = new EncryptUtils();
		String source = "www.putiman.com";
		System.out.println("Hello  MD5:" + encryptUtils.encryptToMD5(source));
		System.out.println("Hello  SHA:" + encryptUtils.encryptToSHA(source));
		System.out.println("========    Key     ==============");
		//     DES     
		SecretKey key = encryptUtils.createSecretDESKey();
		String str1 = encryptUtils.encryptToDES(key, source);
		System.out.println("DES    :" + str1);
		//         
		String str2 = encryptUtils.decryptByDES(key, str1);
		System.out.println("DES    :" + str2);

		//     AES     
		SecretKey key1 = encryptUtils.createSecretAESKey();
		String stra = encryptUtils.encryptToAES(key1, source);
		System.out.println("AES    :" + stra);
		//         
		String strb = encryptUtils.decryptByAES(key1, stra);
		System.out.println("AES    :" + strb);
		System.out.println("========  Key     ==============");
		try {
			String AESKey = encryptUtils.getAESKey(encryptUtils.encryptToSHA(source));
			String DESKey = encryptUtils.getDESKey(encryptUtils.encryptToSHA(source));
			System.out.println(AESKey);
			System.out.println(DESKey);
			String str11 = encryptUtils.encryptToDES(DESKey, source);
			System.out.println("DES    :" + str11);
			//         
			String str12 = encryptUtils.decryptByDES(DESKey, str11);
			System.out.println("DES    :" + str12);

			//     AES     
			String strc = encryptUtils.encryptToAES(AESKey, source);
			System.out.println("AES    :" + strc);
			//         
			String strd = encryptUtils.decryptByAES(AESKey, strc);
			System.out.println("AES    :" + strd);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

詳細については、以下を参照してください.http://www.16boke.com