加密算法(二)——MD5,Base64,DES,RSA加密算法解析

java中,诸如MD5BASE64DESRSA等经典加密解密算法,JDK都有提供专门的API来封装相关操作。下面逐一介绍每种算法的具体应用流程。

一、 MD5加密算法:

     MD5算法,是一种基于哈希函数的单向加密算法,只能加密、无法解密。Java中提供了MD5算法的API

1.创建md5对象:

2.  进行加密操作:

3.  将其中的每个字节转成十六进制字符串:byte类型的数据最高位是符号位,通过和0xff进行与操作,转换为int类型的正整数。

4.如果该正数小于16(长度为1个字符),前面拼接0占位:确保最后生成的是32位字符串。

  1. public    void  testMD5()  throws  Exception {    
  2.     String plainText =  "Hello , world !" ;    
  3.     //创建MD5对象  
  4.     MessageDigest md5 = MessageDigest.getInstance( "md5" );    
  5.     //加密操作  
  6.      byte [] cipherData = md5.digest(plainText.getBytes());    
  7.      //组织输出  
  8.     StringBuilder builder =  new  StringBuilder();    
  9.      for ( byte  cipher : cipherData) {    
  10.          //将其中的每个字节转成十六进制字符串:byte类型的数据最高位是符号位,通过和0xff进行与操作,转换为int类型的正整数  
  11.         String toHexStr = Integer.toHexString(cipher &  0xff );   
  12.         // 如果该正数小于16(长度为1个字符),前面拼接0占位:确保最后生成的是32位字符串  
  13.         builder.append(toHexStr.length() ==  1  ?  "0"  + toHexStr : toHexStr);    
  14.     }    
  15.     System.out.println(builder.toString());    
  16.      //c0bb4f54f1d8b14caf6fe1069e5f93ad     
  17. }    
二、使用BASE64进行加密/解密:

      使用BASE64算法通常用作对二进制数据进行加密,加密之后的数据不易被肉眼识别。BASE64的加密解密算法都是公开的,可进行加密解密操作。

     具体步骤同MD5,首先实例化base64对象,进行加密操作

  1. /**   
  2.      * 功能简述: 使用BASE64进行双向加密/解密.   
  3.      * @throws Exception   
  4.      */    
  5.     public   void  testBase64()  throws  Exception {    
  6.         BASE64Encoder encoder =  new  BASE64Encoder();    
  7.         BASE64Decoder decoder =  new  BASE64Decoder();    
  8.         String plainText =  "Hello , world !" ;    
  9.         String cipherText = encoder.encode(plainText.getBytes());    
  10.         System.out.println( "cipherText : "  + cipherText);    
  11.          //cipherText : SGVsbG8gLCB3b3JsZCAh     
  12.         System.out.println( "plainText : "  +     
  13.              new  String(decoder.decodeBuffer(cipherText)));    
  14.          //plainText : Hello , world !   
  15.     }  
三、使用DES对称加密/解密:

     数据加密标准算法(Data Encryption Standard),和BASE64最明显的区别就是有一个公有密钥,该密钥既用于加密、也用于解密,并且要求密钥是一个长度至少大于8位的字符串。使用DES加密、解密的核心是确保工作密钥的安全性。 

1. 根据key生成密钥:

2. 加密操作:

3. 为了便于观察生成的加密数据,使用BASE64再次加密:

4. 解密操作:

  1. /**   
  2.      * 功能简述: 使用DES 对称加密/解密.   
  3.      * @throws Exception   
  4.      */       
  5.     public   void  testDES()  throws  Exception {    
  6.         String plainText =  "Hello , world !" ;    
  7.         String key =  "12345678" ;     //要求key至少长度为8个字符     
  8.          //根据key生成密钥  
  9.         SecureRandom random =  new  SecureRandom();    
  10.         DESKeySpec keySpec =  new  DESKeySpec(key.getBytes());    
  11.         SecretKeyFactory keyFactory = SecretKeyFactory.getInstance( "des" );    
  12.         SecretKey secretKey = keyFactory.generateSecret(keySpec);    
  13.          //加密操作  
  14.         Cipher cipher = Cipher.getInstance( "des" );    
  15.         cipher.init(Cipher.ENCRYPT_MODE, secretKey, random);    
  16.          byte [] cipherData = cipher.doFinal(plainText.getBytes());    
  17.          //为了便于观察生成的加密数据,使用BASE64再次加密  
  18.         System.out.println( "cipherText : "  +  new  BASE64Encoder().encode(cipherData));    
  19.          //PtRYi3sp7TOR69UrKEIicA==     
  20.             
  21.         //解密操作  
  22.         cipher.init(Cipher.DECRYPT_MODE, secretKey, random);    
  23.          byte [] plainData = cipher.doFinal(cipherData);    
  24.         System.out.println( "plainText : "  +  new  String(plainData));    
  25.          //Hello , world !     
  26.     }    
