java/php DES/CBC/PKCS5Padding加密解密算法实现过程


先看java代码 

Java代码  收藏代码
  1. public static String encrypt(String message, String key) throws Exception {  
  2.         Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");  
  3.   
  4.         DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));  
  5.   
  6.         SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");  
  7.         SecretKey secretKey = keyFactory.generateSecret(desKeySpec);  
  8.         IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));  
  9.         cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);  
  10.   
  11.         return toHexString(cipher.doFinal(message.getBytes("UTF-8")));  
  12.     }  
  13.   
  14. public static String decrypt(String message, String key) throws Exception {  
  15.   
  16.         byte[] bytesrc = convertHexString(message);  
  17.         Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");  
  18.         DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));  
  19.         SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");  
  20.         SecretKey secretKey = keyFactory.generateSecret(desKeySpec);  
  21.         IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));  
  22.   
  23.         cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);  
  24.   
  25.         byte[] retByte = cipher.doFinal(bytesrc);  
  26.         return new String(retByte);  
  27.     }  
  28.   
  29. public static byte[] convertHexString(String ss) {  
  30.         byte digest[] = new byte[ss.length() / 2];  
  31.         for (int i = 0; i < digest.length; i++) {  
  32.             String byteString = ss.substring(2 * i, 2 * i + 2);  
  33.             int byteValue = Integer.parseInt(byteString, 16);  
  34.             digest[i] = (byte) byteValue;  
  35.         }  
  36.   
  37.         return digest;  
  38.     }  
  39.     public static String toHexString(byte b[]) {  
  40.         StringBuffer hexString = new StringBuffer();  
  41.         for (int i = 0; i < b.length; i++) {  
  42.             String plainText = Integer.toHexString(0xff & b[i]);  
  43.             if (plainText.length() < 2)  
  44.                 plainText = "0" + plainText;  
  45.             hexString.append(plainText);  
  46.         }  
  47.   
  48.         return hexString.toString();  
  49.     }  



java写的已经很明显使用的是CBC/PKCS补码方式 

在看PHP 

Php代码  收藏代码
  1. function encrypt($str) {  
  2.         //加密,返回大写十六进制字符串  
  3.         $size = mcrypt_get_block_size (MCRYPT_DES, MCRYPT_MODE_[color=red]CBC[/color] );  
  4.         $str = $this->pkcs5Pad ( $str$size );  
  5.         return strtoupper( bin2hex( mcrypt_cbc(MCRYPT_DES, $this->key, $str, MCRYPT_ENCRYPT, $this->iv ) ) );  
  6.     }  
  7.   
  8.     function decrypt($str) {  
  9.         //解密    
  10.         $strBin = $this->hex2bin( strtolower$str ) );    
  11.         $str = mcrypt_cbc( MCRYPT_DES, $this->key, $strBin, MCRYPT_DECRYPT, $this->iv );  
  12.         $str = $this->pkcs5Unpad( $str );  
  13.        
  14.        
  15.        
  16.         return $str;  
  17.     }  
  18. function hex2bin($hexData) {    
  19.         $binData = "";    
  20.         for($i = 0; $i  < strlen ( $hexData ); $i += 2) {    
  21.             $binData .= chr ( hexdec ( substr ( $hexData$i, 2 ) ) );    
  22.         }  
  23.         return $binData;  
  24.     }  
  25.   
  26.     function pkcs5Pad($text$blocksize) {  
  27.         $pad = $blocksize - (strlen ( $text ) % $blocksize);  
  28.         return $text . str_repeat ( chr ( $pad ), $pad );  
  29.     }  
  30.   
  31.     function pkcs5Unpad($text) {  
  32.         $pad = ord ( $text {strlen ( $text ) - 1} );    
  33.         if ($pad > strlen ( $text )) return false;  
  34.   
  35.         if (strspn ( $textchr ( $pad ), strlen ( $text ) - $pad ) != $pad)   return false;    
  36.   
  37.         return substr ( $text, 0, - 1 * $pad );  
  38.     }  

 

posted @ 2014-05-28 11:48  Martin2  阅读(2710)  评论(0编辑  收藏  举报