一。消息摘要算法

常用摘要算法:

以下 (HEX)内容:bc指Bouncy Castle  |  cc指:Apache commons Codec

1。消息摘要算法MD5及MD族(MD2,MD4)

消息摘要算法应用:

MD算法实现:

  1. package com.imooc.security.md;
  2.  
  3. import java.security.MessageDigest;
  4. import java.security.NoSuchAlgorithmException;
  5. import java.security.Security;
  6.  
  7. import org.apache.commons.codec.binary.Hex;
  8. import org.apache.commons.codec.digest.DigestUtils;
  9. import org.bouncycastle.crypto.Digest;
  10. import org.bouncycastle.crypto.digests.MD5Digest;
  11. import org.bouncycastle.jce.provider.BouncyCastleProvider;
  12.  
  13. public class ImoocMD {
  14.  
  15. private static String src = "imooc security md";
  16.  
  17. public static void main(String[] args) {
  18. jdkMD5();
  19. jdkMD2();
  20. bcMD4();
  21. bcMD5();
  22. ccMD5();
  23. ccMD2();
  24. }
  25.  
  26. public static void jdkMD5() {
  27. try {
  28. MessageDigest md = MessageDigest.getInstance("MD5");
  29. byte[] md5Bytes = md.digest(src.getBytes());
  30. System.out.println("JDK MD5 : " + Hex.encodeHexString(md5Bytes));
  31. } catch (NoSuchAlgorithmException e) {
  32. e.printStackTrace();
  33. }
  34. }
  35.  
  36. public static void jdkMD2() {
  37. try {
  38. MessageDigest md = MessageDigest.getInstance("MD2");
  39. byte[] md2Bytes = md.digest(src.getBytes());
  40. System.out.println("JDK MD2 : " + Hex.encodeHexString(md2Bytes));
  41. } catch (NoSuchAlgorithmException e) {
  42. e.printStackTrace();
  43. }
  44. }
  45.  
  46. public static void bcMD5() {
  47. Digest digest = new MD5Digest();
  48. digest.update(src.getBytes(), , src.getBytes().length);
  49. byte[] md5Bytes = new byte[digest.getDigestSize()];
  50. digest.doFinal(md5Bytes, );
  51. System.out.println("BC MD5 : " + org.bouncycastle.util.encoders.Hex.toHexString(md5Bytes));
  52. }
  53.  
  54. public static void bcMD4() {
  55. try {
  56. Security.addProvider(new BouncyCastleProvider());
  57. MessageDigest md = MessageDigest.getInstance("MD4");
  58. byte[] md5Bytes = md.digest(src.getBytes());
  59. System.out.println("BC MD4 : " + Hex.encodeHexString(md5Bytes));
  60. } catch (NoSuchAlgorithmException e) {
  61. e.printStackTrace();
  62. }
  63. }
  64.  
  65. public static void ccMD5() {
  66. System.out.println("CC MD5 : " + DigestUtils.md5Hex(src.getBytes()));
  67. }
  68.  
  69. public static void ccMD2() {
  70. System.out.println("CC MD2 : " + DigestUtils.md2Hex(src.getBytes()));
  71. }
  72.  
  73. }

2。消息摘要算法SHA(安全散列算法)

SHA算法实现:

  1. package com.imooc.security.sha;
  2.  
  3. import java.security.MessageDigest;
  4. import java.security.NoSuchAlgorithmException;
  5. import java.security.Security;
  6.  
  7. import org.apache.commons.codec.binary.Hex;
  8. import org.apache.commons.codec.digest.DigestUtils;
  9. import org.bouncycastle.crypto.Digest;
  10. import org.bouncycastle.crypto.digests.SHA1Digest;
  11. import org.bouncycastle.crypto.digests.SHA224Digest;
  12. import org.bouncycastle.jce.provider.BouncyCastleProvider;
  13.  
  14. public class ImoocSHA {
  15.  
  16. private static String src = "imooc security sha";
  17.  
  18. public static void main(String[] args) {
  19. jdkSHA1();
  20. bcSHA1();
  21. bcSHA224();
  22. ccSHA1();
  23. }
  24.  
  25. public static void jdkSHA1() {
  26. try {
  27. MessageDigest md = MessageDigest.getInstance("SHA");
  28. md.update(src.getBytes());
  29. System.out.println("jdk sha-1 : " + Hex.encodeHexString(md.digest()));
  30. } catch (NoSuchAlgorithmException e) {
  31. e.printStackTrace();
  32. }
  33. }
  34.  
  35. public static void bcSHA1() {
  36. Digest digest = new SHA1Digest();
  37. digest.update(src.getBytes(), , src.getBytes().length);
  38. byte[] sha1Bytes = new byte[digest.getDigestSize()];
  39. digest.doFinal(sha1Bytes, );
  40. System.out.println("bc sha-1 : " + org.bouncycastle.util.encoders.Hex.toHexString(sha1Bytes));
  41. }
  42.  
  43. public static void bcSHA224() {
  44. Digest digest = new SHA224Digest();
  45. digest.update(src.getBytes(), , src.getBytes().length);
  46. byte[] sha224Bytes = new byte[digest.getDigestSize()];
  47. digest.doFinal(sha224Bytes, );
  48. System.out.println("bc sha-224 : " + org.bouncycastle.util.encoders.Hex.toHexString(sha224Bytes));
  49. }
  50.  
  51. public static void bcSHA224_2() {
  52. Security.addProvider(new BouncyCastleProvider());
  53. //...练习内容,^_^
  54. }
  55.  
  56. public static void ccSHA1() {
  57. System.out.println("cc sha1 - 1 :" + DigestUtils.sha1Hex(src.getBytes()));
  58. System.out.println("cc sha1 - 2 :" + DigestUtils.sha1Hex(src));
  59. }
  60.  
  61. //384、256、512。。。。。。
  62.  
  63. }

