中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2021-10-29 17:43:36 來源:億速云 閱讀:147 作者:柒染 欄目:編程語言

這篇文章將為大家詳細講解有關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 <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三個平臺一致的加密方法是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

卓尼县| 青川县| 汝城县| 梅州市| 宝兴县| 平塘县| 灵宝市| 鄂尔多斯市| 呼图壁县| 岳阳市| 舒兰市| 南投县| 政和县| 大埔区| 长乐市| 宜城市| 安宁市| 阜南县| 共和县| 德令哈市| 新昌县| 古田县| 浦县| 剑河县| 南溪县| 谢通门县| 大名县| 阜新市| 溧阳市| 连南| 永宁县| 冷水江市| 崇阳县| 阜宁县| 稷山县| 玛多县| 商河县| 峨山| 武冈市| 和龙市| 敦化市|