packagecom.palic.pss.afcs.worldthrough.common.util;
importjavax.crypto.Cipher;
importjavax.crypto.spec.SecretKeySpec;
importrepack.com.thoughtworks.xstream.core.util.Base64Encoder;
/**
*AES加密解密
*@authorEX-CHENQI004
*
*/
publicclassAesUtils{
publicstaticfinalStringcKey="assistant7654321";
/**
*加密--把加密後的byte數組先進行二進制轉16進制在進行base64編碼
*@paramsSrc
*@paramsKey
*@return
*@throwsException
*/
publicstaticStringencrypt(StringsSrc,StringsKey)throwsException{
if(sKey==null){
("ArgumentsKeyisnull.");
}
if(sKey.length()!=16){
(
"ArgumentsKey'lengthisnot16.");
}
byte[]raw=sKey.getBytes("ASCII");
SecretKeySpecskeySpec=newSecretKeySpec(raw,"AES");
Ciphercipher=Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE,skeySpec);
byte[]encrypted=cipher.doFinal(sSrc.getBytes("UTF-8"));
StringtempStr=parseByte2HexStr(encrypted);
Base64Encoderencoder=newBase64Encoder();
returnencoder.encode(tempStr.getBytes("UTF-8"));
}
/**
*解密--先進行base64解碼,在進行16進制轉為2進制然後再解碼
*@paramsSrc
*@paramsKey
*@return
*@throwsException
*/
publicstaticStringdecrypt(StringsSrc,StringsKey)throwsException{
if(sKey==null){
("499");
}
if(sKey.length()!=16){
("498");
}
byte[]raw=sKey.getBytes("ASCII");
SecretKeySpecskeySpec=newSecretKeySpec(raw,"AES");
Ciphercipher=Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE,skeySpec);
Base64Encoderencoder=newBase64Encoder();
byte[]encrypted1=encoder.decode(sSrc);
StringtempStr=newString(encrypted1,"utf-8");
encrypted1=parseHexStr2Byte(tempStr);
byte[]original=cipher.doFinal(encrypted1);
StringoriginalString=newString(original,"utf-8");
returnoriginalString;
}
/**
*將二進制轉換成16進制
*
*@parambuf
*@return
*/
(bytebuf[]){
StringBuffersb=newStringBuffer();
for(inti=0;i<buf.length;i++){
Stringhex=Integer.toHexString(buf[i]&0xFF);
if(hex.length()==1){
hex='0'+hex;
}
sb.append(hex.toUpperCase());
}
returnsb.toString();
}
/**
*將16進制轉換為二進制
*
*@paramhexStr
*@return
*/
publicstaticbyte[]parseHexStr2Byte(StringhexStr){
if(hexStr.length()<1)
returnnull;
byte[]result=newbyte[hexStr.length()/2];
for(inti=0;i<hexStr.length()/2;i++){
inthigh=Integer.parseInt(hexStr.substring(i*2,i*2+1),16);
intlow=Integer.parseInt(hexStr.substring(i*2+1,i*2+2),
16);
result[i]=(byte)(high*16+low);
}
returnresult;
}
publicstaticvoidmain(String[]args)throwsException{
/*
*加密用的Key可以用26個字母和數字組成,最好不要用保留字元,雖然不會錯,至於怎麼裁決,個人看情況而定
*/
StringcKey="assistant7654321";
//需要加密的字串
StringcSrc="123456";
//加密
longlStart=System.currentTimeMillis();
StringenString=encrypt(cSrc,cKey);
System.out.println("加密後的字串是:"+enString);
longlUseTime=System.currentTimeMillis()-lStart;
System.out.println("加密耗時:"+lUseTime+"毫秒");
//解密
lStart=System.currentTimeMillis();
StringDeString=decrypt(enString,cKey);
System.out.println("解密後的字串是:"+DeString);
lUseTime=System.currentTimeMillis()-lStart;
System.out.println("解密耗時:"+lUseTime+"毫秒");
}
}
⑵ 使用java做一個加密和隱藏文件的軟體,具體需要怎麼做求指導
不知道你打算怎麼加密呢?隱藏又是什麼意思?是將多個文件合成一個嗎?
因為從操作系統層面來說理應能看到所有合法的文件,因此想要讓操作系統都看不到基本上是不可能的(何況Java也是用的操作系統API來實現對文件的操作)。
就加密我說說我的想法吧,首先需要一個加密的演算法。這個演算法需要滿足:演算法可逆,雙向計算復雜度(時間/空間)低,安全程度高,可靠性高。另外可以考慮並行化來增加性能,因為現在的文件系統大多比較大,管理的東西都不小。
如果能找到這樣一個演算法,可以對於文件使用二進制的讀寫(Binary I/O),然後每讀到一定大小的數據就進行加密運算,並寫入目標加密文件中。如果是解密則是讀取數據進行解密運算。
題外話:我覺得實際上做這樣一個軟體也沒有必要,每次存取文件都需要進行大量的計算操作,也很容易破壞cache的局部性原理。如果真的需要對一部分文件進行加密,也有很多現成的工具可用,甚至於是說現在的壓縮文件都可以帶上密碼加密。所以我認為這個軟體的前景不大,當然如果只是用來玩一玩也是可以的,只不過演算法比較難找而已。(如果用RSA這種級別的演算法估計也行的吧……)
⑶ java 加密方式有哪些
Java加密方式有多種,包括對稱加密、非對稱加密、散列加密等。
1. 對稱加密:
對稱加密是指加密和解密使用相同密鑰的加密方式。在Java中,常見的對稱加密演算法有AES、DES、3DES等。其中,AES演算法是DES的替代品,具有更高的安全性。這些演算法提供了不同級別的加密強度,適用於保護敏感信息。
2. 非對稱加密:
非對稱加密使用一對密鑰,一個用於加密,另一個用於解密。在Java中,常見的非對稱加密演算法有RSA、DSA、ECC等。RSA演算法是最常用的非對稱加密演算法之一,它利用公鑰進行加密,私鑰進行解密,適用於安全通信和數字簽名。
3. 散列加密(哈希加密):
散列加密是一種將任意長度的輸入轉換為固定長度輸出的加密方式。在Java中,常見的散列加密演算法有MD5、SHA-1、SHA-256等。這些演算法主要用於生成數據的唯一標識符(哈希值),適用於密碼存儲、文件校驗等場景。需要注意的是,雖然MD5在某些情況下存在安全隱患,但SHA系列演算法提供了更高的安全性。
以上三種加密方式在Java中都有廣泛的應用,根據具體需求選擇合適的加密方式至關重要。同時,為了確保加密的安全性,還需要注意密鑰的管理和保護,避免密鑰泄露帶來的安全風險。
⑷ java 對大文件怎麼加密
選擇一個加密演算法
輸入為bufferIn,輸出為bufferOut
循環讀取文件,讀滿緩沖區就調用加密演算法,然後輸出至目標文件
不可能一次性將幾兆的文件一次性進行加密的