SHA算法应用

3。消息摘要算法--MAC

HMAC算法实现:

  1. package com.imooc.security.hmac;
  2.  
  3. import javax.crypto.KeyGenerator;
  4. import javax.crypto.Mac;
  5. import javax.crypto.SecretKey;
  6. import javax.crypto.spec.SecretKeySpec;
  7.  
  8. import org.apache.commons.codec.binary.Hex;
  9. import org.bouncycastle.crypto.digests.MD5Digest;
  10. import org.bouncycastle.crypto.macs.HMac;
  11. import org.bouncycastle.crypto.params.KeyParameter;
  12.  
  13. public class ImoocHmac {
  14.  
  15. private static String src = "imooc security hmac";
  16.  
  17. public static void main(String[] args) {
  18. jdkHmacMD5();
  19. bcHmacMD5();
  20. }
  21.  
  22. public static void jdkHmacMD5() {
  23. try {
  24. KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5");//初始化KeyGenerator
  25. SecretKey secretKey = keyGenerator.generateKey();//产生密钥
  26. // byte[] key = secretKey.getEncoded();//获得密钥
  27. byte[] key = Hex.decodeHex(new char[] {'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'});
  28.  
  29. SecretKey restoreSecretKey = new SecretKeySpec(key, "HmacMD5");//还原密钥
  30. Mac mac = Mac.getInstance(restoreSecretKey.getAlgorithm());//实例化MAC
  31. mac.init(restoreSecretKey);//初始化Mac
  32. byte[] hmacMD5Bytes = mac.doFinal(src.getBytes());//执行摘要
  33. System.out.println("jdk hmacMD5 : " + Hex.encodeHexString(hmacMD5Bytes));
  34. } catch (Exception e) {
  35. e.printStackTrace();
  36. }
  37. }
  38.  
  39. public static void bcHmacMD5() {
  40. HMac hmac = new HMac(new MD5Digest());
  41. hmac.init(new KeyParameter(org.bouncycastle.util.encoders.Hex.decode("aaaaaaaaaa")));
  42. hmac.update(src.getBytes(), , src.getBytes().length);
  43.  
  44. byte[] hmacMD5Bytes = new byte[hmac.getMacSize()];//执行摘要
  45. hmac.doFinal(hmacMD5Bytes, );
  46.  
  47. System.out.println("bc hmacMD5 : " + org.bouncycastle.util.encoders.Hex.toHexString(hmacMD5Bytes));
  48.  
  49. }
  50.  
  51. }

HMAC算法应用:

二。数字签名

数字签名算法--RSA(经典)

RSA是数字签名的经典算法,包括:MD/SHA两类。

数字签名算法实现--RSA

  1. package com.imooc.security.rsa2;
  2.  
  3. import java.security.KeyFactory;
  4. import java.security.KeyPair;
  5. import java.security.KeyPairGenerator;
  6. import java.security.PrivateKey;
  7. import java.security.PublicKey;
  8. import java.security.Signature;
  9. import java.security.interfaces.RSAPrivateKey;
  10. import java.security.interfaces.RSAPublicKey;
  11. import java.security.spec.PKCS8EncodedKeySpec;
  12. import java.security.spec.X509EncodedKeySpec;
  13.  
  14. import org.apache.commons.codec.binary.Hex;
  15.  
  16. public class ImoocRSA {
  17.  
  18. private static String src = "imooc security rsa";
  19.  
  20. public static void main(String[] args) {
  21. jdkRSA();
  22. }
  23.  
  24. public static void jdkRSA() {
  25. try {
  26. //1.初始化密钥
  27. KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
  28. keyPairGenerator.initialize();
  29. KeyPair keyPair = keyPairGenerator.generateKeyPair();
  30. RSAPublicKey rsaPublicKey = (RSAPublicKey)keyPair.getPublic();
  31. RSAPrivateKey rsaPrivateKey = (RSAPrivateKey)keyPair.getPrivate();
  32.  
  33. //2.执行签名
  34. PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
  35. KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  36. PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
  37. Signature signature = Signature.getInstance("MD5withRSA");
  38. signature.initSign(privateKey);
  39. signature.update(src.getBytes());
  40. byte[] result = signature.sign();
  41. System.out.println("jdk rsa sign : " + Hex.encodeHexString(result));
  42.  
  43. //3.验证签名
  44. X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
  45. keyFactory = KeyFactory.getInstance("RSA");
  46. PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
  47. signature = Signature.getInstance("MD5withRSA");
  48. signature.initVerify(publicKey);
  49. signature.update(src.getBytes());
  50. boolean bool = signature.verify(result);
  51. System.out.println("jdk rsa verify : " + bool);
  52. } catch (Exception e) {
  53. e.printStackTrace();
  54. }
  55. }
  56.  
  57. }

