PHP、JAVA、C#、Object-C 通用的DES加密

jopen 8年前

PHP:

class JoDES {         private static $_instance = NULL;      /**       * @return JoDES       */      public static function share() {          if (is_null(self::$_instance)) {              self::$_instance = new JoDES();          }          return self::$_instance;      }         /**       * 加密       * @param string $str 要处理的字符串       * @param string $key 加密Key,为8个字节长度       * @return string       */      public function encode($str, $key) {          $size = mcrypt_get_block_size(MCRYPT_DES, MCRYPT_MODE_CBC);          $str = $this->pkcs5Pad($str, $size);          $aaa = mcrypt_cbc(MCRYPT_DES, $key, $str, MCRYPT_ENCRYPT, $key);          $ret = base64_encode($aaa);          return $ret;      }         /**       * 解密       * @param string $str 要处理的字符串       * @param string $key 解密Key,为8个字节长度       * @return string       */      public function decode($str, $key) {          $strBin = base64_decode($str);          $str = mcrypt_cbc(MCRYPT_DES, $key, $strBin, MCRYPT_DECRYPT, $key);          $str = $this->pkcs5Unpad($str);          return $str;      }         function hex2bin($hexData) {          $binData = "";          for ($i = 0; $i < strlen($hexData); $i += 2) {              $binData .= chr(hexdec(substr($hexData, $i, 2)));          }          return $binData;      }         function pkcs5Pad($text, $blocksize) {          $pad = $blocksize - (strlen($text) % $blocksize);          return $text . str_repeat(chr($pad), $pad);      }         function pkcs5Unpad($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);      }     }

C#

public class MyDes      {          /// <summary>          /// DES加密方法          /// </summary>          /// <param name="strPlain">明文</param>          /// <param name="strDESKey">密钥</param>          /// <param name="strDESIV">向量</param>          /// <returns>密文</returns>          public static string Encode(string source, string _DESKey)          {              StringBuilder sb = new StringBuilder();              using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())              {                  byte[] key = ASCIIEncoding.ASCII.GetBytes(_DESKey);                  byte[] iv = ASCIIEncoding.ASCII.GetBytes(_DESKey);                  byte[] dataByteArray = Encoding.UTF8.GetBytes(source);                  des.Mode = System.Security.Cryptography.CipherMode.CBC;                  des.Key = key;                  des.IV = iv;                  string encrypt = "";                  using (MemoryStream ms = new MemoryStream())                  using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))                  {                      cs.Write(dataByteArray, 0, dataByteArray.Length);                      cs.FlushFinalBlock();                      encrypt = Convert.ToBase64String(ms.ToArray());                  }                  return encrypt;              }          }             /// <summary>          /// 进行DES解密。          /// </summary>          /// <param name="pToDecrypt">要解密的base64串</param>          /// <param name="sKey">密钥,且必须为8位。</param>          /// <returns>已解密的字符串。</returns>          public static string Decode(string source, string sKey)          {              byte[] inputByteArray = System.Convert.FromBase64String(source);//Encoding.UTF8.GetBytes(source);              using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())              {                  des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);                  des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);                  System.IO.MemoryStream ms = new System.IO.MemoryStream();                  using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))                  {                      cs.Write(inputByteArray, 0, inputByteArray.Length);                      cs.FlushFinalBlock();                      cs.Close();                  }                  string str = Encoding.UTF8.GetString(ms.ToArray());                  ms.Close();                  return str;              }          }      }

Object-C

/***  JoDes.h ***/     #import <Foundation/Foundation.h>  #import <CommonCrypto/CommonDigest.h>  #import <CommonCrypto/CommonCryptor.h>     @interface JoDes : NSObject     + (NSString *) encode:(NSString *)str key:(NSString *)key;  + (NSString *) decode:(NSString *)str key:(NSString *)key;     @end        /***  JoDes.m ***/  //  //  XLEncrytHelper.m  //  NewHoldGold  //  //  Created by 梁鑫磊 on 13-12-27.  //  Copyright (c) 2013年 zsgjs. All rights reserved.  //     #import "JoDes.h"     @interface JoDes()     + (NSString *) encodeBase64WithString:(NSString *)strData;  + (NSString *) encodeBase64WithData:(NSData *)objData;  + (NSData *) decodeBase64WithString:(NSString *)strBase64;     + (NSString *)doCipher:(NSString *)sTextIn key:(NSString *)sKey                    context:(CCOperation)encryptOrDecrypt;     @end     @implementation JoDes     + (NSString *) encode:(NSString *)str key:(NSString *)key  {      // doCipher 不能编汉字,所以要进行 url encode      NSMutableString* str1 = [JoDes urlEncode:str];      NSMutableString* encode = [NSMutableString stringWithString:[JoDes doCipher:str1 key:key context:kCCEncrypt]];      [JoDes formatSpecialCharacters:encode];      return encode;  }     + (NSString *) decode:(NSString *)str key:(NSString *)key  {      NSMutableString *str1 = [NSMutableString stringWithString:str];      [JoDes reformatSpecialCharacters:str1];      NSString *rt = [JoDes doCipher:str1 key:key context:kCCDecrypt];      return rt;  }     + (NSMutableString *)urlEncode:(NSString*)str  {      NSMutableString* encodeStr = [NSMutableString stringWithString:[str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];      [encodeStr replaceOccurrencesOfString:@"+" withString:@"%2B" options:NSWidthInsensitiveSearch range:NSMakeRange(0, [encodeStr length])];      [encodeStr replaceOccurrencesOfString:@"/" withString:@"%2F" options:NSWidthInsensitiveSearch range:NSMakeRange(0, [encodeStr length])];      return encodeStr;  }     + (void)formatSpecialCharacters:(NSMutableString *)str  {      [str replaceOccurrencesOfString:@"+" withString:@"$$" options:NSWidthInsensitiveSearch range:NSMakeRange(0, [str length])];      [str replaceOccurrencesOfString:@"/" withString:@"@@" options:NSWidthInsensitiveSearch range:NSMakeRange(0, [str length])];  }        + (void)reformatSpecialCharacters:(NSMutableString *)str  {      [str replaceOccurrencesOfString:@"$$" withString:@"+" options:NSWidthInsensitiveSearch range:NSMakeRange(0, [str length])];      [str replaceOccurrencesOfString:@"@@" withString:@"/" options:NSWidthInsensitiveSearch range:NSMakeRange(0, [str length])];  }     + (NSString *)encodeBase64WithString:(NSString *)strData {      return [JoDes encodeBase64WithData:[strData dataUsingEncoding:NSUTF8StringEncoding]];  }        + (NSString *)encodeBase64WithData:(NSData *)objData {      NSString *encoding = nil;      unsigned char *encodingBytes = NULL;      @try {          static char encodingTable[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";          static NSUInteger paddingTable[] = {0,2,1};                     NSUInteger dataLength = [objData length];          NSUInteger encodedBlocks = (dataLength * 8) / 24;          NSUInteger padding = paddingTable[dataLength % 3];          if( padding > 0 ) encodedBlocks++;          NSUInteger encodedLength = encodedBlocks * 4;                     encodingBytes = malloc(encodedLength);          if( encodingBytes != NULL ) {              NSUInteger rawBytesToProcess = dataLength;              NSUInteger rawBaseIndex = 0;              NSUInteger encodingBaseIndex = 0;              unsigned char *rawBytes = (unsigned char *)[objData bytes];              unsigned char rawByte1, rawByte2, rawByte3;              while( rawBytesToProcess >= 3 ) {                  rawByte1 = rawBytes[rawBaseIndex];                  rawByte2 = rawBytes[rawBaseIndex+1];                  rawByte3 = rawBytes[rawBaseIndex+2];                  encodingBytes[encodingBaseIndex] = encodingTable[((rawByte1 >> 2) & 0x3F)];                  encodingBytes[encodingBaseIndex+1] = encodingTable[((rawByte1 << 4) & 0x30) | ((rawByte2 >> 4) & 0x0F) ];                  encodingBytes[encodingBaseIndex+2] = encodingTable[((rawByte2 << 2) & 0x3C) | ((rawByte3 >> 6) & 0x03) ];                  encodingBytes[encodingBaseIndex+3] = encodingTable[(rawByte3 & 0x3F)];                                     rawBaseIndex += 3;                  encodingBaseIndex += 4;                  rawBytesToProcess -= 3;              }              rawByte2 = 0;              switch (dataLength-rawBaseIndex) {                  case 2:                      rawByte2 = rawBytes[rawBaseIndex+1];                  case 1:                      rawByte1 = rawBytes[rawBaseIndex];                      encodingBytes[encodingBaseIndex] = encodingTable[((rawByte1 >> 2) & 0x3F)];                      encodingBytes[encodingBaseIndex+1] = encodingTable[((rawByte1 << 4) & 0x30) | ((rawByte2 >> 4) & 0x0F) ];                      encodingBytes[encodingBaseIndex+2] = encodingTable[((rawByte2 << 2) & 0x3C) ];                      // we can skip rawByte3 since we have a partial block it would always be 0                      break;              }              // compute location from where to begin inserting padding, it may overwrite some bytes from the partial block encoding              // if their value was 0 (cases 1-2).              encodingBaseIndex = encodedLength - padding;              while( padding-- > 0 ) {                  encodingBytes[encodingBaseIndex++] = '=';              }              encoding = [[NSString alloc] initWithBytes:encodingBytes length:encodedLength encoding:NSASCIIStringEncoding];          }      }      @catch (NSException *exception) {          encoding = nil;          NSLog(@"WARNING: error occured while tring to encode base 32 data: %@", exception);      }      @finally {          if( encodingBytes != NULL ) {              free( encodingBytes );          }      }      return encoding;         }     + (NSData *)decodeBase64WithString:(NSString *)strBase64 {      NSData *data = nil;      unsigned char *decodedBytes = NULL;      @try {  #define __ 255          static char decodingTable[256] = {              __,__,__,__, __,__,__,__, __,__,__,__, __,__,__,__,  // 0x00 - 0x0F              __,__,__,__, __,__,__,__, __,__,__,__, __,__,__,__,  // 0x10 - 0x1F              __,__,__,__, __,__,__,__, __,__,__,62, __,__,__,63,  // 0x20 - 0x2F              52,53,54,55, 56,57,58,59, 60,61,__,__, __, 0,__,__,  // 0x30 - 0x3F              __, 0, 1, 2,  3, 4, 5, 6,  7, 8, 9,10, 11,12,13,14,  // 0x40 - 0x4F              15,16,17,18, 19,20,21,22, 23,24,25,__, __,__,__,__,  // 0x50 - 0x5F              __,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,  // 0x60 - 0x6F              41,42,43,44, 45,46,47,48, 49,50,51,__, __,__,__,__,  // 0x70 - 0x7F              __,__,__,__, __,__,__,__, __,__,__,__, __,__,__,__,  // 0x80 - 0x8F              __,__,__,__, __,__,__,__, __,__,__,__, __,__,__,__,  // 0x90 - 0x9F              __,__,__,__, __,__,__,__, __,__,__,__, __,__,__,__,  // 0xA0 - 0xAF              __,__,__,__, __,__,__,__, __,__,__,__, __,__,__,__,  // 0xB0 - 0xBF              __,__,__,__, __,__,__,__, __,__,__,__, __,__,__,__,  // 0xC0 - 0xCF              __,__,__,__, __,__,__,__, __,__,__,__, __,__,__,__,  // 0xD0 - 0xDF              __,__,__,__, __,__,__,__, __,__,__,__, __,__,__,__,  // 0xE0 - 0xEF              __,__,__,__, __,__,__,__, __,__,__,__, __,__,__,__,  // 0xF0 - 0xFF          };          strBase64 = [strBase64 stringByReplacingOccurrencesOfString:@"=" withString:@""];          NSData *encodedData = [strBase64 dataUsingEncoding:NSASCIIStringEncoding];          unsigned char *encodedBytes = (unsigned char *)[encodedData bytes];                     NSUInteger encodedLength = [encodedData length];          NSUInteger encodedBlocks = (encodedLength+3) >> 2;          NSUInteger expectedDataLength = encodedBlocks * 3;                     unsigned char decodingBlock[4];                     decodedBytes = malloc(expectedDataLength);          if( decodedBytes != NULL ) {                             NSUInteger i = 0;              NSUInteger j = 0;              NSUInteger k = 0;              unsigned char c;              while( i < encodedLength ) {                  c = decodingTable[encodedBytes[i]];                  i++;                  if( c != __ ) {                      decodingBlock[j] = c;                      j++;                      if( j == 4 ) {                          decodedBytes[k] = (decodingBlock[0] << 2) | (decodingBlock[1] >> 4);                          decodedBytes[k+1] = (decodingBlock[1] << 4) | (decodingBlock[2] >> 2);                          decodedBytes[k+2] = (decodingBlock[2] << 6) | (decodingBlock[3]);                          j = 0;                          k += 3;                      }                  }              }                             // Process left over bytes, if any              if( j == 3 ) {                  decodedBytes[k] = (decodingBlock[0] << 2) | (decodingBlock[1] >> 4);                  decodedBytes[k+1] = (decodingBlock[1] << 4) | (decodingBlock[2] >> 2);                  k += 2;              } else if( j == 2 ) {                  decodedBytes[k] = (decodingBlock[0] << 2) | (decodingBlock[1] >> 4);                  k += 1;              }              data = [[NSData alloc] initWithBytes:decodedBytes length:k];          }      }      @catch (NSException *exception) {          data = nil;          NSLog(@"WARNING: error occured while decoding base 32 string: %@", exception);      }      @finally {          if( decodedBytes != NULL ) {              free( decodedBytes );          }      }      return data;         }        + (NSString *)doCipher:(NSString *)sTextIn key:(NSString *)sKey                    context:(CCOperation)encryptOrDecrypt {      NSStringEncoding EnC = NSUTF8StringEncoding;             NSMutableData *dTextIn;      if (encryptOrDecrypt == kCCDecrypt) {          dTextIn = [[JoDes decodeBase64WithString:sTextIn] mutableCopy];      }      else{          dTextIn = [[sTextIn dataUsingEncoding: EnC] mutableCopy];      }      NSMutableData * dKey = [[sKey dataUsingEncoding:EnC] mutableCopy];      [dKey setLength:kCCBlockSizeDES];      uint8_t *bufferPtr1 = NULL;      size_t bufferPtrSize1 = 0;      size_t movedBytes1 = 0;      //uint8_t iv[kCCBlockSizeDES];      //memset((void *) iv, 0x0, (size_t) sizeof(iv));      //    Byte iv[] = {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF};      bufferPtrSize1 = ([sTextIn length] + kCCKeySizeDES) & ~(kCCKeySizeDES -1);      bufferPtr1 = malloc(bufferPtrSize1 * sizeof(uint8_t));      memset((void *)bufferPtr1, 0x00, bufferPtrSize1);             CCCrypt(encryptOrDecrypt, // CCOperation op              kCCAlgorithmDES, // CCAlgorithm alg              kCCOptionPKCS7Padding, // CCOptions options              [dKey bytes], // const void *key              [dKey length], // size_t keyLength //              [dKey bytes], // const void *iv              [dTextIn bytes], // const void *dataIn              [dTextIn length],  // size_t dataInLength              (void *)bufferPtr1, // void *dataOut              bufferPtrSize1,     // size_t dataOutAvailable              &movedBytes1);             //[dTextIn release];      //[dKey release];             NSString * sResult;      if (encryptOrDecrypt == kCCDecrypt){          sResult = [[NSString alloc] initWithData:[NSData dataWithBytes:bufferPtr1 length:movedBytes1] encoding:EnC];          free(bufferPtr1);      }      else {          NSData *dResult = [NSData dataWithBytes:bufferPtr1 length:movedBytes1];          free(bufferPtr1);          sResult = [JoDes encodeBase64WithData:dResult];      }      return sResult;  }           @end

JAVA

package com.example.aric.test;     import javax.crypto.Cipher;  import javax.crypto.SecretKey;  import javax.crypto.SecretKeyFactory;  import javax.crypto.spec.DESKeySpec;  import javax.crypto.spec.IvParameterSpec;     import android.util.Base64;     public class DES {         public final static String DES_KEY_STRING = "ABSujsuu";             public static String encrypt(String message, String key) throws Exception {          Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");             DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));             SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");          SecretKey secretKey = keyFactory.generateSecret(desKeySpec);          IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));          cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);             return encodeBase64(cipher.doFinal(message.getBytes("UTF-8")));      }         public static String decrypt(String message, String key) throws Exception {             byte[] bytesrc = decodeBase64(message);//convertHexString(message);          Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");          DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));          SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");          SecretKey secretKey = keyFactory.generateSecret(desKeySpec);          IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));             cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);             byte[] retByte = cipher.doFinal(bytesrc);          return new String(retByte);      }         public static byte[] convertHexString(String ss) {          byte digest[] = new byte[ss.length() / 2];          for (int i = 0; i < digest.length; i++) {              String byteString = ss.substring(2 * i, 2 * i + 2);              int byteValue = Integer.parseInt(byteString, 16);              digest[i] = (byte) byteValue;          }             return digest;      }         public static String toHexString(byte b[]) {          StringBuffer hexString = new StringBuffer();          for (int i = 0; i < b.length; i++) {              String plainText = Integer.toHexString(0xff & b[i]);              if (plainText.length() < 2)                  plainText = "0" + plainText;              hexString.append(plainText);          }             return hexString.toString();      }                public static String encodeBase64(byte[] b) {          return Base64.encodeToString(b, Base64.DEFAULT);      }             public static byte[] decodeBase64(String base64String) {          return Base64.decode(base64String, Base64.DEFAULT);      }  }

引用:http://www.cnblogs.com/pengxl/p/3967040.html

来自: http://www.cnblogs.com/pengxl/p/3967040.html