java DES算法实现字符串加密(本地txt存取)

什么是DES加密算法

常见加密算法有对称加密算法和非对称加密算法,它们的区别是加密和解密使用的是否是同一把钥匙,常见的对称加密算法有DES,非对称算法有RSA,我们这里重点介绍DES加密算法,我们希望把这种算法应用在本地账号密码信息的加密上。顾名思义,秘钥在这里用来加密数据,解密数据的,我们通过原字符串和秘钥可以获得加密后的字节数组,保存在本地,取出后,利用秘钥解密得到之前存储的字符串,在生产字符串之前,我们是无法通过别的途径拿到数据的。我们这里重点介绍DES算法的使用,在Java中,有一组DES的API,我们需要学会如何去使用它。

DES加密算法的特点

  1. 秘钥是字节数组,且其长度必须是8的整数倍。
  2. 加密、解密都需要同一把秘钥参与(它是一个字节数组)。
  3. 对称加密算法,加密和解密的流程类似。

需要注意的地方

  1. 我们采用IO流的方式存取数据,存数据的时候是直接把字节数组写入文件流。
  2. 取出数据时,我们先用一个长数组接收(假设长度未知),再获取字节数组的长度,然后截取相应长度到新数组。
  3. 解密后得到的是字节数组,且其中每个元素都是用ASCII码表示的,我们需要把它转为字符串。

Java实现DES加密、解密字符串及本地存取数据

1、字符串加密,解密,IO流本地存取:

public class Test {	
	/**
	 * 把字符串加密得到字节数组写入文件保存在本地,等待取出;当需要用到的时候,取出字节数组,解密 ,转字符串
	 * @param args
	 */
	public static void main(String[] args){     		
		 byte[] buff1 = null; //申明变量,等下要用到
		 String password = "231rg34324234324dgdgdg3"; //需要加密的内容
		 System.out.println("需要加密的字符串:"+password);
		 byte[] key ={1,2,3,4,5,6,7,8}; //8位密钥
		 byte[] result1 = DES.desEncrypt(password.getBytes(), key ) ;//加密,返回加密后的字节数组
	     System.out.println("加密后的字节数组:"+Arrays.toString(result1));   		 
		 File file = new File("E:\\workspace\\mayifan\\src\\com\\myf\\des1210\\data.txt");//地址
		 try {
		 FileOutputStream out = new FileOutputStream(file); //输出流					     
	     out.write(result1); //写入文件,直接写字节数组
	     out.close(); //关资源	     
	     byte[] buff = new byte[1024]; 
	     FileInputStream fis = new FileInputStream(file);//文件输入流,准备读文件字节
	     int length =fis.read(buff); //读数据到buff,并返回长度
	     buff1 = new byte[length];  
	     System.arraycopy(buff, 0, buff1, 0 , length );//System的静态方法 ,(原数组,原数组起始位置,目的数组,目的数组起始位置,截长度)	
	     System.out.println("从文件中读出来的字节数组:"+Arrays.toString(buff1));
	     fis.close();	     
		} catch (FileNotFoundException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}catch(IOException e){
			e.printStackTrace();
		}	      					 
	    byte[] result2 = DES.desDecrypt(buff1, key ) ;//解密	                       
	    System.out.println("解密得到的字节数组转字符串并打印"+Arrays.toString(result2));  //打印解密得到的字节数组转字符串       	   
			try {
		    String passwordGeted = new String(result2,"ascii");  //字节数组表示的是ASCII码,字节数组转字符串
			System.out.println("最终得到的字符串:"+passwordGeted); //打印字符串
		} catch (UnsupportedEncodingException e) {   //可能会有字符的编码异常,故try,catch
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
	    //得到的字符串和之前输入的字符串一致
	}			
}

2、工具类,包括DES加密算法和DES解密算法:

public class DES {	
	// 加密
	public static byte[] desEncrypt(byte[] data,byte[] keyData){
	    return des(Cipher.ENCRYPT_MODE,data,keyData);
	}
	// 解密
	public static byte[] desDecrypt(byte[] data,byte[] keyData){
	    return des(Cipher.DECRYPT_MODE,data,keyData);
	}		
	//DES算法	
	public static byte[] des(int mode,byte[] data,byte[] keyData)
	{
	    byte[] ret = null;
	    //加密的内容存在并且密钥存在且长度为8个字节
	    if (data != null
	        && data.length>0
	        &&keyData!=null
	        && keyData.length==8) {
	      try {
	        Cipher cipher = Cipher.getInstance("DES");
	        DESKeySpec keySpec = new DESKeySpec(keyData);
	        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
	        SecretKey key = keyFactory.generateSecret(keySpec);
	        cipher.init(mode, key);
	        ret = cipher.doFinal(data);
	      } catch (NoSuchAlgorithmException e) {
	        e.printStackTrace();
	      } catch (NoSuchPaddingException e) {
	        e.printStackTrace();
	      } catch (IllegalBlockSizeException e) {
	        e.printStackTrace();
	      } catch (BadPaddingException e) {
	        e.printStackTrace();
	      } catch (InvalidKeySpecException e) {
	        e.printStackTrace();
	      } catch (InvalidKeyException e) {
	        e.printStackTrace();
	      }
	    }
	    return ret;
	}				
}

3、程序运行结果:
需要加密的字符串:231rg34324234324dgdgdg3
加密后的字节数组:[-74, -76, 35, -87, -47, -94, 13, -24, 37, 8, 122, -113, 24, 79, -20, -92, 23, 101, 66, -69, -66, 10, -44, 66]
从文件中读出来的字节数组:[-74, -76, 35, -87, -47, -94, 13, -24, 37, 8, 122, -113, 24, 79, -20, -92, 23, 101, 66, -69, -66, 10, -44, 66]
解密得到的字节数组转字符串并打印[50, 51, 49, 114, 103, 51, 52, 51, 50, 52, 50, 51, 52, 51, 50, 52, 100, 103, 100, 103, 100, 103, 51]
最终得到的字符串:231rg34324234324dgdgdg3

猜你喜欢

转载自blog.csdn.net/mayifan_blog/article/details/84949200