Java实现加密算法

转自: http://comtu.github.io/blog/2014/12/01/Java_security.html

目录:

Base64
消息摘要算法
  MD
  SHA
  MAC
对称加密算法
  DES
  3DES
  AES
  PBE
非对称加密算法
  DH
  RSA
  ElGamal
数字签名算法
  RSA
  DSA
  ECDSA
其它算法
  IDEA
  CRC

Base64

public static void jdkBase64(String msg) {
    try {
      BASE64Encoder encoder = new BASE64Encoder();
      String encode = encoder.encode(msg.getBytes());
      System.out.println("encode:" + encode);
      
      BASE64Decoder decoder = new BASE64Decoder();
      byte[] b = decoder.decodeBuffer(encode);
      System.out.println("decoder:" + new String(b));
    } catch (Exception e) {
    }
  }

  public static void commonsCodesBase64(String msg) {
    byte[] encodeBytes = org.apache.commons.codec.binary.Base64.encodeBase64(msg.getBytes());
    System.out.println("encode:" + new String(encodeBytes));

    byte[] decodeBytes = org.apache.commons.codec.binary.Base64.decodeBase64(encodeBytes);
    System.out.println("decode:" + new String(decodeBytes));
  }
  
  public static void bouncyCastleBase64(String msg) {
    byte[] encodeBytes = org.bouncycastle.util.encoders.Base64.encode(msg.getBytes());
    System.out.println("encode:" + new String(encodeBytes));
    
    byte[] decodeBytes = org.bouncycastle.util.encoders.Base64.decode(encodeBytes);
    System.out.println("decode:" + new String(decodeBytes));
  }
消息摘要算法 - MD
 算法:
 MD2  实现方:JDK
 MD4  实现方:BouncyCastle 简称BC
 MD5  实现方:JDK
