Android、iPhone和Java三个平台一致的加密工具

1import java.security.Key; 2 3import javax.crypto.Cipher; 4import javax.crypto.SecretKeyFactory; 5import javax.crypto.spec.DESedeKeySpec; 6import javax.crypto.spec.IvParameterSpec; 7 8/** 9 * 3DES加密工具类 10 * 11 * @author liufeng 12 * @date 2012-10-11 13 */ 14public class Des3 { 15 // 密钥 16 private final static String secretKey = "liuyunqiang@lx100$#365#$"; 17 // 向量 18 private final static String iv = "01234567"; 19 // 加解密统一使用的编码方式 20 private final static String encoding = "utf-8"; 21 22 /** 23 * 3DES加密 24 * 25 * @param plainText 普通文本 26 * @return 27 * @throws Exception 28 */ 29 public static String encode(String plainText) throws Exception { 30 Key deskey = null; 31 DESedeKeySpec spec = new DESedeKeySpec(secretKey.getBytes()); 32 SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede"); 33 deskey = keyfactory.generateSecret(spec); 34 35 Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding"); 36 IvParameterSpec ips = new IvParameterSpec(iv.getBytes()); 37 cipher.init(Cipher.ENCRYPT_MODE, deskey, ips); 38 byte[] encryptData = cipher.doFinal(plainText.getBytes(encoding)); 39 return Base64.encode(encryptData); 40 } 41 42 /** 43 * 3DES解密 44 * 45 * @param encryptText 加密文本 46 * @return 47 * @throws Exception 48 */ 49 public static String decode(String encryptText) throws Exception { 50 Key deskey = null; 51 DESedeKeySpec spec = new DESedeKeySpec(secretKey.getBytes()); 52 SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede"); 53 deskey = keyfactory.generateSecret(spec); 54 Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding"); 55 IvParameterSpec ips = new IvParameterSpec(iv.getBytes()); 56 cipher.init(Cipher.DECRYPT_MODE, deskey, ips); 57 58 byte[] decryptData = cipher.doFinal(Base64.decode(encryptText)); 59 60 return new String(decryptData, encoding); 61 } 62}

上面的加密工具类会使用到Base64这个类,该类的源代码如下:

1import java.io.ByteArrayOutputStream; 2import java.io.IOException; 3import java.io.OutputStream; 4 5/** 6 * Base64编码工具类 7 * 8 * @author liufeng 9 * @date 2012-10-11 10 */ 11public class Base64 { 12 private static final char[] legalChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray(); 13 14 public static String encode(byte[] data) { 15 int start = 0; 16 int len = data.length; 17 StringBuffer buf = new StringBuffer(data.length * 3 / 2); 18 19 int end = len - 3; 20 int i = start; 21 int n = 0; 22 23 while (i <= end) { 24 int d = ((((int) data[i]) & 0x0ff) << 16) | ((((int) data[i + 1]) & 0x0ff) << 8) | (((int) data[i + 2]) & 0x0ff); 25 26 buf.append(legalChars[(d >> 18) & 63]); 27 buf.append(legalChars[(d >> 12) & 63]); 28 buf.append(legalChars[(d >> 6) & 63]); 29 buf.append(legalChars[d & 63]); 30 31 i += 3; 32 33 if (n++ >= 14) { 34 n = 0; 35 buf.append(" "); 36 } 37 } 38 39 if (i == start + len - 2) { 40 int d = ((((int) data[i]) & 0x0ff) << 16) | ((((int) data[i + 1]) & 255) << 8); 41 42 buf.append(legalChars[(d >> 18) & 63]); 43 buf.append(legalChars[(d >> 12) & 63]); 44 buf.append(legalChars[(d >> 6) & 63]); 45 buf.append("="); 46 } else if (i == start + len - 1) { 47 int d = (((int) data[i]) & 0x0ff) << 16; 48 49 buf.append(legalChars[(d >> 18) & 63]); 50 buf.append(legalChars[(d >> 12) & 63]); 51 buf.append("=="); 52 } 53 54 return buf.toString(); 55 } 56 57 private static int decode(char c) { 58 if (c >= 'A' && c <= 'Z') 59 return ((int) c) - 65; 60 else if (c >= 'a' && c <= 'z') 61 return ((int) c) - 97 + 26; 62 else if (c >= '0' && c <= '9') 63 return ((int) c) - 48 + 26 + 26; 64 else 65 switch (c) { 66 case '+': 67 return 62; 68 case '/': 69 return 63; 70 case '=': 71 return 0; 72 default: 73 throw new RuntimeException("unexpected code: " + c); 74 } 75 } 76 77 /** 78 * Decodes the given Base64 encoded String to a new byte array. The byte array holding the decoded data is returned. 79 */ 80 81 public static byte[] decode(String s) { 82 83 ByteArrayOutputStream bos = new ByteArrayOutputStream(); 84 try { 85 decode(s, bos); 86 } catch (IOException e) { 87 throw new RuntimeException(); 88 } 89 byte[] decodedBytes = bos.toByteArray(); 90 try { 91 bos.close(); 92 bos = null; 93 } catch (IOException ex) { 94 System.err.println("Error while decoding BASE64: " + ex.toString()); 95 } 96 return decodedBytes; 97 } 98 99 private static void decode(String s, OutputStream os) throws IOException { 100 int i = 0; 101 102 int len = s.length(); 103 104 while (true) { 105 while (i < len && s.charAt(i) <= ' ') 106 i++; 107 108 if (i == len) 109 break; 110 111 int tri = (decode(s.charAt(i)) << 18) + (decode(s.charAt(i + 1)) << 12) + (decode(s.charAt(i + 2)) << 6) + (decode(s.charAt(i + 3))); 112 113 os.write((tri >> 16) & 255); 114 if (s.charAt(i + 2) == '=') 115 break; 116 os.write((tri >> 8) & 255); 117 if (s.charAt(i + 3) == '=') 118 break; 119 os.write(tri & 255); 120 121 i += 4; 122 } 123 } 124}

接下来是iPhone端的加密程序,当然是用Ojbective-C写的3DES加密程序,源代码如下:

1// 2// DES3Util.h 3// lx100-gz 4// 5// Created by 柳峰 on 12-10-10. 6// Copyright 2012 http://blog.csdn.net/lyq8479. All rights reserved. 7// 8 9#import <Foundation/Foundation.h> 10 11 12@interface DES3Util : NSObject { 13 14} 15 16// 加密方法 17+ (NSString*)encrypt:(NSString*)plainText; 18 19// 解密方法 20+ (NSString*)decrypt:(NSString*)encryptText; 21 22@end 23 24 25// 26// DES3Util.m 27// lx100-gz 28// 29// Created by 柳峰 on 12-9-17. 30// Copyright 2012 http://blog.csdn.net/lyq8479. All rights reserved. 31// 32 33#import "DES3Util.h" 34#import <CommonCrypto/CommonCryptor.h> 35#import "GTMBase64.h" 36 37#define gkey @"liuyunqiang@lx100$#365#$" 38#define gIv @"01234567" 39 40@implementation DES3Util 41 42// 加密方法 43+ (NSString*)encrypt:(NSString*)plainText { 44 NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding]; 45 size_t plainTextBufferSize = [data length]; 46 const void *vplainText = (const void *)[data bytes]; 47 48 CCCryptorStatus ccStatus; 49 uint8_t *bufferPtr = NULL; 50 size_t bufferPtrSize = 0; 51 size_t movedBytes = 0; 52 53 bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1); 54 bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t)); 55 memset((void *)bufferPtr, 0x0, bufferPtrSize); 56 57 const void *vkey = (const void *) [gkey UTF8String]; 58 const void *vinitVec = (const void *) [gIv UTF8String]; 59 60 ccStatus = CCCrypt(kCCEncrypt, 61 kCCAlgorithm3DES, 62 kCCOptionPKCS7Padding, 63 vkey, 64 kCCKeySize3DES, 65 vinitVec, 66 vplainText, 67 plainTextBufferSize, 68 (void *)bufferPtr, 69 bufferPtrSize, 70 &movedBytes); 71 72 NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes]; 73 NSString *result = [GTMBase64 stringByEncodingData:myData]; 74 return result; 75} 76 77// 解密方法 78+ (NSString*)decrypt:(NSString*)encryptText { 79 NSData *encryptData = [GTMBase64 decodeData:[encryptText dataUsingEncoding:NSUTF8StringEncoding]]; 80 size_t plainTextBufferSize = [encryptData length]; 81 const void *vplainText = [encryptData bytes]; 82 83 CCCryptorStatus ccStatus; 84 uint8_t *bufferPtr = NULL; 85 size_t bufferPtrSize = 0; 86 size_t movedBytes = 0; 87 88 bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1); 89 bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t)); 90 memset((void *)bufferPtr, 0x0, bufferPtrSize); 91 92 const void *vkey = (const void *) [gkey UTF8String]; 93 const void *vinitVec = (const void *) [gIv UTF8String]; 94 95 ccStatus = CCCrypt(kCCDecrypt, 96 kCCAlgorithm3DES, 97 kCCOptionPKCS7Padding, 98 vkey, 99 kCCKeySize3DES, 100 vinitVec, 101 vplainText, 102 plainTextBufferSize, 103 (void *)bufferPtr, 104 bufferPtrSize, 105 &movedBytes); 106 107 NSString *result = [[[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)bufferPtr 108 length:(NSUInteger)movedBytes] encoding:NSUTF8StringEncoding] autorelease]; 109 return result; 110} 111 112@end

iPhone端的加密工具类中引入了“GTMBase64.h”,这是iOS平台的Base64编码工具类,就不在这里贴出相关代码了,需要的百度一下就能找到,实在找不到就回复留言给我。

好了,赶紧试一下吧,JAVA,Android和iPhone三个平台的加密不一致问题是不是解决了呢?其实,对此问题,还有一种更好的实现方式,那就是用C语言写一套加密程序,这样在ios平台是可以直接使用C程序的,而在Java和Android端通过JNI去调用c语言编写的加密方法,这是不是就实现了3个平台调用同一套加密程序呢?

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )