找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 867|回复: 0
打印 上一主题 下一主题

php、java、android、ios通用的3des方法(推荐)

[复制链接]

2536

主题

2536

帖子

7532

积分

论坛元老

Rank: 8Rank: 8

积分
7532
跳转到指定楼层
楼主
发表于 2018-2-14 05:33:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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://jb51.net的博客") . "\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 > 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) & 0x0ff ) > 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) & 0x0ff ) > 18 ) & 63 ]);
               buf.append(legalChars[(d >> 12 ) & 63 ]);
               buf.append( "==" );
             }
            
             return buf.toString();
           }
            
           private static int decode( char c) {
             if (c >= 'A' && c = 'a' && c = '0' && c > 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://jb51.net的博客";
           String encryptText = DES3.encode(plainText);
           System.out.println(encryptText);
           System.out.println(DES3.decode(encryptText));
           
   }
}
Ojbective-C(ios)

//
// DES3Util.h
//
#import  
@interface DES3Util : NSObject {
}
// 加密方法
+ (NSString*)encryptNSString*)plainText;
// 解密方法
+ (NSString*)decryptNSString*)encryptText;
@end
//
// DES3Util.m
//
   
#import "DES3Util.h"
#import  
#import "GTMBase64.h"
#define gkey      @"my.oschina.net/penngo?#@"
#define gIv       @"01234567"
   
@implementation DES3Util
// 加密方法
+ (NSString*)encryptNSString*)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 dataWithBytesconst void *)bufferPtr lengthNSUInteger)movedBytes];
   NSString *result = [GTMBase64 stringByEncodingData:myData];
   return result;
}
   
// 解密方法
+ (NSString*)decryptNSString*)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 dataWithBytesconst void *)bufferPtr  
                 lengthNSUInteger)movedBytes] encoding:NSUTF8StringEncoding] autorelease];
   return result;
}
   
@end
//
// GTMBase64.h
//
// Copyright 2006-2008 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
// David Lee make changes:
// Remove dependency on GTMDefines.h
// add some string to string function
#import
// GTMBase64
//
/// Helper for handling Base64 and WebSafeBase64 encodings
//
/// The webSafe methods use different character set and also the results aren't
/// always padded to a multiple of 4 characters. This is done so the resulting
/// data can be used in urls and url query arguments without needing any
/// encoding. You must use the webSafe* methods together, the data does not
/// interop with the RFC methods.
//
@interface GTMBase64 : NSObject
//
// Standard Base64 (RFC) handling
//
// encodeData:
//
/// Base64 encodes contents of the NSData object.
//
/// Returns:
///  A new autoreleased NSData with the encoded payload. nil for any error.
//
+(NSData *)encodeDataNSData *)data;
// decodeData:
//
/// Base64 decodes contents of the NSData object.
//
/// Returns:
///  A new autoreleased NSData with the decoded payload. nil for any error.
//
+(NSData *)decodeDataNSData *)data;
// encodeBytes:length:
//
/// Base64 encodes the data pointed at by |bytes|.
//
/// Returns:
///  A new autoreleased NSData with the encoded payload. nil for any error.
//
+(NSData *)encodeBytes:(const void *)bytes length:(NSUInteger)length;
// decodeBytes:length:
//
/// Base64 decodes the data pointed at by |bytes|.
//
/// Returns:
///  A new autoreleased NSData with the encoded payload. nil for any error.
//
+(NSData *)decodeBytes:(const void *)bytes length:(NSUInteger)length;
// stringByEncodingData:
//
/// Base64 encodes contents of the NSData object.
//
/// Returns:
///  A new autoreleased NSString with the encoded payload. nil for any error.
//
+(NSString *)stringByEncodingData:(NSData *)data;
// stringByEncodingBytes:length:
//
/// Base64 encodes the data pointed at by |bytes|.
//
/// Returns:
///  A new autoreleased NSString with the encoded payload. nil for any error.
//
+(NSString *)stringByEncodingBytes:(const void *)bytes length:(NSUInteger)length;
// decodeString:
//
/// Base64 decodes contents of the NSString.
//
/// Returns:
///  A new autoreleased NSData with the decoded payload. nil for any error.
//
+(NSData *)decodeString:(NSString *)string;
//
// Modified Base64 encoding so the results can go onto urls.
//
// The changes are in the characters generated and also allows the result to
// not be padded to a multiple of 4.
// Must use the matching call to encode/decode, won't interop with the
// RFC versions.
//
// webSafeEncodeData:padded:
//
/// WebSafe Base64 encodes contents of the NSData object. If |padded| is YES
/// then padding characters are added so the result length is a multiple of 4.
//
/// Returns:
///  A new autoreleased NSData with the encoded payload. nil for any error.
//
+(NSData *)webSafeEncodeData:(NSData *)data
           padded:(BOOL)padded;
// webSafeDecodeData:
//
/// WebSafe Base64 decodes contents of the NSData object.
//
/// Returns:
///  A new autoreleased NSData with the decoded payload. nil for any error.
//
+(NSData *)webSafeDecodeData:(NSData *)data;
// webSafeEncodeBytes:length:padded:
//
/// WebSafe Base64 encodes the data pointed at by |bytes|. If |padded| is YES
/// then padding characters are added so the result length is a multiple of 4.
//
/// Returns:
///  A new autoreleased NSData with the encoded payload. nil for any error.
//
+(NSData *)webSafeEncodeBytes:(const void *)bytes
            length:(NSUInteger)length
            padded:(BOOL)padded;
// webSafeDecodeBytes:length:
//
/// WebSafe Base64 decodes the data pointed at by |bytes|.
//
/// Returns:
///  A new autoreleased NSData with the encoded payload. nil for any error.
//
+(NSData *)webSafeDecodeBytes:(const void *)bytes length:(NSUInteger)length;
// stringByWebSafeEncodingData:padded:
//
/// WebSafe Base64 encodes contents of the NSData object. If |padded| is YES
/// then padding characters are added so the result length is a multiple of 4.
//
/// Returns:
///  A new autoreleased NSString with the encoded payload. nil for any error.
//
+(NSString *)stringByWebSafeEncodingData:(NSData *)data
                 padded:(BOOL)padded;
// stringByWebSafeEncodingBytes:length:padded:
//
/// WebSafe Base64 encodes the data pointed at by |bytes|. If |padded| is YES
/// then padding characters are added so the result length is a multiple of 4.
//
/// Returns:
///  A new autoreleased NSString with the encoded payload. nil for any error.
//
+(NSString *)stringByWebSafeEncodingBytes:(const void *)bytes
                  length:(NSUInteger)length
                  padded:(BOOL)padded;