public static void jdkMD2(String msg) {
    try {
      MessageDigest md = MessageDigest.getInstance("MD2");
      byte[] md2Bytes = md.digest(msg.getBytes());
      System.out.println("JDK MD2:" + org.apache.commons.codec.binary.Hex.encodeHexString(md2Bytes));
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public static void jdkMD5(String msg) {
    try {
      MessageDigest md = MessageDigest.getInstance("MD5");
      byte[] md5Bytes = md.digest(msg.getBytes());
      System.out.println("JDK MD5:" + org.apache.commons.codec.binary.Hex.encodeHexString(md5Bytes));
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  // BouncyCastle
  public static void bcMD4(String msg) {
    try {
      Security.addProvider(new BouncyCastleProvider());// 为JDK设置算法
      MessageDigest md = MessageDigest.getInstance("MD4");
      byte[] md4Bytes = md.digest(msg.getBytes());
      System.out.println("JDK MD5:" + org.apache.commons.codec.binary.Hex.encodeHexString(md4Bytes));
    } catch (NoSuchAlgorithmException e) {
      e.printStackTrace();
    }

    Digest digest = new MD4Digest();
    digest.update(msg.getBytes(), 0, msg.getBytes().length);
    byte[] md4Byte = new byte[digest.getDigestSize()];
    digest.doFinal(md4Byte, 0);
    System.out.println("BC MD4: " + org.bouncycastle.util.encoders.Hex.toHexString(md4Byte));
  }

  // BouncyCastle
  public static void bcMD5(String msg) {
    Digest digest = new MD5Digest();
    digest.update(msg.getBytes(), 0, msg.getBytes().length);
    byte[] md5Byte = new byte[digest.getDigestSize()];
    digest.doFinal(md5Byte, 0);
    System.out.println("BC MD5: " + org.bouncycastle.util.encoders.Hex.toHexString(md5Byte));
  }
  
  //commons codec
  public static void ccMD5(String msg){
    System.out.println("CC MD5:"+DigestUtils.md5Hex(msg.getBytes()));
  }
  //commons codec
  public static void ccMD2(String msg){
    System.out.println("CC MD2:"+DigestUtils.md2Hex(msg.getBytes()));
  }

  //-----------------
  public static final String MD5_TYPE_16 = "t_16";
  public static final String MD5_TYPE_32 = "T_32";

  public static String md5s(String plainText, String type) {
    try {
      MessageDigest md = MessageDigest.getInstance("MD5");
      md.update(plainText.getBytes());
      byte b[] = md.digest();

      int i;

      StringBuffer buf = new StringBuffer("");
      for (int offset = 0; offset < b.length; offset++) {
        i = b[offset];
        if (i < 0)
          i += 256;
        if (i < 16)
          buf.append("0");
        buf.append(Integer.toHexString(i));
      }
      String str = buf.toString();

      if (type.equals(MD5_TYPE_16)) {
        str = str.substring(8, 24);
      }

      return str;
    } catch (NoSuchAlgorithmException e) {
      e.printStackTrace();
    }
    return null;
  }
消息摘要算法 - SHA
安全散列算法
固定长度摘要信息
SHA-1  SHA-2(SHA-224,SHA-256,SHA-384,SHA-512)

算法:
SHA-1    实现方:JDK
SHA-224  实现方:BC
SHA-256  实现方:JDK
SHA-384  实现方:JDK
SHA-512  实现方:JDK
public static void jdkSHA1(String msg) {
    try {
      MessageDigest md = MessageDigest.getInstance("SHA");// SHA1
      md.update(msg.getBytes());
      System.out.println("jdk SHA-1:" + Hex.encodeHexString(md.digest()));
    } catch (NoSuchAlgorithmException e) {
      e.printStackTrace();
    }
  }

  public static void bcSHA1(String msg) {
    Digest digest = new SHA1Digest();
    digest.update(msg.getBytes(), 0, msg.getBytes().length);
    byte[] sha1Byte = new byte[digest.getDigestSize()];
    digest.doFinal(sha1Byte, 0);
    System.out.println("bc SHA-1:" + org.bouncycastle.util.encoders.Hex.toHexString(sha1Byte));
  }

  public static void bcSHA224(String msg) {
    Digest digest = new SHA224Digest();
    digest.update(msg.getBytes(), 0, msg.getBytes().length);
    byte[] sha224Byte = new byte[digest.getDigestSize()];
    digest.doFinal(sha224Byte, 0);
    System.out.println("bc SHA-224:" + org.bouncycastle.util.encoders.Hex.toHexString(sha224Byte));
  }

  public static void jdkSHA224_2(String msg) {
    try {
      Security.addProvider(new BouncyCastleProvider());// 设置
      MessageDigest md = MessageDigest.getInstance("SHA224");// SHA224
      md.update(msg.getBytes());
      System.out.println("jdk addProvider ->SHA-224:" + Hex.encodeHexString(md.digest()));
    } catch (NoSuchAlgorithmException e) {
      e.printStackTrace();
    }
  }

  public static void ccSHA1(String msg) {
    System.out.println("cc sha1:" + DigestUtils.sha1Hex(msg.getBytes()));
    System.out.println("cc sha512:" + DigestUtils.sha512Hex((msg.getBytes())));
  }
消息摘要算法 - MAC
 MAC(Message Authentication Code)
 HMAC(keyed-Hash Message Authentication Code),含有密钥的散列函数算法
 任何MD,SHA
  -MD系列:HmacMD2 , HmacMD4 , HmacMD5
  -SHA系列: HmacSHA1, HmacSHA224,HmacSHA256,HmacSHA384,HmacSHA512
  
  算法:
  HmacMD2    实现方:BC
  HmacMD4    实现方:BC
  HmacMD5    实现方:JDK
  HamcSHA1   实现方:JKD
  HmacSHA224 实现方:BC
  HmacSHA256 实现方:JKD
  HmacSHA384 实现方:JKD
  HmacSHA512 实现方:JKD
  
  
  
  其它消息摘要算法
  RipeMD
  Tiger
  Whirlpool
  GOST3411
  
  Bouncy Castle实现
public static void jdkHmacMD5(String msg, String keyParameter) {
    try {
      KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5");
      SecretKey secretKey = keyGenerator.generateKey();// 产生密钥
      byte[] key = secretKey.getEncoded();// 获取密钥

      key = Hex.decodeHex(keyParameter.toCharArray());//

      // 还原密钥
      SecretKey restoreSecretKey = new SecretKeySpec(key, "HmacMD5");
      Mac mac = Mac.getInstance(restoreSecretKey.getAlgorithm());// 实例化MAC
      mac.init(restoreSecretKey);
      byte[] hmacMD5Bytes = mac.doFinal(msg.getBytes());// 执行摘要
      System.out.println("jdk hmacMD5:" + Hex.encodeHexString(hmacMD5Bytes));
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public static void bcHmacMD5(String msg, String keyParameter) {
    HMac hmac = new HMac(new MD5Digest());

    byte[] b = org.bouncycastle.util.encoders.Hex.decode(keyParameter.getBytes());
    KeyParameter k = new KeyParameter(b);
    hmac.init(k);
    hmac.update(msg.getBytes(), 0, msg.getBytes().length);

    byte[] hmacMD5Bytes = new byte[hmac.getMacSize()];
    hmac.doFinal(hmacMD5Bytes, 0);

    System.out.println("bc hmacMD5:" + org.bouncycastle.util.encoders.Hex.toHexString(hmacMD5Bytes));
  }
对称加密算法 - DEC - 3DEC
 初等
 DES
  -3DES
 AES
 PBE
 IDEA
 
 DES(Data Encryptiong Standard) 数据加密标准
 对称加密元老.
 
 密钥长度56  默认56  工作模式:ECB,CBC,PCBC,CTR,CTS,CFB,CFB8,到128,OFB,OFB8128 
 实现方:JDK 填充方式:NoPadding,PKCS5Padding,ISO10126Padding, 
 实现方:BC 填充方式:PKCS7Padding,ISO10126d2Padding,X932Padding,ISO7816d4Pading,ZeroBytePading
 
 3DES(Triple DES或者DESede)
 密钥长度112,168  默认168 
 密钥长度128,192  默认168
public static void jdkDES(String src) {
    try {
      // 生成KEY
      KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
      keyGenerator.init(56);
      SecretKey secretKey = keyGenerator.generateKey();
      byte[] bytesKey = secretKey.getEncoded();

      // KEY转换
      DESKeySpec desKeySpec = new DESKeySpec(bytesKey);
      SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");
      Key convertSecretKey = factory.generateSecret(desKeySpec);

      // 加密
      Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
      cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey);
      byte[] result = cipher.doFinal(src.getBytes());
      System.out.println("jdk des encrypt : " + Hex.encodeHexString(result));

      // 解密
      cipher.init(Cipher.DECRYPT_MODE, convertSecretKey);
      result = cipher.doFinal(result);
      System.out.println("jdk des decrypt : " + new String(result));
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public static void bcDES(String src) {
    try {
      Security.addProvider(new BouncyCastleProvider());

      // 生成KEY
      KeyGenerator keyGenerator = KeyGenerator.getInstance("DES", "BC");
      keyGenerator.getProvider();
      keyGenerator.init(56);
      SecretKey secretKey = keyGenerator.generateKey();
      byte[] bytesKey = secretKey.getEncoded();

      // KEY转换
      DESKeySpec desKeySpec = new DESKeySpec(bytesKey);
      SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");
      Key convertSecretKey = factory.generateSecret(desKeySpec);

      // 加密
      Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
      cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey);
      byte[] result = cipher.doFinal(src.getBytes());
      System.out.println("bc des encrypt : " + Hex.encodeHexString(result));

      // 解密
      cipher.init(Cipher.DECRYPT_MODE, convertSecretKey);
      result = cipher.doFinal(result);
      System.out.println("bc des decrypt : " + new String(result));
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public static void jdk3DES(String src) {
    try {
      // 生成KEY
      KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede");
      // keyGenerator.init(168);
      keyGenerator.init(new SecureRandom());// 默认长度
      SecretKey secretKey = keyGenerator.generateKey();
      byte[] bytesKey = secretKey.getEncoded();

      // KEY转换
      DESKeySpec desKeySpec = new DESKeySpec(bytesKey);
      SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");
      Key convertSecretKey = factory.generateSecret(desKeySpec);

      // 加密
      Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
      cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey);
      byte[] result = cipher.doFinal(src.getBytes());
      System.out.println("jdk 3des encrypt : " + Base64.encodeBase64String(result));

      // 解密
      cipher.init(Cipher.DECRYPT_MODE, convertSecretKey);
      result = cipher.doFinal(result);
      System.out.println("jdk 3des decrypt : " + new String(result));
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
对称加密算法 - AES
 DES替代者
 
 密钥长度:128,192,256 默认128 工作模式:ECB,CBC,PCBC,CTR,CTS,CFB,CFB8到128,OFB,OFB8到128 
 填充方式:NoPadding,PKCS5Padding,ISO10126Padding 实现方:JDK(256位密钥需要获得无政策限制权限文件)
 填充方式:PKCS7Padding,ZeroBytePadding 实现方:BC
 
 无政策限制权限文件是指,因为某些国家的进口管制限制,Java发布的远行环境包中的加解密有一定的限制
public static void jdkAES(String src) {
    try {
      // 生成KEY
      KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
      keyGenerator.init(128);
      SecretKey secretKey = keyGenerator.generateKey();
      byte[] keyBytes = secretKey.getEncoded();

      // key转换
      Key key = new SecretKeySpec(keyBytes, "AES");

      // 加密
      Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
      cipher.init(Cipher.ENCRYPT_MODE, key);
      byte[] result = cipher.doFinal(src.getBytes());
      System.out.println("jdk aes encrypt : " + Base64.encodeBase64String(result));

      // 解密
      cipher.init(Cipher.DECRYPT_MODE, key);
      result = cipher.doFinal(result);
      System.out.println("jdk aes desrypt : " + new String(result));
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
对称加密算法 - PBE
PBE(Password Based Encryption)基于口令加密

算法                         密钥长度    默认  工作模式       填充方式      实现
PBEWithMD5AndDES                64       64      CBC       PKCS5Padding       BC
PBEWithMd5AndRC2                112      128               PKCS7Padding
PBEWithSHA1AndDES               6        64                ISO10126Padding
PBEWithSHAAndIDEA-CBC           128      128
PBEWithSHAAnd2-KeyTripleDES-CBC 128      128
PBEWithSHAAnd3-KeyTripleDES-CBC 192      192
public static void jdkPBE(String src) {
    try {
      // 初始化盐
      SecureRandom random = new SecureRandom();
      byte[] salt = random.generateSeed(8);

      // 口令与密钥
      String password = "password_comtu";
      PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray());
      SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWITHMD5andDES");
      Key key = factory.generateSecret(pbeKeySpec);

      // 加密
      PBEParameterSpec pbeParameterSpec = new PBEParameterSpec(salt, 100);
      Cipher cipher = Cipher.getInstance("PBEWITHMD5andDES");
      cipher.init(Cipher.ENCRYPT_MODE, key, pbeParameterSpec);
      byte[] result = cipher.doFinal(src.getBytes());
      System.out.println("jdk pbe encrypt : " + Base64.encodeBase64String(result));

      // 解密
      cipher.init(Cipher.DECRYPT_MODE, key, pbeParameterSpec);
      result = cipher.doFinal(result);
      System.out.println("jdk pbe decrypt : " + new String(result));
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
非对称加密算法 - DH
高级 
双保险 
公钥,私钥
 
  DH(Diffie-Hellman)密钥交换算法
  RSA-基于因子分解 ElGamal - 基于离散对数 
  ECC(Elliptical Curve Cryptography) - 椭圆曲线加密
 
 
DH 密钥长度: 512~1024(64倍数) 默认1024 实现方:JDK
public static void jdkDH(String src) {
    try {
      // 1.初始化发送方密钥
      KeyPairGenerator senderKeyPairGenerator = KeyPairGenerator.getInstance("DH");
      senderKeyPairGenerator.initialize(512);
      KeyPair senderKeyPair = senderKeyPairGenerator.generateKeyPair();
      byte[] senderPublicKeyEnc = senderKeyPair.getPublic().getEncoded();// 发送方公钥,发送给接收方(网络、文件。。。)

      // 2.初始化接收方密钥
      KeyFactory receiverKeyFactory = KeyFactory.getInstance("DH");
      X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(senderPublicKeyEnc);
      PublicKey receiverPublicKey = receiverKeyFactory.generatePublic(x509EncodedKeySpec);
      DHParameterSpec dhParameterSpec = ((DHPublicKey) receiverPublicKey).getParams();
      KeyPairGenerator receiverKeyPairGenerator = KeyPairGenerator.getInstance("DH");
      receiverKeyPairGenerator.initialize(dhParameterSpec);
      KeyPair receiverKeypair = receiverKeyPairGenerator.generateKeyPair();
      PrivateKey receiverPrivateKey = receiverKeypair.getPrivate();
      byte[] receiverPublicKeyEnc = receiverKeypair.getPublic().getEncoded();

      // 3.密钥构建
      KeyAgreement receiverKeyAgreement = KeyAgreement.getInstance("DH");
      receiverKeyAgreement.init(receiverPrivateKey);
      receiverKeyAgreement.doPhase(receiverPublicKey, true);
      SecretKey receiverDesKey = receiverKeyAgreement.generateSecret("DES");

      KeyFactory senderKeyFactory = KeyFactory.getInstance("DH");
      x509EncodedKeySpec = new X509EncodedKeySpec(receiverPublicKeyEnc);
      PublicKey senderPublicKey = senderKeyFactory.generatePublic(x509EncodedKeySpec);
      KeyAgreement senderKeyAgreement = KeyAgreement.getInstance("DH");
      senderKeyAgreement.init(senderKeyPair.getPrivate());
      senderKeyAgreement.doPhase(senderPublicKey, true);
      SecretKey senderDesKey = senderKeyAgreement.generateSecret("DES");

      // if (com.sun.org.apache.xalan.internal.utils.Objects.equals(receiverDesKey, senderDesKey)) {
      if (receiverDesKey.equals(senderDesKey)) {
        System.out.println("双方密钥相同");
      } else {
        System.out.println("双方密钥不同");
      }

      // 4.加密
      Cipher cipher = Cipher.getInstance("DES");
      cipher.init(Cipher.ENCRYPT_MODE, senderDesKey);
      byte[] result = cipher.doFinal(src.getBytes());
      System.out.println("jdk dh encrypt : " + Base64.encodeBase64String(result));

      // 5.解密
      cipher.init(Cipher.DECRYPT_MODE, receiverDesKey);
      result = cipher.doFinal(result);
      System.out.println("jdk dh decrypt : " + new String(result));
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
非对称加密算法 - 数字签名算法 - RSA
经典算法 
MD,SHA两类

算法:
MD2withRSA       实现方: JDK
MD5withRSA       实现方: JDK
SHA1withRSA      实现方: JDK
SHA224withRSA    实现方: BC
SHA256withRSA    实现方: BC
SHA384withRSA    实现方: BC
SHA512withRSA    实现方: BC
RIPEMD128withRSA 实现方: BC
RIPEMD160withRSA 实现方: BC


非对称加密算法-RSA
唯一广泛接受并实现
数据加密&数字签名
公钥加密,私钥解密
私钥加密,公钥解密

JDK 密钥长度:512~65536(64整数倍) 工作模式:ECB 默认长度:1024 填充方式: 
NoPadding
PKCS1Padding
OAEPWITHMD5AndMGF1Pading
OAEPWITHSHA1AndMGF1Pading
OAEPWITHSHA256AndMGF1Pading
OAEPWITHSHA384AndMGF1Pading
OAEPWITHSHA512AndMGF1Pading

BC 密钥长度:512~65536(64整数倍) 工作模式:NONE 默认长度:2048 填充方式: 
NoPadding
PKCS1Padding
OAEPWITHMD5AndMGF1Pading
OAEPWITHSHA1AndMGF1Pading
OAEPWITHSHA224AndMGF1Pading
OAEPWITHSHA256AndMGF1Pading
OAEPWITHSHA384AndMGF1Pading
OAEPWITHSHA512AndMGF1Pading
ISO9796-1Padding
public static void jdkRSA(String msg) {
    try {
      // 1.初始化密钥
      KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
      keyPairGenerator.initialize(512);
      KeyPair keyPair = keyPairGenerator.generateKeyPair();
      RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
      RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();

      // 2.执行签名
      PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
      KeyFactory keyFactory = KeyFactory.getInstance("RSA");
      PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
      Signature signature = Signature.getInstance("MD5withRSA");
      signature.initSign(privateKey);
      signature.update(msg.getBytes());
      byte[] result = signature.sign();
      System.out.println("jdk rsa sign: " + Hex.encodeHexString(result));

      // 3.验证签名
      X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
      keyFactory = KeyFactory.getInstance("RSA");
      PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
      signature = Signature.getInstance("MD5withRSA");
      signature.initVerify(publicKey);
      signature.update(msg.getBytes());
      boolean bool = signature.verify(result);
      System.out.println("jdk rea verify:" + bool);
    } catch (Exception e) {
    }
  }

  public static void jdkRSA2(String src) {
    try {
      // 1.初始化密钥
      KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
      keyPairGenerator.initialize(512);
      KeyPair keyPair = keyPairGenerator.generateKeyPair();
      RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
      RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
      System.out.println("Public Key : " + Base64.encodeBase64String(rsaPublicKey.getEncoded()));
      System.out.println("Private Key : " + Base64.encodeBase64String(rsaPrivateKey.getEncoded()));

      // 2.私钥加密、公钥解密——加密
      PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
      KeyFactory keyFactory = KeyFactory.getInstance("RSA");
      PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
      Cipher cipher = Cipher.getInstance("RSA");
      cipher.init(Cipher.ENCRYPT_MODE, privateKey);
      byte[] result = cipher.doFinal(src.getBytes());
      System.out.println("私钥加密、公钥解密——加密 : " + Base64.encodeBase64String(result));

      // 3.私钥加密、公钥解密——解密
      X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
      keyFactory = KeyFactory.getInstance("RSA");
      PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
      cipher = Cipher.getInstance("RSA");
      cipher.init(Cipher.DECRYPT_MODE, publicKey);
      result = cipher.doFinal(result);
      System.out.println("私钥加密、公钥解密——解密:" + new String(result));

      // 4.公钥加密、私钥解密——加密
      x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
      keyFactory = KeyFactory.getInstance("RSA");
      publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
      cipher = Cipher.getInstance("RSA");
      cipher.init(Cipher.ENCRYPT_MODE, publicKey);
      result = cipher.doFinal(src.getBytes());
      System.out.println("公钥加密、私钥解密——加密 : " + Base64.encodeBase64String(result));

      // 5.公钥加密、私钥解密——解密
      pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
      keyFactory = KeyFactory.getInstance("RSA");
      privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
      cipher = Cipher.getInstance("RSA");
      cipher.init(Cipher.DECRYPT_MODE, privateKey);
      result = cipher.doFinal(result);
      System.out.println("公钥加密、私钥解密——解密:" + new String(result));
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
非对称加密算法 - ElGamal
  公钥加密算法
 实现方:BC 密钥长度:160~16384(8的整数倍) , 默认:1024 工作模式:ECB,NONE
 填充方式:
 NoPadding , PKCS1Padding
 OAEPWITHMD5AndMGF1Pading
 OAEPWITSHA1AndMGF1Pading
 OAEPWITSHA224AndMGF1Pading
 OAEPWITSHA256AndMGF1Pading
 OAEPWITSHA384AndMGF1Pading
 OAEPWITSHA512AndMGF1Pading
 ISO9796-1Padding
public static void bcElGamal(String src) {
    try {
      // 公钥加密,私钥解密
      Security.addProvider(new BouncyCastleProvider());

      // 1.初始化密钥
      AlgorithmParameterGenerator algorithmParameterGenerator = AlgorithmParameterGenerator.getInstance("ElGamal");
      algorithmParameterGenerator.init(256);
      AlgorithmParameters algorithmParameters = algorithmParameterGenerator.generateParameters();

      DHParameterSpec dhParameterSpec =  (DHParameterSpec) algorithmParameters.getParameterSpec(DHParameterSpec.class);
      KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("ElGamal");
      keyPairGenerator.initialize(dhParameterSpec, new SecureRandom());
      KeyPair keyPair = keyPairGenerator.generateKeyPair();
      PublicKey elGamalPublicKey = keyPair.getPublic();
      PrivateKey elGamalPrivateKey = keyPair.getPrivate();

      System.out.println("Public Key:" + org.apache.commons.codec.binary.Base64.encodeBase64String(elGamalPublicKey.getEncoded()));
      System.out.println("Private Key:" + org.apache.commons.codec.binary.Base64.encodeBase64String(elGamalPrivateKey.getEncoded()));

    } catch (Exception e) {
      e.printStackTrace();
    }

  }
数字签名算法 - DSA
  DSS (Digital Signature Standard)数字签名标准
  DSA(Digital Signature Algorithm)数字签名算法
  DSA仅包含数字签名
  
  算法:
  SHA1withDSA    实现方:JDK
  SHA224withDSA  实现方:BC
  SHA256withDSA  实现方:BC
  SHA384withDSA  实现方:BC
  SHA512withDSA  实现方:BC
public static void jdkDSA(String src) {
    try {
      // 1.初始化密钥
      KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("DSA");
      keyPairGenerator.initialize(512);
      KeyPair keyPair = keyPairGenerator.generateKeyPair();
      DSAPublicKey dsaPublicKey = (DSAPublicKey) keyPair.getPublic();
      DSAPrivateKey dsaPrivateKey = (DSAPrivateKey) keyPair.getPrivate();

      // 2.执行签名
      PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(dsaPrivateKey.getEncoded());
      KeyFactory keyFactory = KeyFactory.getInstance("DSA");
      PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
      Signature signature = Signature.getInstance("SHA1withDSA");
      signature.initSign(privateKey);
      signature.update(src.getBytes());
      byte[] result = signature.sign();
      System.out.println("jdk dsa sign : " + Hex.encodeHexString(result));

      // 3.验证签名
      X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(dsaPublicKey.getEncoded());
      keyFactory = KeyFactory.getInstance("DSA");
      PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
      signature = Signature.getInstance("SHA1withDSA");
      signature.initVerify(publicKey);
      signature.update(src.getBytes());
      boolean bool = signature.verify(result);
      System.out.println("jdk dsa verify : " + bool);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
数字签名算法 - ECDSA
 微软
 Elliptic Curve Digital Signature Algorithm , 椭圆曲线数字签名算法
 速度快,强度高,签名短.
 
 算法:
 NNONEwithECDSA       实现方:JDK/BC  签名长度:128 
 RIPEMD160withECDSA   实现方:BC      签名长度:160
 SHA1withECDSA        实现方:JDK/BC  签名长度:160
 SHA224withECDSA      实现方:BC      签名长度:224
 SHA256withECDSA      实现方:JDK/BC  签名长度:256
 SHA384withECDSA      实现方:JDK/BC  签名长度:384
 SHA512withECDSA      实现方:JDK/BC  签名长度:512
 
jdk版本1.7以上
public static void jdkECDSA(String src) {
    try {
      //1.初始化密钥
      KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC");
      keyPairGenerator.initialize(256);
      KeyPair keyPair = keyPairGenerator.generateKeyPair();
      ECPublicKey ecPublicKey = (ECPublicKey)keyPair.getPublic();
      ECPrivateKey ecPrivateKey = (ECPrivateKey)keyPair.getPrivate();
      
      //2.执行签名
      PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(ecPrivateKey.getEncoded());
      KeyFactory keyFactory = KeyFactory.getInstance("EC");
      PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
      Signature signature = Signature.getInstance("SHA1withECDSA");
      signature.initSign(privateKey);
      signature.update(src.getBytes());
      byte[] result = signature.sign();
      System.out.println("jdk ecdsa sign : " + Hex.encodeHexString(result));
      
      //3.验证签名
      X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(ecPublicKey.getEncoded());
      keyFactory = KeyFactory.getInstance("EC");
      PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
      signature = Signature.getInstance("SHA1withECDSA");
      signature.initVerify(publicKey);
      signature.update(src.getBytes());
      boolean bool = signature.verify(result);
      System.out.println("jdk ecdsa verify : " + bool);
    } catch (Exception e) {
      e.printStackTrace();
    }
    
  }
IDEA
这种算法是在DES算法的基础上发展出来的,类似于三重DES。
发展IDEA也是因为感到DES具有密钥太短等缺点。IDEA的密钥为128位,这么长的密钥在今后若干年内应该是安全的。
public static void bcIDEA(String src) {
    try {
      Security.addProvider(new BouncyCastleProvider());
      
      //生成key
      KeyGenerator keyGenerator = KeyGenerator.getInstance("IDEA");
      keyGenerator.init(128);
      SecretKey secretKey = keyGenerator.generateKey();
      byte[] keyBytes = secretKey.getEncoded();
      
      //转换密钥
      Key key = new SecretKeySpec(keyBytes, "IDEA");
      
      //加密
      Cipher cipher = Cipher.getInstance("IDEA/ECB/ISO10126Padding");
      cipher.init(Cipher.ENCRYPT_MODE, key);
      byte[] result = cipher.doFinal(src.getBytes());
      System.out.println("bc idea encrypt : " + Base64.encodeBase64String(result));
      
      //解密
      cipher.init(Cipher.DECRYPT_MODE, key);
      result = cipher.doFinal(result);
      System.out.println("bc idea decrypt : " + new String(result));
    } catch (Exception e) {
      e.printStackTrace();
    }
    
  }
CRC
public static void jdkCrc(String src){
    CRC32 crc = new CRC32();
    crc.update(src.getBytes());
    String hex = Long.toHexString(crc.getValue());
    System.out.println("jdk crc32 : " + hex);
  }
运行
public static void main(String[] args) {
    
    //AES
    jdkAES("comtu");

    //Base64
    jdkBase64("comtu");
    commonsCodesBase64("comtu");
    bouncyCastleBase64("comtu");

    //DES
    jdkDES("comtu");
    bcDES("comtu");
    jdk3DES("comtu");

    //DH
    jdkDH("comtu");

    //DSA
    jdkDSA("comtu");

    //ECDSA
    jdkECDSA("comtu");

    //ElGamal
    bcElGamal("comtu");
    
    //HMAC
    jdkHmacMD5("comtu", "1234567890abcdef");
    bcHmacMD5("comtu", "1234567890abcdef");

    //IDEA
    bcIDEA("comtu");

    //md
    System.out.println("MD5_TYPE_16:" + Md.md5s("comtu", MD5_TYPE_16));
    System.out.println("MD5_TYPE_32:" + Md.md5s("comtu", MD5_TYPE_32));
    jdkMD2("comtu");
    jdkMD5("comtu");
    bcMD4("comtu");
    bcMD5("comtu");
    ccMD2("comtu");
    ccMD5("comtu");

    //PBE
    jdkPBE("comtu");

    //RSA
    jdkRSA("comtu");
    jdkRSA2("comtu");

  
    //SHA
    jdkSHA1("comtu");
    bcSHA1("comtu");
    bcSHA224("comtu");
    jdkSHA224_2("comtu");
    ccSHA1("comtu");
  }

案例引用如下三个jar包:

bcprov-ext-jdk15on-149.jar
bcprov-jdk15on-149.jar
commons-codec-1.10.jar

代码引用包详情见原代码:

本文Demo源代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值