先前一直在做安卓,最近要开发iPhone客户端,这其中遇到的最让人纠结的要属Java、Android和iPhone三个平台加解密不一致的问题。因为手机端后台通常是用JAVA开发的Web Service,Android和iPhone客户端调用同样的Web Service接口,为了数据安全考虑,要对数据进行加密。头疼的问题就来了,很难编写出一套加密程序,在3个平台间加解密的结果一致,总不能为Android和iPhone两个客户端各写一套Web Service接口吧?我相信还会有很多朋友为此困惑,在此分享一套3DES加密程序,能够实现Java、Android和iPhone三个平台加解密一致

首先是JAVA端的加密工具类,它同样适用于Android端,无需任何修改,即可保证Java与Android端的加解密一致,并且中文不会乱码。

package org.liuyq.des3;import java.security.Key;import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;/*** 3DES加密工具类* * @author liufeng * @date 2012-10-11*/
public class Des3 {// 密钥private final static String secretKey = "liuyunqiang@lx100$#365#$";// 向量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);}
}

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

package org.liuyq.des3;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;/*** Base64编码工具类* * @author liufeng * @date 2012-10-11*/
public class Base64 {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;elseswitch (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;}}
}

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

//
//  DES3Util.h
//  lx100-gz
//
//  Created by  柳峰 on 12-10-10.
//  Copyright 2012 http://blog.csdn.net/lyq8479. All rights reserved.
//#import <Foundation/Foundation.h>@interface DES3Util : NSObject {}// 加密方法
+ (NSString*)encrypt:(NSString*)plainText;// 解密方法
+ (NSString*)decrypt:(NSString*)encryptText;@end
//
//  DES3Util.m
//  lx100-gz
//
//  Created by  柳峰 on 12-9-17.
//  Copyright 2012 http://blog.csdn.net/lyq8479. All rights reserved.
//#import "DES3Util.h"
#import <CommonCrypto/CommonCryptor.h>
#import "GTMBase64.h"#define gkey         @"liuyunqiang@lx100$#365#$"
#define gIv             @"01234567"@implementation DES3Util// 加密方法
+ (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 = [GTMBase64 stringByEncodingData:myData];return result;
}// 解密方法
+ (NSString*)decrypt:(NSString*)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 dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes] encoding:NSUTF8StringEncoding] autorelease];return result;
}@end

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

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

[022] Android、iPhone和Java三个平台一致的加密工具相关推荐

  1. 华为cipher解密工具_Android、iPhone和Java三个平台一致的加密工具

    import java.security.Key; import javax.crypto.Cipher; import javax.crypto.SecretKeyFactory; import j ...

  2. Java教程:微信排序并加密工具类

    Java教程:微信排序并加密工具类 源码: import cn.bsit.commons.md5.MD5Utils;import java.util.Arrays; import java.util. ...

  3. Java IO在Android中应用(三):Apk加固去壳

    Java I/O在Android中应用(三):Apk加固去壳 前言(废话) 现在在动车上,因为最近接到一个紧急的出差任务,需要去一趟江苏我们移动应用的客户现场.说真的,本来其实我是很困的,但是车上有一 ...

  4. 新大陆物联网-Android实现网关功能-连接云平台并上传传感器数据-获取执行器指令并执行-Android网关开发-通信-数据上传云平台-JAVA原理讲解-免费云平台使用-竞赛2022国赛真题

    目录 一.任务要求 二.开发环境 三.网关上线 四.数据上传与命令下发 五.JSON命令解析思路 六.总结 一.任务要求 我们将要实现的效果是:Android开发平板与Lora板进行有线串口通信,解析 ...

  5. 一套代码编译出ios和android,Hippy: Hippy 是一个新生的跨端开发框架,目标是使开发者可以只写一套代码就直接运行于三个平台(iOS、Android 和 Web)...

    Hippy 跨端开发框架 介绍 Hippy 是一个新生的跨端开发框架,目标是使开发者可以只写一套代码就直接运行于三个平台(iOS.Android 和 Web).Hippy 的设计是面向传统 Web 开 ...

  6. java三个技术平台_Java的3个平台有什么区别

    展开全部 平台的区别和关系如下: 一.定义和应用范围:62616964757a686964616fe78988e69d8331333365666235J2SE包含于J2EE中,J2ME包含了J2SE的 ...

  7. android 开发 目标绑定,Hippy: Hippy 是一个新生的跨端开发框架,目标是使开发者可以只写一套代码就直接运行于三个平台(iOS、Android 和 Web)...

    Hippy 跨端开发框架 介绍 Hippy 是一个新生的跨端开发框架,目标是使开发者可以只写一套代码就直接运行于三个平台(iOS.Android 和 Web).Hippy 的设计是面向传统 Web 开 ...

  8. 基于JAVA三坑购物平台演示录像2020计算机毕业设计源码+数据库+lw文档+系统+部署

    基于JAVA三坑购物平台演示录像2020计算机毕业设计源码+数据库+lw文档+系统+部署 基于JAVA三坑购物平台演示录像2020计算机毕业设计源码+数据库+lw文档+系统+部署 本源码技术栈: 项目 ...

  9. java三个技术平台_java三大技术平台是什么

    JAVA分为三大技术平台,如下: Java SE( Java Platform Standard Edition)标准版,是为开发普通桌面和商务应用程序提供的解决方案. JavaSE是三个平台中最核心 ...

最新文章

  1. [二十五]JavaIO之RandomAccessFile
  2. 性能优化技巧 - 内存关联计算
  3. centos6.4下LVS+keepalived的高可用(LVS/DR模式)
  4. tomcat的日志不输出日志信息的解决方法
  5. java 左右两边数据类型不一样_Java笔记-day004-[运算符]
  6. DM368开发 -- Bootloader 开发(转毕设)
  7. C#关于文件夹遍历以及文件拷贝
  8. 3千字带你搞懂XXL-JOB任务调度平台
  9. 分数化小数(指定精度)
  10. 第二百五十八节,Tornado框架-逻辑处理get()方法和post()方法,初识模板语言
  11. 终于转了,写写人生学习规划
  12. [转载] NumPy 基本操作(ndarray通用函数 / 常用函数)
  13. 「leetcode」 1382. 将二叉搜索树变平衡:【构造平衡二叉搜索树】详解
  14. 华为p50 pro 鸿蒙,华为P50Pro真豪横!鸿蒙系统+真全屏5摄,网友:太香了!
  15. word公式大括号内容对齐
  16. 计算机网络与应用技术清华答案第二版,计算机网络-原理、技术与应用(第2版)部分习题答案(不外传!).pdf...
  17. 3DTouch桌面快捷方式
  18. 被繁杂的数据搞到头大?让 Google Cloud 大数据平台帮你实现快准狠!
  19. CSS背景切角的实现研究
  20. space_sniffer 清理 磁盘

热门文章

  1. Android Studio鼠标不能拖动文件drag-n-drop
  2. 使用ensp模拟器中的防火墙(USG6000V)配置NAT(网页版)
  3. 堆的向下调整算法、堆的向上调整算法、堆的实现、Topk问题
  4. Fedora安装mysql(基础安装)
  5. 机器人科普--AGILOX 叉车
  6. Seata XA 模式理论学习、使用及注意事项 | Spring Cloud54
  7. 消息队列超详解(以RabbitMQ和Kafka为例,为何使用消息队列、优缺点、高可用性、问题解决)
  8. 安卓(Android)项目Gradle编译项目时间太长,要等半个小时或者更久的解决
  9. execute、executeQuery、executeUpdate的区别
  10. 对路径XXX的访问被拒绝