数字签名算法RSA应用:

数字签名算法实现--DSA

  1. DSARSA区别:
  2.  
  3. DSA仅包含数字签名,使用DSA这种算法的证书无法进行加密通信。
  4.  
  5. RSA算法既包括加解密,同时也有数字签名算法。

DSA算法实现:

  1. package com.imooc.security.dsa;
  2.  
  3. import java.security.KeyFactory;
  4. import java.security.KeyPair;
  5. import java.security.KeyPairGenerator;
  6. import java.security.PrivateKey;
  7. import java.security.PublicKey;
  8. import java.security.Signature;
  9. import java.security.interfaces.DSAPrivateKey;
  10. import java.security.interfaces.DSAPublicKey;
  11. import java.security.spec.PKCS8EncodedKeySpec;
  12. import java.security.spec.X509EncodedKeySpec;
  13.  
  14. import org.apache.commons.codec.binary.Hex;
  15.  
  16. public class ImoocDSA {
  17.  
  18. private static String src = "imooc security dsa";
  19.  
  20. public static void main(String[] args) {
  21. jdkDSA();
  22. }
  23.  
  24. public static void jdkDSA() {
  25. try {
  26. //1.初始化密钥
  27. KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("DSA");
  28. keyPairGenerator.initialize();
  29. KeyPair keyPair = keyPairGenerator.generateKeyPair();
  30. DSAPublicKey dsaPublicKey = (DSAPublicKey) keyPair.getPublic();
  31. DSAPrivateKey dsaPrivateKey = (DSAPrivateKey)keyPair.getPrivate();
  32.  
  33. //2.执行签名
  34. PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(dsaPrivateKey.getEncoded());
  35. KeyFactory keyFactory = KeyFactory.getInstance("DSA");
  36. PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
  37. Signature signature = Signature.getInstance("SHA1withDSA");
  38. signature.initSign(privateKey);
  39. signature.update(src.getBytes());
  40. byte[] result = signature.sign();
  41. System.out.println("jdk dsa sign : " + Hex.encodeHexString(result));
  42.  
  43. //3.验证签名
  44. X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(dsaPublicKey.getEncoded());
  45. keyFactory = KeyFactory.getInstance("DSA");
  46. PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
  47. signature = Signature.getInstance("SHA1withDSA");
  48. signature.initVerify(publicKey);
  49. signature.update(src.getBytes());
  50. boolean bool = signature.verify(result);
  51. System.out.println("jdk dsa verify : " + bool);
  52. } catch (Exception e) {
  53. e.printStackTrace();
  54. }
  55. }
  56.  
  57. }

DSA应用:

数字签名算法实现--ECDSA

  1. package com.imooc.security.ecdsa;
  2.  
  3. import java.security.KeyFactory;
  4. import java.security.KeyPair;
  5. import java.security.KeyPairGenerator;
  6. import java.security.NoSuchAlgorithmException;
  7. import java.security.PrivateKey;
  8. import java.security.PublicKey;
  9. import java.security.Signature;
  10. import java.security.interfaces.ECPrivateKey;
  11. import java.security.interfaces.ECPublicKey;
  12. import java.security.spec.PKCS8EncodedKeySpec;
  13. import java.security.spec.X509EncodedKeySpec;
  14.  
  15. import org.apache.commons.codec.binary.Hex;
  16.  
  17. public class ImoocECDSA {
  18.  
  19. private static String src = "imooc security ecdsa";
  20.  
  21. public static void main(String[] args) {
  22. jdkECDSA();
  23. }
  24.  
  25. public static void jdkECDSA() {
  26. try {
  27. //1.初始化密钥
  28. KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC");
  29. keyPairGenerator.initialize();
  30. KeyPair keyPair = keyPairGenerator.generateKeyPair();
  31. ECPublicKey ecPublicKey = (ECPublicKey)keyPair.getPublic();
  32. ECPrivateKey ecPrivateKey = (ECPrivateKey)keyPair.getPrivate();
  33.  
  34. //2.执行签名
  35. PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(ecPrivateKey.getEncoded());
  36. KeyFactory keyFactory = KeyFactory.getInstance("EC");
  37. PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
  38. Signature signature = Signature.getInstance("SHA1withECDSA");
  39. signature.initSign(privateKey);
  40. signature.update(src.getBytes());
  41. byte[] result = signature.sign();
  42. System.out.println("jdk ecdsa sign : " + Hex.encodeHexString(result));
  43.  
  44. //3.验证签名
  45. X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(ecPublicKey.getEncoded());
  46. keyFactory = KeyFactory.getInstance("EC");
  47. PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
  48. signature = Signature.getInstance("SHA1withECDSA");
  49. signature.initVerify(publicKey);
  50. signature.update(src.getBytes());
  51. boolean bool = signature.verify(result);
  52. System.out.println("jdk ecdsa verify : " + bool);
  53. } catch (Exception e) {
  54. e.printStackTrace();
  55. }
  56.  
  57. }
  58.  
  59. }

