iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Android、iPhone和Java三个平台一致的加密方法是什么
  • 639
分享到

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

2023-06-17 08:06:49 639人浏览 薄情痞子
摘要

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

这篇文章将为大家详细讲解有关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;           public class Des3 {       // 密钥       private final static String secretKey = "liuyunqiang@lx100$#365#$" ;       // 向量       private final static String iv = "01234567" ;       // 加解密统一使用的编码方式       private final static String encoding = "utf-8" ;                     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);       }                     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;           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);               }       }                             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三个平台的加密不一致问题是不是解决了呢?以上为3DES加密,也可将其改为AES加密。 其实,对此问题,还有一种更好的实现方式,那就是用C语言写一套加密程序,这样在iOS平台是可以直接使用C程序的,而在Java和Android端通过 JNI去调用C语言编写的加密方法,这是不是就实现了3个平台调用同一套加密程序呢?

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

--结束END--

本文标题: Android、iPhone和Java三个平台一致的加密方法是什么

本文链接: https://www.lsjlt.com/news/287891.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android、iPhone和Java三个平台一致的加密方法是什么
    这篇文章将为大家详细讲解有关Android、iPhone和Java三个平台一致的加密方法是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。先前一直在做安卓,最近要开发iPhone客户端,这...
    99+
    2023-06-17
  • android加密和解密的方法是什么
    在Android中,可以使用以下方法进行加密和解密:1. 对称加密(Symmetric Encryption):使用相同的密钥进行加密和解密。常用的对称加密算法包括AES(Advanced Encryption Standard)和DE...
    99+
    2023-08-11
    android
  • java加密的方法是什么
    Java中常用的加密方法有:1. 对称加密:使用相同的密钥对数据进行加密和解密,常见的对称加密算法有AES、DES、3DES。2. ...
    99+
    2023-09-05
    java
  • Android安全加密的方法是什么
    Android安全加密的方法主要包括以下几种: 使用SSL/TLS协议进行数据传输加密:通过SSL/TLS协议对网络通信进行加密...
    99+
    2024-03-08
    Android
  • android文件加密开发的方法是什么
    Android文件加密开发的方法可以有多种,以下是其中几种常见的方法:1. 使用Android提供的加密API:Android提供了...
    99+
    2023-10-18
    android
  • Java实现常用的三种加密算法是什么
    这篇文章主要为大家展示了“Java实现常用的三种加密算法是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java实现常用的三种加密算法是什么”这篇文章吧。前言编程中常见的加密算法有以下几种,...
    99+
    2023-06-29
  • SpringSecurity BCrypt密码加密和解密的方法是什么
    本篇内容主要讲解“SpringSecurity BCrypt密码加密和解密的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringSecurity BCrypt...
    99+
    2023-07-06
  • python数据加密和解密的方法是什么
    在Python中,常用的数据加密和解密方法有以下几种: hashlib模块:使用哈希算法加密数据,常用的哈希算法有MD5、SHA1...
    99+
    2024-02-29
    python
  • C# 和 Python 的 hash_md5加密方法是什么
    这篇文章给大家介绍C# 和 Python 的 hash_md5加密方法是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、C# 和 Python 的 hash_md5加密1、C#版本1public sta...
    99+
    2023-06-25
  • Java开发平台O2OA管理环境的方法是什么
    今天小编给大家分享一下Java开发平台O2OA管理环境的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、平台环境...
    99+
    2023-06-04
  • Java对接ansible自动运维化平台的方法是什么
    这篇文章主要介绍“Java对接ansible自动运维化平台的方法是什么”,在日常操作中,相信很多人在Java对接ansible自动运维化平台的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java对...
    99+
    2023-07-05
  • centos7增加一个硬盘的方法是什么
    要在CentOS 7上添加一个硬盘,您可以按照以下步骤操作: 将新硬盘安装到计算机上,并连接好数据和电源线。 打开终端窗口,...
    99+
    2024-04-02
  • java继承一个类的方法是什么
    在Java中继承一个类的方法是通过使用关键字"extends"来实现的。具体来说,可以通过在子类的类定义中使用关...
    99+
    2024-04-02
  • Android数据加密与安全存储的方法是什么
    在Android平台上,数据加密与安全存储可以通过以下几种方法来实现: 使用Android提供的加密API:Android提供了...
    99+
    2024-04-30
    Android
  • java定义一个类的方法是什么
    在Java中,定义一个类的方法首先需要编写类的声明,然后在类中定义具体的方法。一个方法的定义通常包括方法的访问修饰符、返回类型、方法...
    99+
    2024-04-02
  • Git 在 Windows 平台上的安装和配置方法是什么?
    Git 是一种分布式版本控制系统,它可以帮助开发人员更好地管理代码。在 Windows 平台上,安装和配置 Git 是一个必须掌握的技能。在本文中,我们将介绍如何在 Windows 平台上安装和配置 Git,并附有相应的演示代码。 第一步...
    99+
    2023-11-11
    windows npm git
  • Vue一个动态添加background-image的方法是什么
    这篇文章主要介绍了Vue一个动态添加background-image的方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue一个动态添加background-image的方法是什么文章都会有所收获,下面...
    99+
    2023-07-05
  • redis和数据库数据保持一致的方法是什么
    保持Redis和数据库数据一致有几种方法: 使用消息队列:可以通过在数据库中的数据发生变化时将消息发送到消息队列中,然后在Red...
    99+
    2024-04-09
    redis 数据库
  • web开发中三个最有效的增加外链方法是什么
    web开发中三个最有效的增加外链方法是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。网上关于增加外链的方法实在太多,但大多数的方法都是很不...
    99+
    2024-04-02
  • java多个字符串合并成一个的方法是什么
    Java中可以使用字符串的concat()方法或者使用"+"运算符来合并多个字符串。使用concat()方法:`...
    99+
    2023-09-25
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作