首页
JAVA笔记
数据库笔记
混乱记忆
小站记
您现在的位置
java加密解密
简介: 加密,大体上分为双向加密和单向加密,而双向加密又分为对称加密和非对称加密。 双向加密大体意思就是明文加密后形成密文,可以通过算法还原成明文。对称加密是加密用的指密钥还可以用来解密。而单向加密只是对信息进行了摘要计算,不能通过算法生成明文,单向加密从严格意思上说不能算是加密的一种,应该算是摘要算法吧。

对称加密代码示例:

import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.Security;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;

public class Demo{
 
 //KeyGenerator 提供对称密钥生成器的功能,支持各种算法
 private KeyGenerator keygen;
 //SecretKey 负责保存对称密钥
 private SecretKey deskey;
 //Cipher负责完成加密或解密工作
 private Cipher c;
 //该字节数组负责保存加密的结果
 private byte[] cipherByte;
 
 public Demo() throws NoSuchAlgorithmException, NoSuchPaddingException{
  Security.addProvider(new com.sun.crypto.provider.SunJCE());
  //实例化支持DES算法的密钥生成器(算法名称命名需按规定,否则抛出异常)
  keygen = KeyGenerator.getInstance("DES");
  //生成密钥
  deskey = keygen.generateKey();
  //生成Cipher对象,指定其支持的DES算法
  c = Cipher.getInstance("DES");
 }
 
 /**
  * 对字符串加密
  *
  * @param str
  * @return
  * @throws InvalidKeyException
  * @throws IllegalBlockSizeException
  * @throws BadPaddingException
  */
 public byte[] Encrytor(String str) throws InvalidKeyException,
   IllegalBlockSizeException, BadPaddingException {
  // 根据密钥,对Cipher对象进行初始化,ENCRYPT_MODE表示加密模式
  c.init(Cipher.ENCRYPT_MODE, deskey);
  byte[] src = str.getBytes();
  // 加密,结果保存进cipherByte
  cipherByte = c.doFinal(src);
  return cipherByte;
 }

 /**
  * 对字符串解密
  *
  * @param buff
  * @return
  * @throws InvalidKeyException
  * @throws IllegalBlockSizeException
  * @throws BadPaddingException
  */
 public byte[] Decryptor(byte[] buff) throws InvalidKeyException,
   IllegalBlockSizeException, BadPaddingException {
  // 根据密钥,对Cipher对象进行初始化,DECRYPT_MODE表示解密模式
  c.init(Cipher.DECRYPT_MODE, deskey);
  cipherByte = c.doFinal(buff);
  return cipherByte;
 }

 /**
  * @param args
  * @throws NoSuchPaddingException
  * @throws NoSuchAlgorithmException
  * @throws BadPaddingException
  * @throws IllegalBlockSizeException
  * @throws InvalidKeyException
  */
 public static void main(String[] args) throws Exception {
  EncrypDES de1 = new EncrypDES();
  String msg ="对小云朵进行加密解密";
  byte[] encontent = de1.Encrytor(msg);
  byte[] decontent = de1.Decryptor(encontent);
  System.out.println("明文是:" + msg);
  System.out.println("加密后:" + new String(encontent));
  System.out.println("解密后:" + new String(decontent));
 }

}

 

 

非对称加密代码示例:

import java.security.InvalidKeyException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;

public class EncrypRSA {
 
 /**
  * 加密
  * @param publicKey
  * @param srcBytes
  * @return
  * @throws NoSuchAlgorithmException
  * @throws NoSuchPaddingException
  * @throws InvalidKeyException
  * @throws IllegalBlockSizeException
  * @throws BadPaddingException
  */
 protected byte[] encrypt(RSAPublicKey publicKey,byte[] srcBytes) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException,

IllegalBlockSizeException, BadPaddingException{
  if(publicKey!=null){
   //Cipher负责完成加密或解密工作,基于RSA
   Cipher cipher = Cipher.getInstance("RSA");
   //根据公钥,对Cipher对象进行初始化
   cipher.init(Cipher.ENCRYPT_MODE, publicKey);
   byte[] resultBytes = cipher.doFinal(srcBytes);
   return resultBytes;
  }
  return null;
 }
 
 /**
  * 解密
  * @param privateKey
  * @param srcBytes
  * @return
  * @throws NoSuchAlgorithmException
  * @throws NoSuchPaddingException
  * @throws InvalidKeyException
  * @throws IllegalBlockSizeException
  * @throws BadPaddingException
  */
 protected byte[] decrypt(RSAPrivateKey privateKey,byte[] srcBytes) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException,

IllegalBlockSizeException, BadPaddingException{
  if(privateKey!=null){
   //Cipher负责完成加密或解密工作,基于RSA
   Cipher cipher = Cipher.getInstance("RSA");
   //根据公钥,对Cipher对象进行初始化
   cipher.init(Cipher.DECRYPT_MODE, privateKey);
   byte[] resultBytes = cipher.doFinal(srcBytes);
   return resultBytes;
  }
  return null;
 }

 /**
  * @param args
  * @throws NoSuchAlgorithmException
  * @throws BadPaddingException
  * @throws IllegalBlockSizeException
  * @throws NoSuchPaddingException
  * @throws InvalidKeyException
  */
 public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException, NoSuchPaddingException, IllegalBlockSizeException,

BadPaddingException {
  EncrypRSA rsa = new EncrypRSA();
  String msg = "郭XX-精品相声";
  //KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象
  KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
  //初始化密钥对生成器,密钥大小为1024位
  keyPairGen.initialize(1024);
  //生成一个密钥对,保存在keyPair中
  KeyPair keyPair = keyPairGen.generateKeyPair();
  //得到私钥
  RSAPrivateKey privateKey = (RSAPrivateKey)keyPair.getPrivate();    
  //得到公钥
  RSAPublicKey publicKey = (RSAPublicKey)keyPair.getPublic();
  
  //用公钥加密
  byte[] srcBytes = msg.getBytes();
  byte[] resultBytes = rsa.encrypt(publicKey, srcBytes);
  
  //用私钥解密
  byte[] decBytes = rsa.decrypt(privateKey, resultBytes);
  
  System.out.println("明文是:" + msg);
  System.out.println("加密后是:" + new String(resultBytes));
  System.out.println("解密后是:" + new String(decBytes));
 }

}