ECDSA应用:

三。BASE64加密算法

加解密基础与base64算法

1。密码常用术语

注:md5只能加密,不能解密.

2。加解密基础

【1】密码分类

【2】散列函数(单向函数):用来验证数据完整性(而不是用来加解密)

散列函数据相关算法:

【3】数字签名:

【4】OSI与TCP/IP安全体系

【5】Java安全组成、包及第三方扩展

(1)JCA:提供基本的加密框架,如消息摘要、数字签名等。

(2)JCE:JCA基础上扩展,提供加密算法、消息摘要、密钥管理功能。(JDK包中)

(3)JSSE:保证在网络传输的数据定全

(4)JAAS:基于Java平台基于身份验证功能(系统安全/权限)

Java安装目录/security/java.security文件

3。实现base64算法

  1. package com.imooc.security.base64;
  2.  
  3. import java.io.IOException;
  4.  
  5. import org.apache.commons.codec.binary.Base64;
  6.  
  7. import sun.misc.BASE64Decoder;
  8. import sun.misc.BASE64Encoder;
  9.  
  10. public class ImoocBase64 {
  11.  
  12. private static String src = "imooc security base64";
  13.  
  14. public static void main(String[] args) {
  15. jdkBase64();
  16. commonsCodesBase64();
  17. bouncyCastleBase64();
  18. }
  19.  
  20. public static void jdkBase64() {
  21. try {
  22. BASE64Encoder encoder = new BASE64Encoder();
  23. String encode = encoder.encode(src.getBytes());
  24. System.out.println("encode : " + encode);
  25.  
  26. BASE64Decoder decoder = new BASE64Decoder();
  27. System.out.println("decode : " + new String(decoder.decodeBuffer(encode)));
  28. } catch (IOException e) {
  29. e.printStackTrace();
  30. }
  31. }
  32.  
  33. public static void commonsCodesBase64() {
  34. byte[] encodeBytes = Base64.encodeBase64(src.getBytes());
  35. System.out.println("encode : " + new String(encodeBytes));
  36.  
  37. byte[] decodeBytes = Base64.decodeBase64(encodeBytes);
  38. System.out.println("decode : " + new String(decodeBytes));
  39. }
  40.  
  41. public static void bouncyCastleBase64() {
  42. byte[] encodeBytes = org.bouncycastle.util.encoders.Base64.encode(src.getBytes());
  43. System.out.println("encode : " + new String(encodeBytes));
  44.  
  45. byte[] decodeBytes = org.bouncycastle.util.encoders.Base64.decode(encodeBytes);
  46. System.out.println("decode : " + new String(decodeBytes));
  47. }
  48.  
  49. }

注:Base64Encoder不建议使用。

Base64算法应用场景

四。对称加密算法

1.Java对称加密算法--DES

  1. package com.imooc.security.des;
  2.  
  3. import java.security.Key;
  4. import java.security.Security;
  5.  
  6. import javax.crypto.Cipher;
  7. import javax.crypto.KeyGenerator;
  8. import javax.crypto.SecretKey;
  9. import javax.crypto.SecretKeyFactory;
  10. import javax.crypto.spec.DESKeySpec;
  11.  
  12. import org.apache.commons.codec.binary.Hex;
  13. import org.bouncycastle.jce.provider.BouncyCastleProvider;
  14.  
  15. public class ImoocDES {
  16.  
  17. private static String src = "imooc security des";
  18.  
  19. public static void main(String[] args) {
  20. jdkDES();
  21. bcDES();
  22. }
  23.  
  24. public static void jdkDES() {
  25. try {
  26. //生成KEY
  27. KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
  28. keyGenerator.init();
  29. SecretKey secretKey = keyGenerator.generateKey();
  30. byte[] bytesKey = secretKey.getEncoded();
  31.  
  32. //KEY转换
  33. DESKeySpec desKeySpec = new DESKeySpec(bytesKey);
  34. SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");
  35. Key convertSecretKey = factory.generateSecret(desKeySpec);
  36.  
  37. //加密
  38. Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
  39. cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey);
  40. byte[] result = cipher.doFinal(src.getBytes());
  41. System.out.println("jdk des encrypt : " + Hex.encodeHexString(result));
  42.  
  43. //解密
  44. cipher.init(Cipher.DECRYPT_MODE, convertSecretKey);
  45. result = cipher.doFinal(result);
  46. System.out.println("jdk des decrypt : " + new String(result));
  47. } catch (Exception e) {
  48. e.printStackTrace();
  49. }
  50. }
  51.  
  52. public static void bcDES() {
  53. try {
  54. Security.addProvider(new BouncyCastleProvider());
  55.  
  56. //生成KEY
  57. KeyGenerator keyGenerator = KeyGenerator.getInstance("DES", "BC");
  58. keyGenerator.getProvider();
  59. keyGenerator.init();
  60. SecretKey secretKey = keyGenerator.generateKey();
  61. byte[] bytesKey = secretKey.getEncoded();
  62.  
  63. //KEY转换
  64. DESKeySpec desKeySpec = new DESKeySpec(bytesKey);
  65. SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");
  66. Key convertSecretKey = factory.generateSecret(desKeySpec);
  67.  
  68. //加密
  69. Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
  70. cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey);
  71. byte[] result = cipher.doFinal(src.getBytes());
  72. System.out.println("bc des encrypt : " + Hex.encodeHexString(result));
  73.  
  74. //解密
  75. cipher.init(Cipher.DECRYPT_MODE, convertSecretKey);
  76. result = cipher.doFinal(result);
  77. System.out.println("bc des decrypt : " + new String(result));
  78. } catch (Exception e) {
  79. e.printStackTrace();
  80. }
  81. }
  82.  
  83. }

