天天看點

關于java生成SecureRandom随機秘鑰的問題

前兩天在做一個項目時需要對文本内容進行3DES加密,利用一個33位自定義的種子秘鑰,使用秘鑰工廠生成一個新的秘鑰去做加密處理.直接上代碼.
           

加密過程:`

public static String getTripleDES(String Str,String keyStr){
	  Key key = null;
        try {
            KeyGenerator _generator = KeyGenerator.getInstance("DES");//擷取DES算法key的工廠
            System.out.println(_generator);
            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");  //産生一個加密的随機數,getInstance方法裡還可以指定用哪個公司的算法,SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG","SUN");用sun公司的jdk,我們公司産品是支援ibm的jdk,調試的時候産生的秘鑰一直和eclipse裡測試裡産生的不一樣
            System.out.println(secureRandom);
            secureRandom.setSeed(keyStr.getBytes()); //使用種子秘鑰可以生成個固定的加密秘鑰.
            _generator.init(secureRandom);	            
            key = _generator.generateKey();
            System.out.println(key);
            _generator = null;
        } catch (NoSuchAlgorithmException e) {
        	System.out.println("key生成失敗");
            e.printStackTrace();
            return null;
        }
        byte[] byteMi = null;
        byte[] byteMing = null;
        String strMi = "";
        try {
            byteMing = Str.getBytes("utf-8");	            
            System.out.println(byteMing);
            byteMi = getEncCode(byteMing, key);
            strMi = new String(Base64.encodeBase64URLSafe(byteMi),"UTF-8");//base64URL主要用于連結的加密,将base64編碼後的字元串中"+"替換為"-","/"替換為_"",
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("3DES加密失敗");
        } finally {
            byteMi = null;
            byteMing = null;
        }
        return strMi;
}`
   
   /**
 * 獲得一次3DES加密後的密文
 * 
 * @param byts
 * @return
 */
private static byte[] getEncCode(byte[] byts, Key key) {
    byte[] byteFina = null;
    Cipher cipher;
    try {
        cipher = Cipher.getInstance("DES");
        cipher.init(Cipher.ENCRYPT_MODE, key);//加密模式為CBC
        System.out.println(cipher);
        byteFina = cipher.doFinal(byts);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        cipher = null;
    }
    return byteFina;
}
           

接下來是解密過程,解密時同樣使用自定義的種子秘鑰生成一個加密的秘鑰,此秘鑰和上面加密過程中産生的秘鑰是一樣的:

/**
     * 獲得3DES解密後的明文
     * 
     * @param sign 密文
     * @param keyStr 自定義秘鑰
     * @return 明文
     */
    public static String getDecString(String sign, String keyStr) {
    	Key key = null;
        try {
            KeyGenerator _generator = KeyGenerator.getInstance("DES");
            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");  
            secureRandom.setSeed(keyStr.getBytes());  
            _generator.init(secureRandom);
            key = _generator.generateKey();  //生成加密字元串的秘鑰
            _generator = null;
        } catch (NoSuchAlgorithmException e) {
        	System.out.println("key生成失敗");
            e.printStackTrace();
            return null;
        }
    	
        byte[] byteMing = null;
        byte[] byteMi = null;
        String strMing = "";//解密後的明文
        try {
            byteMi =Base64.decodeBase64(sign);  //解密的方法jdk源碼中已經相容了.decodeBase64URLSaf()的方法,有興趣的可以研究研究
            byteMing = getDecCode(byteMi, key);  //解密操作
            strMing = new String(byteMing, "utf-8");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("解密失敗");
        } finally {
            byteMing = null;
            byteMi = null;
        }
        return strMing;
    }
	
	/**
     * 獲得一次3DES加密後的密文
     * 
     * @param byts
     * @return
     */
    private static byte[] getEncCode(byte[] byts, Key key) {
        byte[] byteFina = null;
        Cipher cipher;
        try {
            cipher = Cipher.getInstance("DES");
            cipher.init(Cipher.ENCRYPT_MODE, key);//key-->通過key工廠随機産生的解密秘鑰
            System.out.println(cipher);
            byteFina = cipher.doFinal(byts);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            cipher = null;
        }
        return byteFina;
    }
           

最後是調試過程:

public static void main(String[] args) {
				
		try{
			String Str = "1|000000109514|D201811191542590446642|20181119|09:20|210.00|交易成功";
			String keyStr = "MIIBIjANBgkqhkiG9w0BAQEFAQ8AMaAwQ";   //種子密鑰
			
			
			String  strMi = chkFile.getTripleDES(Str,keyStr);
			System.out.println("加密後字元串:"+strMi);
			
			String strMing  = chkFile.getDecString(strMi,keyStr);
			System.out.println("解密後字元串:"+strMing);
			
			System.out.print("寫入加密内容成功");
		}catch(Exception e){
			e.printStackTrace();
		}

	}
           

第一次寫部落格,還請各位大佬捧個場,多多指教.