// webSafeDecodeString:
//
/// WebSafe Base64 decodes contents of the NSString.
//
/// Returns:
///  A new autoreleased NSData with the decoded payload. nil for any error.
//
+(NSData *)webSafeDecodeString:(NSString *)string;
// David Lee new added function
/// Returns:
// A new autoreleased NSString with Base64 encoded NSString
+(NSString *)stringByBase64String:(NSString *)base64String;
// David Lee new added function
/// Returns:
// A new autoreleased Base64 encoded NSString with NSString
+(NSString *)base64StringBystring:(NSString *)string;
@end
//
// GTMBase64.m
//
// Copyright 2006-2008 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
// David Lee make changes:
// Remove dependency on GTMDefines.h
// add some string to string function
#import "GTMBase64.h"
static const char *kBase64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
static const char *kWebSafeBase64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
static const char kBase64PaddingChar = '=';
static const char kBase64InvalidChar = 99;
static const char kBase64DecodeChars[] = {
  // This array was generated by the following code:
  // #include
  // #include
  // #include
  // main()
  // {
  //  static const char Base64[] =
  //   "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  //  char *pos;
  //  int idx, i, j;
  //  printf("  ");
  //  for (i = 0; i
  // #include
  // #include
  // main()
  // {
  //  static const char Base64[] =
  //   "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
  //  char *pos;
  //  int idx, i, j;
  //  printf("  ");
  //  for (i = 0; i  2) {
    // space?
    NSAssert(destLen >= 4, @"our calc for encoded length was wrong");
    curDest[0] = charset[curSrc[0] >> 2];
    curDest[1] = charset[((curSrc[0] & 0x03) > 4)];
    curDest[2] = charset[((curSrc[1] & 0x0f) > 6)];
    curDest[3] = charset[curSrc[2] & 0x3f];
   
    curDest += 4;
    curSrc += 3;
    srcLen -= 3;
    destLen -= 4;
  }
  
  // now deal with the tail (= 2, @"our calc for encoded length was wrong");
      curDest[0] = charset[curSrc[0] >> 2];
      curDest[1] = charset[(curSrc[0] & 0x03) = 2, @"our calc for encoded length was wrong");
        curDest[0] = kBase64PaddingChar;
        curDest[1] = kBase64PaddingChar;
        curDest += 2;
      }
      break;
    case 2:
      // Two bytes left: this encodes to three characters, and (optionally)
      // one pad character to round out the four-character cypherblock.
      NSAssert(destLen >= 3, @"our calc for encoded length was wrong");
      curDest[0] = charset[curSrc[0] >> 2];
      curDest[1] = charset[((curSrc[0] & 0x03) > 4)];
      curDest[2] = charset[(curSrc[1] & 0x0f) = 1, @"our calc for encoded length was wrong");
        curDest[0] = kBase64PaddingChar;
        curDest += 1;
      }
      break;
  }
  // return the length
  return (curDest - destBytes);
}
//
// baseDecode:srcLen:destBytes:destLen:charset:requirePadding:
//
// Decodes the buffer into the larger. returns the length of the decoded
// data, or zero for an error.
// |charset| is the character decoding buffer to use
//
// Returns:
//  the length of the encoded data. zero if any error.
//
+(NSUInteger)baseDecode:(const char *)srcBytes
         srcLen:(NSUInteger)srcLen
       destBytes:(char *)destBytes
        destLen:(NSUInteger)destLen
        charset:(const char *)charset
     requirePadding:(BOOL)requirePadding {
  if (!srcLen || !destLen || !srcBytes || !destBytes) {
    return 0;
  }
  
  int decode;
  NSUInteger destIndex = 0;
  int state = 0;
  char ch = 0;
  while (srcLen-- && (ch = *srcBytes++) != 0) {
    if (IsSpace(ch)) // Skip whitespace
      continue;
   
    if (ch == kBase64PaddingChar)
      break;
   
    decode = charset[(unsigned int)ch];
    if (decode == kBase64InvalidChar)
      return 0;
   
    // Four cyphertext characters decode to three bytes.
    // Therefore we can be in one of four states.
    switch (state) {
      case 0:
        // We're at the beginning of a four-character cyphertext block.
        // This sets the high six bits of the first byte of the
        // plaintext block.
        NSAssert(destIndex > 4;
        destBytes[destIndex+1] = (decode & 0x0f) > 2;
        destBytes[destIndex+1] = (decode & 0x03)  0)) {
          if (!IsSpace(ch))
            break;
        }
        if (ch != kBase64PaddingChar) {
          return 0;
        }
      }
      // state = 1 or 2, check if all remain padding is space
      while ((ch = *srcBytes++) && (srcLen-- > 0)) {
        if (!IsSpace(ch)) {
          return 0;
        }
      }
    }
  } else {
    // We ended by seeing the end of the string.
   
    if (requirePadding) {
      // If we require padding, then anything but state 0 is an error.
      if (state != 0) {
        return 0;
      }
    } else {
      // Make sure we have no partial bytes lying around. Note that we do not
      // require trailing '=', so states 2 and 3 are okay too.
      if (state == 1) {
        return 0;
      }
    }
  }
  
  // If then next piece of output was valid and got written to it means we got a
  // very carefully crafted input that appeared valid but contains some trailing
  // bits past the real length, so just toss the thing.
  if ((destIndex
以上这篇php、java、android、ios通用的3des方法(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
            
            
您可能感兴趣的文章:
  • android:descendantFocusability方法介绍
  • Android编程之Activity中onDestroy()调用分析
  • 学习Android Material Design(RecyclerView代替ListView)
  • 详解Android Material Design自定义动画的编写
  • Android App仿QQ制作Material Design风格沉浸式状态栏
  • Android程序开发之使用Design包实现QQ动画侧滑效果和滑动菜单导航
  • Android数据加密之Des加密详解
  • Android5.0中Material Design的新特性
  • Material Design系列之Behavior实现Android知乎首页
  • Android数据加密之Des加密
            
  • 分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    用户反馈
    客户端