对称加密算法应用场景

2.Java对称加密算法--3DES

  1. package com.imooc.security.des;
  2.  
  3. import java.security.Key;
  4. import java.security.SecureRandom;
  5.  
  6. import javax.crypto.Cipher;
  7. import javax.crypto.KeyGenerator;
  8. import javax.crypto.SecretKey;
  9. import javax.crypto.SecretKeyFactory;
  10. import javax.crypto.spec.DESKeySpec;
  11.  
  12. import org.apache.commons.codec.binary.Base64;
  13.  
  14. public class Imooc3DES {
  15.  
  16. private static String src = "imooc security 3des";
  17.  
  18. public static void main(String[] args) {
  19. jdk3DES();
  20. }
  21.  
  22. public static void jdk3DES() {
  23. try {
  24. //生成KEY
  25. KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede");
  26. // keyGenerator.init(168);
  27. keyGenerator.init(new SecureRandom());//默认长度
  28. SecretKey secretKey = keyGenerator.generateKey();
  29. byte[] bytesKey = secretKey.getEncoded();
  30.  
  31. //KEY转换
  32. DESKeySpec desKeySpec = new DESKeySpec(bytesKey);
  33. SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");
  34. Key convertSecretKey = factory.generateSecret(desKeySpec);
  35.  
  36. //加密
  37. Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
  38. cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey);
  39. byte[] result = cipher.doFinal(src.getBytes());
  40. System.out.println("jdk 3des encrypt : " + Base64.encodeBase64String(result));
  41.  
  42. //解密
  43. cipher.init(Cipher.DECRYPT_MODE, convertSecretKey);
  44. result = cipher.doFinal(result);
  45. System.out.println("jdk 3des decrypt : " + new String(result));
  46. } catch (Exception e) {
  47. e.printStackTrace();
  48. }
  49. }
  50.  
  51. public static void bc3DES() {
  52. //TODO
  53. }
  54.  
  55. }

3.Java对称加密算法--AES (应用最多(DES替代者))

  1. package com.imooc.security.aes;
  2.  
  3. import java.security.Key;
  4.  
  5. import javax.crypto.Cipher;
  6. import javax.crypto.KeyGenerator;
  7. import javax.crypto.SecretKey;
  8. import javax.crypto.spec.SecretKeySpec;
  9.  
  10. import org.apache.commons.codec.binary.Base64;
  11.  
  12. public class ImoocAES {
  13.  
  14. private static String src = "imooc security aes";
  15.  
  16. public static void main(String[] args) {
  17. jdkAES();
  18. }
  19.  
  20. public static void jdkAES() {
  21. try {
  22. //生成KEY
  23. KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
  24. keyGenerator.init();
  25. SecretKey secretKey = keyGenerator.generateKey();
  26. byte[] keyBytes = secretKey.getEncoded();
  27.  
  28. //key转换
  29. Key key = new SecretKeySpec(keyBytes, "AES");
  30.  
  31. //加密
  32. Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
  33. cipher.init(Cipher.ENCRYPT_MODE, key);
  34. byte[] result = cipher.doFinal(src.getBytes());
  35. System.out.println("jdk aes encrypt : " + Base64.encodeBase64String(result));
  36.  
  37. //解密
  38. cipher.init(Cipher.DECRYPT_MODE, key);
  39. result = cipher.doFinal(result);
  40. System.out.println("jdk aes desrypt : " + new String(result));
  41. } catch (Exception e) {
  42. e.printStackTrace();
  43. }
  44. }
  45.  
  46. public static void bcAES() {
  47. //TODO
  48. }
  49.  
  50. }

