文件加解密算法 java代码_java文件加解密算法

packagesmart.jrsoft.util;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.InputStream;importjava.security.MessageDigest;importjavax.crypto.Cipher;importjavax.crypto.SecretKey;importjavax.crypto.SecretKeyFactory;importjavax.crypto.spec.DESKeySpec;publicclassEncryptUtil {/*** 用户MD5不可逆算法对密钥字符串进行加密

*

*@paraminStr

*@return*/publicstaticString encrypt(String inStr) {

MessageDigest md=null;

String out=null;try{

md=MessageDigest.getInstance("MD5");byte[] digest=md.digest(inStr.getBytes());

out=byte2hex(digest);

}catch(Exception e) {

e.printStackTrace();

}returnout;

}privatestaticString byte2hex(byte[] b) {

String hs="";

String stmp="";for(intn=0; n

stmp=(java.lang.Integer.toHexString(b[n]&0XFF));if(stmp.length()==1) {

hs=hs+"0"+stmp;

}else{

hs=hs+stmp;

}

}returnhs.toUpperCase();

}/*** 加密方法 输入:要加密的文件,密钥字符串 输出: 对输入的文件加密后,保存到同一文件夹下增加了".jsmt"扩展名的文件中。*/publicstaticintencryptFile(String FileName, String sKey) {intRtn=0;try{//因为密钥须为32位的字符串,故将用户传递的参数用encrypt方法进行处理;//(由0-F组成,共32个字符,我们将其拆解为2个16位的密码后进行二次加密运算)如://AD67EA2F3BE6E5AD D368DFE03120B5DFsKey=encrypt(sKey);

System.out.println(sKey);if(sKey.length()!=32) {

Rtn=-1;//sKey is Wrong.//密码长度必须等于32!returnRtn;

}byte[] bytK1=getKeyByStr(sKey.substring(0,16));byte[] bytK2=getKeyByStr(sKey.substring(16,32));

File fileIn=newFile(FileName);if(!fileIn.exists()) {

Rtn=-2;//需要加密的文件没有找到。returnRtn;

}

FileInputStream fis=newFileInputStream(fileIn);byte[] bytIn=newbyte[(int) fileIn.length()];for(inti=0; i

bytIn[i]=(byte) fis.read();

}//加密byte[] bytOut=encryptByDES(encryptByDES(bytIn, bytK1), bytK2);

String fileOut=fileIn.getPath()+".jsmt";

FileOutputStream fos=newFileOutputStream(fileOut);for(inti=0; i

fos.write((int) bytOut[i]);

}

fos.close();returnRtn;

}catch(Exception e) {

Rtn=-3;//其他原因导致的加密失败!returnRtn;

}

}/*** 解密函数 输入: 要解密的文件,密钥字符串 输出: 对制定的文件进行解密处理,保存到用户指定的文件中。(注:待解密的文件扩展名必须为:.jsmt)*/publicstaticintdecryptFile(String CryptFileName, String sKey) {intRtn=0;//默认的返回值为0,成功!try{//因为密钥须为32位的字符串,故将用户传递的参数用encrypt方法进行处理;//(由0-F组成,共32个字符,我们将其拆解为2个16位的密码后进行二次解密运算)如://AD67EA2F3BE6E5AD D368DFE03120B5DFsKey=encrypt(sKey);if(sKey.length()!=32) {

Rtn=-1;//sKey is Wrong.//密码长度必须等于32!returnRtn;

}

String strPath=CryptFileName;if(!strPath.substring(strPath.length()-5).toLowerCase().equals(".jsmt")) {

Rtn=-2;//CryptFileName 扩展名必须为:.jsmtreturnRtn;

}//用户指定要保存的文件strPath=strPath.substring(0, strPath.length()-5);byte[] bytK1=getKeyByStr(sKey.substring(0,16));byte[] bytK2=getKeyByStr(sKey.substring(16,32));

File fileIn=newFile(CryptFileName);if(!fileIn.exists()) {

Rtn=-3;//需要解密的文件没有找到。returnRtn;

}

FileInputStream fis=newFileInputStream(fileIn);byte[] bytIn=newbyte[(int) fileIn.length()];for(inti=0; i

bytIn[i]=(byte) fis.read();

}//解密byte[] bytOut=decryptByDES(decryptByDES(bytIn, bytK2), bytK1);

File fileOut=newFile(strPath);

fileOut.createNewFile();

FileOutputStream fos=newFileOutputStream(fileOut);for(inti=0; i

fos.write((int) bytOut[i]);

}

fos.close();returnRtn;//解密成功}catch(Exception e) {

Rtn=-4;//其他原因导致的解密失败!returnRtn;

}

}/*** 用DES方法加密输入的字节 bytKey需为8字节长,是加密的密码*/privatestaticbyte[] encryptByDES(byte[] bytP,byte[] bytKey)throwsException {

DESKeySpec desKS=newDESKeySpec(bytKey);

SecretKeyFactory skf=SecretKeyFactory.getInstance("DES");

SecretKey sk=skf.generateSecret(desKS);

Cipher cip=Cipher.getInstance("DES");

cip.init(Cipher.ENCRYPT_MODE, sk);returncip.doFinal(bytP);

}/*** 用DES方法解密输入的字节 bytKey需为8字节长,是解密的密码*/privatestaticbyte[] decryptByDES(byte[] bytE,byte[] bytKey)throwsException {

DESKeySpec desKS=newDESKeySpec(bytKey);

SecretKeyFactory skf=SecretKeyFactory.getInstance("DES");

SecretKey sk=skf.generateSecret(desKS);

Cipher cip=Cipher.getInstance("DES");

cip.init(Cipher.DECRYPT_MODE, sk);returncip.doFinal(bytE);

}/*** 输入密码的字符形式,返回字节数组形式。 如输入字符串:AD67EA2F3BE6E5AD

* 返回字节数组:{173,103,234,47,59,230,229,173}*/privatestaticbyte[] getKeyByStr(String str) {byte[] bRet=newbyte[str.length()/2];for(inti=0; i

Integer itg=newInteger(16*getChrInt(str.charAt(2*i))+getChrInt(str.charAt(2*i+1)));

bRet[i]=itg.byteValue();

}returnbRet;

}/*** 计算一个16进制字符的10进制值 输入:0-F*/privatestaticintgetChrInt(charchr) {intiRet=0;if(chr=="0".charAt(0))

iRet=0;if(chr=="1".charAt(0))

iRet=1;if(chr=="2".charAt(0))

iRet=2;if(chr=="3".charAt(0))

iRet=3;if(chr=="4".charAt(0))

iRet=4;if(chr=="5".charAt(0))

iRet=5;if(chr=="6".charAt(0))

iRet=6;if(chr=="7".charAt(0))

iRet=7;if(chr=="8".charAt(0))

iRet=8;if(chr=="9".charAt(0))

iRet=9;if(chr=="A".charAt(0))

iRet=10;if(chr=="B".charAt(0))

iRet=11;if(chr=="C".charAt(0))

iRet=12;if(chr=="D".charAt(0))

iRet=13;if(chr=="E".charAt(0))

iRet=14;if(chr=="F".charAt(0))

iRet=15;returniRet;

}/*** 随机产生一个密钥字符串,给输入流进行加密

*

*@paramis

*@return*//*public static EncryptInfo encryptInputStream1(InputStream is) {

try {

EncryptInfo encryptInfo = new EncryptInfo(is.available());

String sKey = RandomEncryptString.getEncryptKeyStr();

System.out.println(sKey);

if (sKey.length() != 32) {// 密钥必须是32位 encryptInfo = new

// EncryptInfo(0);

encryptInfo.setEncryptKye("密钥必须是32位");

return encryptInfo;

}

encryptInfo.setEncryptKye(sKey);

byte[] bytK1 = getKeyByStr(sKey.substring(0, 16));

byte[] bytK2 = getKeyByStr(sKey.substring(16, 32));

byte[] bytIn = new byte[is.available()];

int c;

int i = 0;

while ((c = is.read()) != -1) {

bytIn[i] = (byte) c;

} // 加密

encryptInfo

.setBytes(encryptByDES(encryptByDES(bytIn, bytK1), bytK2));

return encryptInfo;

} catch (Exception e) {

return null;

}

}*/publicstaticbyte[] encryptInputStream(InputStream is) {try{

String sKey=encrypt("jiuqi.com.cn");if(sKey.length()!=32) {//密钥必须是32位returnnull;

}byte[] bytK1=getKeyByStr(sKey.substring(0,16));byte[] bytK2=getKeyByStr(sKey.substring(16,32));byte[] bytIn=newbyte[is.available()];intc;inti=0;while((c=is.read())!=-1) {

bytIn[i]=(byte) c;

i++;

}byte[] bytes=encryptByDES(encryptByDES(bytIn, bytK1), bytK2);returnbytes;

}catch(Exception e) {

e.printStackTrace();returnnull;

}

}/*** 利用密钥对文件流进行解密

*

*@paramis

*            文件流

*@return*/publicstaticbyte[] decryptInputStream(InputStream is) {try{

String encryptKey=encrypt("jiuqi.com.cn");byte[] bytK1=getKeyByStr(encryptKey.substring(0,16));byte[] bytK2=getKeyByStr(encryptKey.substring(16,32));byte[] bytes=newbyte[is.available()];

is.read(bytes);returndecryptByDES(decryptByDES(bytes, bytK2), bytK1);

}catch(Exception e) {

e.printStackTrace();returnnull;

}

}

}//class is over.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值