android IOS java使用DES统一加密策略

来源:互联网 发布:淘宝招聘客服 编辑:程序博客网 时间:2024/06/01 16:05

话不多说,直接上代码,亲测有效。

android&java代码:

import java.security.Key;import javax.crypto.Cipher;import javax.crypto.SecretKeyFactory;import javax.crypto.spec.DESedeKeySpec;import javax.crypto.spec.IvParameterSpec; /** * DES加密工具类 */public class JMDESUtil {       // 密钥 长度不得小于24       private final static String secretKey = "aDFrAffxAGCRtdrDxvFvbhEvg" ;       // 向量 可有可无 终端后台也要约定       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 JMBase64. 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(JMBase64. decode(encryptText ));              return new String( decryptData, encoding);      }             public static void main(String args[]) throws Exception{            String str = "123456789" ;            System. out.println( "----加密前-----:" + str );            String encodeStr = JMDESUtil. encode( str);            System. out.println( "----加密后-----:" + encodeStr );            System. out.println( "----解密后-----:" + JMDESUtil.decode( encodeStr));      }}
这里用到了JMBase64方法,代码如下:

import java.io.ByteArrayOutputStream;  import java.io.IOException;  import java.io.OutputStream;          /**   * Base64编码工具类   *    * @author JM    * @date 2017-04-11   */ public class JMBase64 {       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 ;           }       }  } 


IOS代码:

////  DES3EncryptUtil.h//  BigDataAPP////  Created by JM on 17/4/11.//  Copyright © 2017年 GDYS. All rights reserved.//#import <Foundation/Foundation.h>@interface DES3EncryptUtil : NSObject// 加密方法+ (NSString*)encrypt:(NSString*)plainText;// 解密方法+ (NSString*)decrypt:(NSString*)encryptText;@end

////  DES3EncryptUtil.m//  BigDataAPP////  Created by JM on 17/4/11.//  Copyright © 2017年 GDYS. All rights reserved.//#import <Foundation/Foundation.h>#import <CommonCrypto/CommonCryptor.h>#import "MyBase64.h"//秘钥#define gkey            @"aDFrAffxAGCRtdrDxvFvbhEvg"//向量#define gIv             @"01234567"@implementation DES3EncryptUtil : NSObject// 加密方法+ (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 = [MyBase64 base64EncodedStringFrom:myData];    return result;}// 解密方法+ (NSString*)decrypt:(NSString*)encryptText {    NSData *encryptData = [MyBase64 dataWithBase64EncodedString:encryptText];    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] ;    return result;}@end

////  MyBase64.h//  BigDataAPP////  Created by JM on 17/4/11.//  Copyright © 2017年 GDYS. All rights reserved.//#import <Foundation/Foundation.h>#define __BASE64( text )        [CommonFunc base64StringFromText:text]#define __TEXT( base64 )        [CommonFunc textFromBase64String:base64]@interface MyBase64 : NSObject/****************************************************************************** 函数名称 : + (NSString *)base64StringFromText:(NSString *)text 函数描述 : 将文本转换为base64格式字符串 输入参数 : (NSString *)text    文本 输出参数 : N/A 返回参数 : (NSString *)    base64格式字符串 备注信息 : ******************************************************************************/+ (NSString *)base64StringFromText:(NSString *)text;/****************************************************************************** 函数名称 : + (NSString *)base64StringFromText:(NSString *)text 函数描述 : 将文本转换为base64格式字符串 输入参数 : (NSString *)text    文本 输出参数 : N/A 返回参数 : (NSString *)    base64格式字符串 备注信息 : ******************************************************************************/+ (NSString *)base64EncodedStringFrom:(NSData *)data;/****************************************************************************** 函数名称 : + (NSString *)textFromBase64String:(NSString *)base64 函数描述 : 将base64格式字符串转换为文本 输入参数 : (NSString *)base64  base64格式字符串 输出参数 : N/A 返回参数 : (NSString *)    文本 备注信息 : ******************************************************************************/+ (NSString *)textFromBase64String:(NSString *)base64;/****************************************************************************** 函数名称 : + (NSString *)textFromBase64String:(NSString *)base64 函数描述 : 将base64格式字符串转换为文本 输入参数 : (NSString *)base64  base64格式字符串 输出参数 : N/A 返回参数 : (NSString *)    文本 备注信息 : ******************************************************************************/+ (NSData *)dataWithBase64EncodedString:(NSString *)string;@end

////  MyBase64.m//  BigDataAPP////  Created by JM on 17/4/11.//  Copyright © 2017年 GDYS. All rights reserved.//#import "MyBase64.h"//引入IOS自带密码库#import <CommonCrypto/CommonCryptor.h>//空字符串#define LocalStr_None   @""static const char encodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";@implementation MyBase64 : NSObject+ (NSString *)base64StringFromText:(NSString *)text{    if (text && ![text isEqualToString:LocalStr_None]) {        //取项目的bundleIdentifier作为KEY  改动了此处        //NSString *key = [[NSBundle mainBundle] bundleIdentifier];        NSData *data = [text dataUsingEncoding:NSUTF8StringEncoding];        //IOS 自带DES加密 Begin  改动了此处        //data = [self DESEncrypt:data WithKey:key];        //IOS 自带DES加密 End        return [self base64EncodedStringFrom:data];    }    else {        return LocalStr_None;    }}+ (NSString *)textFromBase64String:(NSString *)base64{    if (base64 && ![base64 isEqualToString:LocalStr_None]) {        //取项目的bundleIdentifier作为KEY   改动了此处        //NSString *key = [[NSBundle mainBundle] bundleIdentifier];        NSData *data = [self dataWithBase64EncodedString:base64];        //IOS 自带DES解密 Begin    改动了此处        //data = [self DESDecrypt:data WithKey:key];        //IOS 自带DES加密 End        return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];    }    else {        return LocalStr_None;    }}/****************************************************************************** 函数名称 : + (NSData *)DESEncrypt:(NSData *)data WithKey:(NSString *)key 函数描述 : 文本数据进行DES加密 输入参数 : (NSData *)data (NSString *)key 输出参数 : N/A 返回参数 : (NSData *) 备注信息 : 此函数不可用于过长文本 ******************************************************************************/+ (NSData *)DESEncrypt:(NSData *)data WithKey:(NSString *)key{    char keyPtr[kCCKeySizeAES256+1];    bzero(keyPtr, sizeof(keyPtr));        [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];        NSUInteger dataLength = [data length];        size_t bufferSize = dataLength + kCCBlockSizeAES128;    void *buffer = malloc(bufferSize);        size_t numBytesEncrypted = 0;    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,                                          kCCOptionPKCS7Padding | kCCOptionECBMode,                                          keyPtr, kCCBlockSizeDES,                                          NULL,                                          [data bytes], dataLength,                                          buffer, bufferSize,                                          &numBytesEncrypted);    if (cryptStatus == kCCSuccess) {        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];    }        free(buffer);    return nil;}/****************************************************************************** 函数名称 : + (NSData *)DESEncrypt:(NSData *)data WithKey:(NSString *)key 函数描述 : 文本数据进行DES解密 输入参数 : (NSData *)data (NSString *)key 输出参数 : N/A 返回参数 : (NSData *) 备注信息 : 此函数不可用于过长文本 ******************************************************************************/+ (NSData *)DESDecrypt:(NSData *)data WithKey:(NSString *)key{    char keyPtr[kCCKeySizeAES256+1];    bzero(keyPtr, sizeof(keyPtr));        [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];        NSUInteger dataLength = [data length];        size_t bufferSize = dataLength + kCCBlockSizeAES128;    void *buffer = malloc(bufferSize);        size_t numBytesDecrypted = 0;    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmDES,                                          kCCOptionPKCS7Padding | kCCOptionECBMode,                                          keyPtr, kCCBlockSizeDES,                                          NULL,                                          [data bytes], dataLength,                                          buffer, bufferSize,                                          &numBytesDecrypted);        if (cryptStatus == kCCSuccess) {        return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];    }        free(buffer);    return nil;}/****************************************************************************** 函数名称 : + (NSData *)dataWithBase64EncodedString:(NSString *)string 函数描述 : base64格式字符串转换为文本数据 输入参数 : (NSString *)string 输出参数 : N/A 返回参数 : (NSData *) 备注信息 : ******************************************************************************/+ (NSData *)dataWithBase64EncodedString:(NSString *)string{    if (string == nil)        [NSException raise:NSInvalidArgumentException format:nil];    if ([string length] == 0)        return [NSData data];        static char *decodingTable = NULL;    if (decodingTable == NULL)    {        decodingTable = malloc(256);        if (decodingTable == NULL)            return nil;        memset(decodingTable, CHAR_MAX, 256);        NSUInteger i;        for (i = 0; i < 64; i++)            decodingTable[(short)encodingTable[i]] = i;    }        const char *characters = [string cStringUsingEncoding:NSASCIIStringEncoding];    if (characters == NULL)     //  Not an ASCII string!        return nil;    char *bytes = malloc((([string length] + 3) / 4) * 3);    if (bytes == NULL)        return nil;    NSUInteger length = 0;        NSUInteger i = 0;    while (YES)    {        char buffer[4];        short bufferLength;        for (bufferLength = 0; bufferLength < 4; i++)        {            if (characters[i] == '\0')                break;            if (isspace(characters[i]) || characters[i] == '=')                continue;            buffer[bufferLength] = decodingTable[(short)characters[i]];            if (buffer[bufferLength++] == CHAR_MAX)      //  Illegal character!            {                free(bytes);                return nil;            }        }                if (bufferLength == 0)            break;        if (bufferLength == 1)      //  At least two characters are needed to produce one byte!        {            free(bytes);            return nil;        }                //  Decode the characters in the buffer to bytes.        bytes[length++] = (buffer[0] << 2) | (buffer[1] >> 4);        if (bufferLength > 2)            bytes[length++] = (buffer[1] << 4) | (buffer[2] >> 2);        if (bufferLength > 3)            bytes[length++] = (buffer[2] << 6) | buffer[3];    }        bytes = realloc(bytes, length);    return [NSData dataWithBytesNoCopy:bytes length:length];}/****************************************************************************** 函数名称 : + (NSString *)base64EncodedStringFrom:(NSData *)data 函数描述 : 文本数据转换为base64格式字符串 输入参数 : (NSData *)data 输出参数 : N/A 返回参数 : (NSString *) 备注信息 : ******************************************************************************/+ (NSString *)base64EncodedStringFrom:(NSData *)data{    if ([data length] == 0)        return @"";        char *characters = malloc((([data length] + 2) / 3) * 4);    if (characters == NULL)        return nil;    NSUInteger length = 0;        NSUInteger i = 0;    while (i < [data length])    {        char buffer[3] = {0,0,0};        short bufferLength = 0;        while (bufferLength < 3 && i < [data length])            buffer[bufferLength++] = ((char *)[data bytes])[i++];                //  Encode the bytes in the buffer to four characters, including padding "=" characters if necessary.        characters[length++] = encodingTable[(buffer[0] & 0xFC) >> 2];        characters[length++] = encodingTable[((buffer[0] & 0x03) << 4) | ((buffer[1] & 0xF0) >> 4)];        if (bufferLength > 1)            characters[length++] = encodingTable[((buffer[1] & 0x0F) << 2) | ((buffer[2] & 0xC0) >> 6)];        else characters[length++] = '=';        if (bufferLength > 2)            characters[length++] = encodingTable[buffer[2] & 0x3F];        else characters[length++] = '=';    }        return [[NSString alloc] initWithBytesNoCopy:characters length:length encoding:NSASCIIStringEncoding freeWhenDone:YES];}@end




0 0
原创粉丝点击