4.Java对称加密算法--PBE

  1. package com.imooc.security.pbe;
  2.  
  3. import java.security.Key;
  4. import java.security.SecureRandom;
  5.  
  6. import javax.crypto.Cipher;
  7. import javax.crypto.SecretKeyFactory;
  8. import javax.crypto.spec.PBEKeySpec;
  9. import javax.crypto.spec.PBEParameterSpec;
  10.  
  11. import org.apache.commons.codec.binary.Base64;
  12.  
  13. public class ImoocPBE {
  14.  
  15. private static String src = "imooc security pbe";
  16.  
  17. public static void main(String[] args) {
  18. jdkPBE();
  19. }
  20.  
  21. public static void jdkPBE() {
  22. try {
  23. //初始化盐
  24. SecureRandom random = new SecureRandom();
  25. byte[] salt = random.generateSeed();
  26.  
  27. //口令与密钥
  28. String password = "imooc";
  29. PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray());
  30. SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWITHMD5andDES");
  31. Key key = factory.generateSecret(pbeKeySpec);
  32.  
  33. //加密
  34. PBEParameterSpec pbeParameterSpec = new PBEParameterSpec(salt, );
  35. Cipher cipher = Cipher.getInstance("PBEWITHMD5andDES");
  36. cipher.init(Cipher.ENCRYPT_MODE, key, pbeParameterSpec);
  37. byte[] result = cipher.doFinal(src.getBytes());
  38. System.out.println("jdk pbe encrypt : " + Base64.encodeBase64String(result));
  39.  
  40. //解密
  41. cipher.init(Cipher.DECRYPT_MODE, key, pbeParameterSpec);
  42. result = cipher.doFinal(result);
  43. System.out.println("jdk pbe decrypt : " + new String(result));
  44. } catch (Exception e) {
  45. e.printStackTrace();
  46. }
  47. }
  48.  
  49. }

五。非对称加密算法

1。DH:密钥交换算法

【1】。KeyFactory

【2】。X509EncodedKeySpec

  1. package com.imooc.security.dh;
  2.  
  3. import java.security.KeyFactory;
  4. import java.security.KeyPair;
  5. import java.security.KeyPairGenerator;
  6. import java.security.PrivateKey;
  7. import java.security.PublicKey;
  8. import java.security.spec.X509EncodedKeySpec;
  9.  
  10. import javax.crypto.Cipher;
  11. import javax.crypto.KeyAgreement;
  12. import javax.crypto.SecretKey;
  13. import javax.crypto.interfaces.DHPublicKey;
  14. import javax.crypto.spec.DHParameterSpec;
  15.  
  16. import org.apache.commons.codec.binary.Base64;
  17.  
  18. import com.sun.org.apache.xalan.internal.utils.Objects;
  19.  
  20. public class ImoocDH {
  21.  
  22. private static String src = "imooc security dh";
  23.  
  24. public static void main(String[] args) {
  25. jdkDH();
  26. }
  27.  
  28. public static void jdkDH() {
  29. try {
  30. //1.初始化发送方密钥
  31. KeyPairGenerator senderKeyPairGenerator = KeyPairGenerator.getInstance("DH");
  32. senderKeyPairGenerator.initialize();
  33. KeyPair senderKeyPair = senderKeyPairGenerator.generateKeyPair();
  34. byte[] senderPublicKeyEnc = senderKeyPair.getPublic().getEncoded();//发送方公钥,发送给接收方(网络、文件。。。)
  35.  
  36. //2.初始化接收方密钥
  37. KeyFactory receiverKeyFactory = KeyFactory.getInstance("DH");
  38. X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(senderPublicKeyEnc);
  39. PublicKey receiverPublicKey = receiverKeyFactory.generatePublic(x509EncodedKeySpec);
  40. DHParameterSpec dhParameterSpec = ((DHPublicKey)receiverPublicKey).getParams();
  41. KeyPairGenerator receiverKeyPairGenerator = KeyPairGenerator.getInstance("DH");
  42. receiverKeyPairGenerator.initialize(dhParameterSpec);
  43. KeyPair receiverKeypair = receiverKeyPairGenerator.generateKeyPair();
  44. PrivateKey receiverPrivateKey = receiverKeypair.getPrivate();
  45. byte[] receiverPublicKeyEnc = receiverKeypair.getPublic().getEncoded();
  46.  
  47. //3.密钥构建
  48. KeyAgreement receiverKeyAgreement = KeyAgreement.getInstance("DH");
  49. receiverKeyAgreement.init(receiverPrivateKey);
  50. receiverKeyAgreement.doPhase(receiverPublicKey, true);
  51. SecretKey receiverDesKey = receiverKeyAgreement.generateSecret("DES");
  52.  
  53. KeyFactory senderKeyFactory = KeyFactory.getInstance("DH");
  54. x509EncodedKeySpec = new X509EncodedKeySpec(receiverPublicKeyEnc);
  55. PublicKey senderPublicKey = senderKeyFactory.generatePublic(x509EncodedKeySpec);
  56. KeyAgreement senderKeyAgreement = KeyAgreement.getInstance("DH");
  57. senderKeyAgreement.init(senderKeyPair.getPrivate());
  58. senderKeyAgreement.doPhase(senderPublicKey, true);
  59. SecretKey senderDesKey = senderKeyAgreement.generateSecret("DES");
  60. if (Objects.equals(receiverDesKey, senderDesKey)) {
  61. System.out.println("双方密钥相同");
  62. }
  63.  
  64. //4.加密
  65. Cipher cipher = Cipher.getInstance("DES");
  66. cipher.init(Cipher.ENCRYPT_MODE, senderDesKey);
  67. byte[] result = cipher.doFinal(src.getBytes());
  68. System.out.println("jdk dh encrypt : " + Base64.encodeBase64String(result));
  69.  
  70. //5.解密
  71. cipher.init(Cipher.DECRYPT_MODE, receiverDesKey);
  72. result = cipher.doFinal(result);
  73. System.out.println("jdk dh decrypt : " + new String(result));
  74. } catch (Exception e) {
  75. e.printStackTrace();
  76. }
  77. }
  78.  
  79. }

