Java中加密分為兩種方式一個是對稱加密,另一個是非對稱加密。對稱加密是因為加密和解密的鑰匙相同,而非對稱加密是加密和解密的鑰匙不同。
對稱加密與非對稱加密的區別:
對稱加密稱為密鑰加密,速度快,但加密和解密的鑰匙必須相同,只有通信雙方才能知道密鑰。
非對稱加密稱為公鑰加密,算法更加復雜,速度慢,加密和解密鑰匙不相同,任何人都可以知道公鑰,只有一個人持有私鑰可以解密。
對稱加密解密:
- /*
- * 對稱加密
- */
- private static void secretEncrypt() throws Exception {
- //使用Cipher的實例
- Cipher cipher =Cipher.getInstance("AES");
-
- //得到加密的鑰匙
- SecretKey key =KeyGenerator.getInstance("AES").generateKey();
-
- //初始化加密操作,傳遞加密的鑰匙
- cipher.init(Cipher.ENCRYPT_MODE,key);
-
- //將加密的鑰匙寫入secretKey.key文件中
- FileOutputStream fosKey=new FileOutputStream("secretKey.key");
- ObjectOutputStream oosSecretKey =new ObjectOutputStream(fosKey);
- oosSecretKey.writeObject(key);
- oosSecretKey.close();
- fosKey.close();
-
- //將加密的內容傳遞進去,返回加密後的二進制數據
- byte [] results =cipher.doFinal("哈哈哈哈哈".getBytes());
-
- //將加密後的二進制數據寫入到secretContent.dat文件中
- FileOutputStream fosData=new FileOutputStream("secretContent.dat");
- fosData.write(results);
- fosData.close();
- }
-
- /*
- * 對稱解密
- */
- private static void secretDecrypt() throws Exception{
- Cipher cipher =Cipher.getInstance("AES");
-
- //獲取文件中的key進行解密
- FileInputStream fisKey=new FileInputStream("secretKey.key");
- ObjectInputStream oisKey =new ObjectInputStream(fisKey);
- Key key =(Key)oisKey.readObject();
- oisKey.close();
- fisKey.close();
-
- //初始化解密操作,傳遞加密的鑰匙
- cipher.init(Cipher.DECRYPT_MODE,key);
-
- //獲取文件中的二進制數據
- FileInputStream fisDat=new FileInputStream("secretContent.dat");
- //獲取數據第一種方式
- byte [] src=new byte [fisDat.available()];
- int len =fisDat.read(src);
- int total =0;
- while(total<src.length){
- total +=len;
- len=fisDat.read(src,total,src.length-total);
- }
- //執行解密
- byte [] result=cipher.doFinal(src);
- fisDat.close();
- System.out.println(new String(result));
-
- // 讀文件中的數據第二種方式
- // ByteArrayOutputStream baos =new ByteArrayOutputStream();
- // copyStream(fisDat, baos);
- // byte [] result=cipher.doFinal(baos.toByteArray());
- // fisDat.close();
- // baos.close();
- }
-
- // private static void copyStream(InputStream ips,OutputStream ops) throws Exception{
- // byte [] buf =new byte[1024];
- // int len=ips.read(buf);
- // while(len!=-1){
- // ops.write(buf,0,len);
- // len =ips.read(buf);
- // }
- // }