四、使用RSA非对称加密/解密:

     RSA算法是非对称加密算法的典型代表,既能加密、又能解密。和对称加密算法比如DES的明显区别在于用于加密、解密的密钥是不同的。使用RSA算法,只要密钥足够长(一般要求1024bit),加密的信息是不能被破解的。用户通过https协议访问服务器时,就是使用非对称加密算法进行数据的加密、解密操作的。

     服务器发送数据给客户端时使用私钥(private key)进行加密,并且使用加密之后的数据和私钥生成数字签名(digital signature)并发送给客户端。客户端接收到服务器发送的数据会使用公钥(public key)对数据来进行解密,并且根据加密数据和公钥验证数字签名的有效性,防止加密数据在传输过程中被第三方进行了修改。

客户端发送数据给服务器时使用公钥进行加密,服务器接收到加密数据之后使用私钥进行解密。

1. 创建密钥对KeyPair

2. 获取公钥/私钥:

3. 服务器数据使用私钥加密:

4. 用户使用公钥解密:

5. 服务器根据私钥和加密数据生成数字签名:

6. 用户根据公钥、加密数据验证数据是否被修改过:

  1. /**   
  2.      * 功能简述: 使用RSA非对称加密/解密.   
  3.      * @throws Exception   
  4.      */        
  5.     public   void  testRSA()  throws  Exception {    
  6.         String plainText =  "Hello , world !" ;    
  7.          //生成公钥私钥  
  8.         KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance( "rsa" );    
  9.         keyPairGenerator.initialize( 1024 );    
  10.         KeyPair keyPair = keyPairGenerator.generateKeyPair();    
  11.             
  12.         PublicKey publicKey = keyPair.getPublic();    
  13.         PrivateKey privateKey = keyPair.getPrivate();    
  14.           
  15.         Cipher cipher = Cipher.getInstance( "rsa" );    
  16.         SecureRandom random =  new  SecureRandom();    
  17.   
  18.         //私钥加密  
  19.         cipher.init(Cipher.ENCRYPT_MODE, privateKey, random);    
  20.          byte [] cipherData = cipher.doFinal(plainText.getBytes());    
  21.          //转成base64  
  22.         System.out.println( "cipherText : "  +  new  BASE64Encoder().encode(cipherData));    
  23.          //yQ+vHwHqXhuzZ/N8iNg=     
  24.         
  25.         //公钥认证  
  26.         cipher.init(Cipher.DECRYPT_MODE, publicKey, random);    
  27.          byte [] plainData = cipher.doFinal(cipherData);    
  28.         System.out.println( "plainText : "  +  new  String(plainData));    
  29.          //Hello , world !     
  30.           
  31.         /* 
  32.          *保证消息的完整性  
  33.          */  
  34.         // 服务器根据私钥和加密数据生成数字签名,使用私钥+私钥加密后的数据==》sign生成签名  
  35.         Signature signature  = Signature.getInstance( "MD5withRSA" );    
  36.         signature.initSign(privateKey);    
  37.         signature.update(cipherData);    
  38.          byte [] signData = signature.sign();    
  39.         System.out.println( "signature : "  +  new  BASE64Encoder().encode(signData));    
  40.          ///t9ewo+KYCWKOgvu5QQ=     
  41.           
  42.         //用户根据公钥、加密数据验证数据是否被修改过,使用公钥+私钥加密后的数据===》verify(signData)  
  43.         signature.initVerify(publicKey);    
  44.         signature.update(cipherData);    
  45.          boolean  status = signature.verify(signData);    
  46.         System.out.println( "status : "  + status);    
  47.          //true     
  48.     }     
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值