2。非对称加密算法--RSA算法(广泛应用)

  1. package com.imooc.security.rsa;
  2.  
  3. import java.security.KeyFactory;
  4. import java.security.KeyPair;
  5. import java.security.KeyPairGenerator;
  6. import java.security.PrivateKey;
  7. import java.security.PublicKey;
  8. import java.security.interfaces.RSAPrivateKey;
  9. import java.security.interfaces.RSAPublicKey;
  10. import java.security.spec.PKCS8EncodedKeySpec;
  11. import java.security.spec.X509EncodedKeySpec;
  12.  
  13. import javax.crypto.Cipher;
  14.  
  15. import org.apache.commons.codec.binary.Base64;
  16.  
  17. public class ImoocRSA {
  18.  
  19. private static String src = "imooc security rsa";
  20.  
  21. public static void main(String[] args) {
  22. jdkRSA();
  23. }
  24.  
  25. public static void jdkRSA() {
  26. try {
  27. //1.初始化密钥
  28. KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
  29. keyPairGenerator.initialize();
  30. KeyPair keyPair = keyPairGenerator.generateKeyPair();
  31. RSAPublicKey rsaPublicKey = (RSAPublicKey)keyPair.getPublic();
  32. RSAPrivateKey rsaPrivateKey = (RSAPrivateKey)keyPair.getPrivate();
  33. System.out.println("Public Key : " + Base64.encodeBase64String(rsaPublicKey.getEncoded()));
  34. System.out.println("Private Key : " + Base64.encodeBase64String(rsaPrivateKey.getEncoded()));
  35.  
  36. //2.私钥加密、公钥解密——加密
  37. PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
  38. KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  39. PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
  40. Cipher cipher = Cipher.getInstance("RSA");
  41. cipher.init(Cipher.ENCRYPT_MODE, privateKey);
  42. byte[] result = cipher.doFinal(src.getBytes());
  43. System.out.println("私钥加密、公钥解密——加密 : " + Base64.encodeBase64String(result));
  44.  
  45. //3.私钥加密、公钥解密——解密
  46. X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
  47. keyFactory = KeyFactory.getInstance("RSA");
  48. PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
  49. cipher = Cipher.getInstance("RSA");
  50. cipher.init(Cipher.DECRYPT_MODE, publicKey);
  51. result = cipher.doFinal(result);
  52. System.out.println("私钥加密、公钥解密——解密:" + new String(result));
  53.  
  54. //4.公钥加密、私钥解密——加密
  55. x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
  56. keyFactory = KeyFactory.getInstance("RSA");
  57. publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
  58. cipher = Cipher.getInstance("RSA");
  59. cipher.init(Cipher.ENCRYPT_MODE, publicKey);
  60. result = cipher.doFinal(src.getBytes());
  61. System.out.println("公钥加密、私钥解密——加密 : " + Base64.encodeBase64String(result));
  62.  
  63. //5.公钥加密、私钥解密——解密
  64. pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
  65. keyFactory = KeyFactory.getInstance("RSA");
  66. privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
  67. cipher = Cipher.getInstance("RSA");
  68. cipher.init(Cipher.DECRYPT_MODE, privateKey);
  69. result = cipher.doFinal(result);
  70. System.out.println("公钥加密、私钥解密——解密:" + new String(result));
  71. } catch (Exception e) {
  72. e.printStackTrace();
  73. }
  74. }
  75.  
  76. }

3。非对称加密算法--EIGamal

总结:《区块链核心技术与应用》--数据加密算法

数据加密算法主要分为两大类:

(一)。对称加密算法

对称加密算法主要用于对区块链的交易和区块链进行加密。

加密钥匙和解密钥匙为同一把。(数字指纹:哈希计算的值)

说明:

为保证交易信息或区块信息内容完整性,需要:

将传递的交易信息或区块信息通过HASH计算得到一串哈希码h,

并将哈希码h和传递的交易信息或区块信息的密文一起发送给对方。

