3des加密解密

来源:互联网 发布:淘宝上药店是真的吗 编辑:程序博客网 时间:2024/06/16 01:26

php服务器,java服务器,android,ios开发兼容的3des加密解密,

php

<?phpclass DES3 {    #密钥可写成构造方法传入    var $key = "my.oschina.net/penngo?#@";    var $iv = "01234567";    function encrypt($input){        $size = mcrypt_get_block_size(MCRYPT_3DES,MCRYPT_MODE_CBC);        $input = $this->pkcs5_pad($input, $size);        $key = str_pad($this->key,24,'0');        $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');        if( $this->iv == '' ){            $iv = @mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);        } else {            $iv = $this->iv;        }        @mcrypt_generic_init($td, $key, $iv);        $data = mcrypt_generic($td, $input);        mcrypt_generic_deinit($td);        mcrypt_module_close($td);        $data = base64_encode($data);        return $data;    }    function decrypt($encrypted){        $encrypted = base64_decode($encrypted);        $key = str_pad($this->key,24,'0');        $td = mcrypt_module_open(MCRYPT_3DES,'',MCRYPT_MODE_CBC,'');        if( $this->iv == '' ) {            $iv = @mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);        } else {            $iv = $this->iv;        }        $ks = mcrypt_enc_get_key_size($td);        @mcrypt_generic_init($td, $key, $iv);        $decrypted = mdecrypt_generic($td, $encrypted);        mcrypt_generic_deinit($td);        mcrypt_module_close($td);        $y=$this->pkcs5_unpad($decrypted);        return $y;    }    function pkcs5_pad ($text, $blocksize) {        $pad = $blocksize - (strlen($text) % $blocksize);        return $text . str_repeat(chr($pad), $pad);    }    function pkcs5_unpad($text){        $pad = ord($text{strlen($text)-1});        if ($pad > strlen($text)) {            return false;        }        if (strspn($text, chr($pad), strlen($text) - $pad) != $pad){            return false;        }        return substr($text, 0, -1 * $pad);    }    function PaddingPKCS7($data) {        $block_size = mcrypt_get_block_size(MCRYPT_3DES, MCRYPT_MODE_CBC);        $padding_char = $block_size - (strlen($data) % $block_size);        $data .= str_repeat(chr($padding_char),$padding_char);        return $data;    }}$des = new DES3();echo $ret = $des->encrypt("来自http://my.oschina.net/penngo的博客") . "\n";echo $des->decrypt($ret) . "\n";

java(android)

import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.OutputStream;import java.io.UnsupportedEncodingException;import java.security.Key;  import javax.crypto.Cipher;  import javax.crypto.SecretKeyFactory;  import javax.crypto.spec.DESedeKeySpec;  import javax.crypto.spec.IvParameterSpec;  /**   * 3DES加密工具类   */ public class DES3 {       // 密钥       private final static String secretKey = "my.oschina.net/penngo?#@" ;        // 向量       private final static String iv = "01234567" ;       // 加解密统一使用的编码方式       private final static String encoding = "utf-8" ;       /**       * 3DES加密       *        * @param plainText 普通文本       * @return       * @throws Exception        */      public static String encode(String plainText) throws Exception {           Key deskey = null ;           DESedeKeySpec spec = new DESedeKeySpec(secretKey.getBytes());           SecretKeyFactory keyfactory = SecretKeyFactory.getInstance( "desede" );           deskey = keyfactory.generateSecret(spec);           Cipher cipher = Cipher.getInstance( "desede/CBC/PKCS5Padding" );           IvParameterSpec ips = new IvParameterSpec(iv.getBytes());           cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);           byte [] encryptData = cipher.doFinal(plainText.getBytes(encoding));           return Base64.encode(encryptData);       }       /**       * 3DES解密       *        * @param encryptText 加密文本       * @return       * @throws Exception       */      public static String decode(String encryptText) throws Exception {           Key deskey = null ;           DESedeKeySpec spec = new DESedeKeySpec(secretKey.getBytes());            SecretKeyFactory keyfactory = SecretKeyFactory.getInstance( "desede" );           deskey = keyfactory.generateSecret(spec);           Cipher cipher = Cipher.getInstance( "desede/CBC/PKCS5Padding" );           IvParameterSpec ips = new IvParameterSpec(iv.getBytes());           cipher.init(Cipher.DECRYPT_MODE, deskey, ips);           byte [] decryptData = cipher.doFinal(Base64.decode(encryptText));           return new String(decryptData, encoding);       }      public static String padding(String str) {        byte[] oldByteArray;        try {            oldByteArray = str.getBytes("UTF8");            int numberToPad = 8 - oldByteArray.length % 8;            byte[] newByteArray = new byte[oldByteArray.length + numberToPad];            System.arraycopy(oldByteArray, 0, newByteArray, 0,                    oldByteArray.length);            for (int i = oldByteArray.length; i < newByteArray.length; ++i) {                newByteArray[i] = 0;            }            return new String(newByteArray, "UTF8");        } catch (UnsupportedEncodingException e) {            System.out.println("Crypter.padding UnsupportedEncodingException");        }        return null;    }    /**       * Base64编码工具类       *       */     public static class Base64 {           private static final char [] legalChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" .toCharArray();           public static String encode( byte [] data) {               int start = 0 ;               int len = data.length;               StringBuffer buf = new StringBuffer(data.length * 3 / 2 );               int end = len - 3 ;               int i = start;               int n = 0 ;               while (i <= end) {                   int d = (((( int ) data[i]) & 0x0ff ) << 16 ) | (((( int ) data[i + 1 ]) & 0x0ff ) << 8 ) | ((( int ) data[i + 2 ]) & 0x0ff );                   buf.append(legalChars[(d >> 18 ) & 63 ]);                   buf.append(legalChars[(d >> 12 ) & 63 ]);                   buf.append(legalChars[(d >> 6 ) & 63 ]);                   buf.append(legalChars[d & 63 ]);                   i += 3 ;                   if (n++ >= 14 ) {                       n = 0 ;                       buf.append( " " );                   }               }               if (i == start + len - 2 ) {                   int d = (((( int ) data[i]) & 0x0ff ) << 16 ) | (((( int ) data[i + 1 ]) & 255 ) << 8 );                   buf.append(legalChars[(d >> 18 ) & 63 ]);                   buf.append(legalChars[(d >> 12 ) & 63 ]);                   buf.append(legalChars[(d >> 6 ) & 63 ]);                   buf.append( "=" );               } else if (i == start + len - 1 ) {                   int d = ((( int ) data[i]) & 0x0ff ) << 16 ;                   buf.append(legalChars[(d >> 18 ) & 63 ]);                   buf.append(legalChars[(d >> 12 ) & 63 ]);                   buf.append( "==" );               }               return buf.toString();           }           private static int decode( char c) {               if (c >= 'A' && c <= 'Z' )                   return (( int ) c) - 65 ;               else if (c >= 'a' && c <= 'z' )                   return (( int ) c) - 97 + 26 ;               else if (c >= '0' && c <= '9' )                   return (( int ) c) - 48 + 26 + 26 ;               else                  switch (c) {                   case '+' :                       return 62 ;                   case '/' :                       return 63 ;                   case '=' :                       return 0 ;                   default :                       throw new RuntimeException( "unexpected code: " + c);                   }           }           /**           * Decodes the given Base64 encoded String to a new byte array. The byte array holding the decoded data is returned.           */          public static byte [] decode(String s) {               ByteArrayOutputStream bos = new ByteArrayOutputStream();               try {                   decode(s, bos);               } catch (IOException e) {                   throw new RuntimeException();               }               byte [] decodedBytes = bos.toByteArray();               try {                   bos.close();                   bos = null ;               } catch (IOException ex) {                   System.err.println( "Error while decoding BASE64: " + ex.toString());               }               return decodedBytes;           }           private static void decode(String s, OutputStream os) throws IOException {               int i = 0 ;               int len = s.length();               while ( true ) {                   while (i < len && s.charAt(i) <= ' ' )                       i++;                   if (i == len)                       break ;                   int tri = (decode(s.charAt(i)) << 18 ) + (decode(s.charAt(i + 1 )) << 12 ) + (decode(s.charAt(i + 2 )) << 6 ) + (decode(s.charAt(i + 3 )));                   os.write((tri >> 16 ) & 255 );                   if (s.charAt(i + 2 ) == '=' )                       break ;                   os.write((tri >> 8 ) & 255 );                   if (s.charAt(i + 3 ) == '=' )                       break ;                   os.write(tri & 255 );                   i += 4 ;               }           }      }      public static void main(String[] args) throws Exception{         String plainText = "来自http://my.oschina.net/penngo的博客";         String encryptText = DES3.encode(plainText);         System.out.println(encryptText);         System.out.println(DES3.decode(encryptText));     }}

Ojbective-C(ios)

//  //  DES3Util.h  //  #import <Foundation/Foundation.h>  @interface DES3Util : NSObject {  }  // 加密方法  + (NSString*)encrypt:(NSString*)plainText;  // 解密方法  + (NSString*)decrypt:(NSString*)encryptText;  @end //  //  DES3Util.m  //  #import "DES3Util.h"  #import <CommonCrypto/CommonCryptor.h>  #import "GTMBase64.h"  #define gkey            @"my.oschina.net/penngo?#@"  #define gIv             @"01234567"  @implementation DES3Util  // 加密方法  + (NSString*)encrypt:(NSString*)plainText {       NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];       size_t plainTextBufferSize = [data length];       const void *vplainText = (const void *)[data bytes];       CCCryptorStatus ccStatus;       uint8_t *bufferPtr = NULL;       size_t bufferPtrSize = 0;       size_t movedBytes = 0;       bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);       bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));       memset((void *)bufferPtr, 0x0, bufferPtrSize);       const void *vkey = (const void *) [gkey UTF8String];       const void *vinitVec = (const void *) [gIv UTF8String];       ccStatus = CCCrypt(kCCEncrypt,                          kCCAlgorithm3DES,                          kCCOptionPKCS7Padding,                          vkey,                          kCCKeySize3DES,                          vinitVec,                          vplainText,                          plainTextBufferSize,                          (void *)bufferPtr,                          bufferPtrSize,                          &movedBytes);       NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];       NSString *result = [GTMBase64 stringByEncodingData:myData];       return result;  }  // 解密方法  + (NSString*)decrypt:(NSString*)encryptText {       NSData *encryptData = [GTMBase64 decodeData:[encryptText dataUsingEncoding:NSUTF8StringEncoding]];       size_t plainTextBufferSize = [encryptData length];       const void *vplainText = [encryptData bytes];       CCCryptorStatus ccStatus;       uint8_t *bufferPtr = NULL;       size_t bufferPtrSize = 0;       size_t movedBytes = 0;       bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);       bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));       memset((void *)bufferPtr, 0x0, bufferPtrSize);          const void *vkey = (const void *) [gkey UTF8String];       const void *vinitVec = (const void *) [gIv UTF8String];       ccStatus = CCCrypt(kCCDecrypt,                          kCCAlgorithm3DES,                          kCCOptionPKCS7Padding,                          vkey,                          kCCKeySize3DES,                          vinitVec,                          vplainText,                          plainTextBufferSize,                          (void *)bufferPtr,                          bufferPtrSize,                          &movedBytes);       NSString *result = [[[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)bufferPtr                                    length:(NSUInteger)movedBytes] encoding:NSUTF8StringEncoding] autorelease];       return result;  }  @end

转自:http://www.open-open.com/code/view/1437384095506

原创粉丝点击