千家信息网

Android、iPhone和Java三个平台一致的加密方法是什么

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章将为大家详细讲解有关Android、iPhone和Java三个平台一致的加密方法是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。先前一直在
千家信息网最后更新 2026年11月01日Android、iPhone和Java三个平台一致的加密方法是什么

这篇文章将为大家详细讲解有关Android、iPhone和Java三个平台一致的加密方法是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

先前一直在做安卓,最近要开发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 ;           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 ;           }       }  }

接下来是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                   @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   #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三个平台的加密不一致问题是不是解决了呢?以上为3DES加密,也可将其改为AES加密。 其实,对此问题,还有一种更好的实现方式,那就是用C语言写一套加密程序,这样在iOS平台是可以直接使用C程序的,而在Java和Android端通过 JNI去调用C语言编写的加密方法,这是不是就实现了3个平台调用同一套加密程序呢?

关于Android、iPhone和Java三个平台一致的加密方法是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

加密 平台 方法 程序 一致 工具 三个 代码 端的 客户 客户端 编码 问题 内容 接口 数据 文本 文章 方式 更多 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技工作委员会毛军 科技赋能下的互联网金融 互联网未来科技 互联网科技的英文 安徽鑫晟辉互联网科技 互联网金融科技创新 壹账通互联网科技 互联网公司会议桌创意科技软装饰 富国互联网科技创新基金 团飞科技与伯堂互联网服务平台 互联网科技有哪些公司 福建科技产业互联网发展 新兴科技互联网创新大赛颁奖典礼 企晟互联网信息科技有限公司 华中科技大学互联网的牛人 上海科技产业互联网平台 容联科技互联网电商 互联网科技平台产品运营 中国互联网公司的科技投入 互联网科技对化妆品行业 有格互联网科技 西安纸贵互联网科技有限公司 互联网科技会 互联网巨头投资的硬核科技 互联网科技博主是什么意思 团飞科技与伯堂互联网服务平台 互联网软件和科技 科技互联网的核心竞争力 小米互联网科技园入驻 广州智享互联网科技
0