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 ; } } }
//// 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
- android IOS java使用DES统一加密策略
- JAVA/iOS/Android/PHP 通用DES 加密
- iOS、Android、java服务端 DES+RSA安全传输统一实现
- iOS、Android、java服务端 DES+RSA安全传输统一实现
- android和java平台统一的DES加密解决方案,解决加密不一样的问题
- 【请求加密】android ios java后台通用DES base64加密
- Java/Android DES加密
- IOS、java支持DES加密
- IOS、java支持DES加密
- IOS、java支持DES加密
- php、java、android、ios通用的3des加密方法
- Android、Ios and Java 实现三重Des对称加密
- DES - Java编程: 使用DES加密/解密
- Java/Android中的DES加密
- DES加密和解密PHP,Java,ObjectC统一的方法
- 关于Des加密(Android与ios 与后台java服务器之间的加密解密
- 关于 Des加密(Android与ios 与后台java服务器之间的加密解密)
- 关于 Des加密(Android与ios 与后台java服务器之间的加密解密)
- html5标签figure、figcaption
- 使用log_format为Nginx服务器设置更详细的日志格式
- Volatile关键字的使用
- 基于Kafka 0.9版本 使用ACL进行权限控制
- Oracle之唯一性约束(UNIQUEConstraint)用法详解
- android IOS java使用DES统一加密策略
- .net 的SSH操作linux文件
- Java学习之继承
- SQLNestedException: Cannot load JDBC driver class 'oracle.jdbc.driver.Oracle ’
- CAS硬件指令
- 超详细搭建PhpStorm+PhpStudy开发环境
- 关于nested transactions not supported的问题
- Shape Number HDU
- 软件流程规范---常见安全问题