对方接收到信息并解密后,重新对解密后的明文进行哈希计算得到一个新的哈希码h`,

然后对h 和 h`进行比较.若h=h`,则说明信息在传递过程中没有被篡改。

(二)。非对称加密算法

1.公钥加密,私钥解密。--数字信封

目的:安全传递密钥

说明:

为了实现交易信息或者区块信息的密钥安全传输保障,需要将对称加密所用的对称加密密钥K通过使用

接收者的公钥进行加密,形成数字信封。该数字信封通过网络传递到接收方。

接收方使用自己的私钥对该数字信封进行解密,从而得到解密所需的对称解密密钥K。因为在解密过程中,

只有接收者自己的私钥能够解开该数字信封,任何其他人的钥匙都不能解开该信封,所以数字信封可以保证整个密钥的传递安全性。

2.私钥加密,公钥解密。--数字签名

目的:用于作为签名使用,防止各种抵赖

数字签名主要目标:用来确认信息发送者认可自己曾经的行为(自己所签署)。

说明:

为了实现交易信息或者区块信息的来源可靠性保障,需要将:

传递的交易信息或者区块信息通过哈希计算得到相应的数字摘要,

然后使用发送者的私钥进行加密,得到相应的数字签名,并将数字签名通过网络传递到接收方。

如果接收方使用发送方的公钥能够解开该数字签名,则证明该数字签名的确为该发送者所签署,来源可靠;

如果接收方使用发送者的公钥不能解开该数字签名,则证明该数字签名不是该发送者所签署,来源不可靠。

java基础/数据加解密(Mooc)的更多相关文章

  1. java安全与加解密

    1 安全 安全性相关内容分为认证.授权和审计(发现安全问题时可以查看相关历史记录) 用户认证 java API表示主体的是javax.security.auth.Subject类型,表示用户身份标识的 ...

  2. 【转】 Java 进行 RSA 加解密时不得不考虑到的那些事儿

    [转] Java 进行 RSA 加解密时不得不考虑到的那些事儿 1. 加密的系统不要具备解密的功能,否则 RSA 可能不太合适 公钥加密,私钥解密.加密的系统和解密的系统分开部署,加密的系统不应该同时 ...

  3. shiro框架学习-6-Shiro内置的Filter过滤器及数据加解密

    1.  shiro的核心过滤器定义在枚举类DefaultFilter 中,一共有11个 ,配置哪个路径对应哪个拦截器进行处理 // // Source code recreated from a .c ...

  4. ASP.NET Core 6框架揭秘实例演示[19]:数据加解密与哈希

    数据保护(Data Protection)框架旨在解决数据在传输与持久化存储过程中的一致性(Integrity)和机密性(confidentiality)问题,前者用于检验接收到的数据是否经过篡改,后 ...

  5. 一个java的DES加解密类转换成C#

    原文:一个java的DES加解密类转换成C# 一个java的des加密解密代码如下: //package com.visionsky.util; import java.security.*; //i ...

  6. T-SQL问题解决集锦——数据加解密(2)

    原文:T-SQL问题解决集锦--数据加解密(2) 问题三.如何让指定用户可以对数据表进行Truncate操作? Truncate在对大表全删除操作时,会明显比Delete语句更快更有效,但是因为它不需 ...

  7. T-SQL问题解决集锦——数据加解密

    原文:T-SQL问题解决集锦--数据加解密 以下代码已经在SQLServer2008上的示例数据库测试通过 问题一:如何为数据进行加密与解密,避免使用者窃取机密数据? 对于一些敏感数据,如密码.卡号, ...

  8. odoo基础数据加载

    odoo 基础数据加载 这里介绍的odoo基础数据加载分两种方式,一种是演示数据加载,一种是默认数据加载,下面就是详细介绍 首先,当然是创建一个date文件夹 项目目录,右键自定义一个文件夹 XML数 ...

  9. Java 进行 RSA 加解密时不得不考虑到的那些事儿

    1. 加密的系统不要具备解密的功能,否则 RSA 可能不太合适 公钥加密,私钥解密.加密的系统和解密的系统分开部署,加密的系统不应该同时具备解密的功能,这样即使黑客攻破了加密系统,他拿到的也只是一堆无 ...

随机推荐

  1. 深入理解JAVA虚拟机 虚拟机字节码执行引擎

    执行引擎 执行引擎是java虚拟机的重要组成部分.它的作用是接收字节码,解析字节码,执行并输出执行结果. 虚拟机是相对于物理机的概念,物理机的执行引擎是直接建立在处理器.寄存器.指令集和操作系统的层面 ...

  2. linux系统下导出MySQL文件

    1.配置:从centOS6.5系统,MySQL数据库 2.导出.sql文件的命令: mysqldump -uroot -h116.228.90.147 -P18006 -p aimo > /ho ...

  3. wordpress设置本地化语言

    wordpress语言本地化 在wordpress上很多插件不支持本地化语言如:中文,需要本地化,则需要制作本地化语言的po(用于编辑)和mo(用于机器识别)文件.可以没有*.po文件,但是不能没有* ...

  4. 非root用户随开机而启动mysql服务

    非root用户随开机而启动mysql服务 今天验证了一下,非root用户随开机而启动msyql服务的脚本执行效果,特此简要记录如下: 环境: 192.168.142.130 mysql 5.6.41 ...

  5. Python---CSS选择器权重以及补充

    一. 嵌入式CSS CSS引入方式优先级 二.

  6. JDBC接口封装

    package cn.piesat.sparkproject.jdbc; import java.sql.Connection;import java.sql.DriverManager;import ...

  7. layui 中的$符号有可以和jquery冲突,var & = layui.$

    在项目上使用到了滚动条插件,但是使用var & = layui.$,会影响到插件. 错误提示: Uncaught TypeError: $(...).perfectScrollbar is n ...

  8. node 的CommonJS的引入

    1.CommonJS 每个文件是一个模块,有自己的作用域 引入:

  9. Mysql基本原理和概念

    一.引言 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题.对于一个大型的互联网应用,每天几十亿的PV无疑对数据库造成了相当高的负载.对于系统的稳定性和扩展性造成了极大的问题.通 ...

  10. jquery animated选择器 语法

    jquery animated选择器 语法 作用::animated 选择器选取当前的所有动画元素.直线电机参数 语法:$(":animated") jquery animated ...