1. 程式人生 > >iOS、後臺、Android 三個一致的加密工具 ---------DES加密

iOS、後臺、Android 三個一致的加密工具 ---------DES加密


首先是JAVA端的加密工具類,它同樣適用於Android端,無需任何修改,即可保證Java與Android端的加解密一致,並且中文不會亂碼。我經過和IOS共同測試,是沒有問題的大笑

iOS端  程式碼       iOS端的加密工具類中引入了“GTMBase64.h”,下面 我寫的demo裡面 有該類。。

#import 

@interface DES3Util : NSObject {

}

// 加密方法

+ (NSString*)encrypt:(NSString*)plainText;

// 解密方法

+ (NSString*)decrypt:(NSString*)encryptText;

@end
#import"DES3Util.h"

#import

#import"GTMBase64.h"

#define [email protected]"[email protected]$#365#$"

#define [email protected]"01234567"

@implementationDES3Util

//加密方法

+ (NSString*)encrypt:(NSString*)plainText {

NSData* data = [plainTextdataUsingEncoding:NSUTF8StringEncoding];

size_tplainTextBufferSize = [datalength];

constvoid*vplainText = (constvoid*)[databytes];

CCCryptorStatusccStatus;

uint8_t*bufferPtr =NULL;

size_tbufferPtrSize =0;

size_tmovedBytes =0;

bufferPtrSize = (plainTextBufferSize +kCCBlockSize3DES) & ~(kCCBlockSize3DES-1);

bufferPtr =malloc( bufferPtrSize *sizeof(uint8_t));

memset((void*)bufferPtr,0x0, bufferPtrSize);

constvoid*vkey = (constvoid*) [gkeyUTF8String];

constvoid*vinitVec = (constvoid*) [gIvUTF8String];

ccStatus =CCCrypt(kCCEncrypt,

kCCAlgorithm3DES,

kCCOptionPKCS7Padding,

vkey,

kCCKeySize3DES,

vinitVec,

vplainText,

plainTextBufferSize,

(void*)bufferPtr,

bufferPtrSize,

&movedBytes);

NSData*myData = [NSDatadataWithBytes:(constvoid*)bufferPtrlength:(NSUInteger)movedBytes];

NSString*result = [GTMBase64stringByEncodingData:myData];

returnresult;

}

//解密方法

+ (NSString*)decrypt:(NSString*)encryptText {

NSData*encryptData = [GTMBase64decodeData:[encryptTextdataUsingEncoding:NSUTF8StringEncoding]];

size_tplainTextBufferSize = [encryptDatalength];

constvoid*vplainText = [encryptDatabytes];

CCCryptorStatusccStatus;

uint8_t*bufferPtr =NULL;

size_tbufferPtrSize =0;

size_tmovedBytes =0;

bufferPtrSize = (plainTextBufferSize +kCCBlockSize3DES) & ~(kCCBlockSize3DES-1);

bufferPtr =malloc( bufferPtrSize *sizeof(uint8_t));

memset((void*)bufferPtr,0x0, bufferPtrSize);

constvoid*vkey = (constvoid*) [gkeyUTF8String];

constvoid*vinitVec = (constvoid*) [gIvUTF8String];

ccStatus =CCCrypt(kCCDecrypt,

kCCAlgorithm3DES,

kCCOptionPKCS7Padding,

vkey,

kCCKeySize3DES,

vinitVec,

vplainText,

plainTextBufferSize,

(void*)bufferPtr,

bufferPtrSize,

&movedBytes);

NSString*result = [[NSStringalloc]initWithData:[NSDatadataWithBytes:(constvoid*)bufferPtr

length:(NSUInteger)movedBytes]encoding:NSUTF8StringEncoding];

returnresult;

}

@end



Java端

package encrypt;

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 = "[email protected]
$#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(Base642.decode(encryptText)); return new String(decryptData, encoding); } public static void main(String[] args) throws Exception { String tt="測試"; System.out.println(encode(tt)); System.out.println(decode(encode(tt))); } }

上面的加密工具類會使用到Base64這個類,該類的原始碼如下:

package encrypt;

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();

	}

}

#import

@interfaceDES3Util :NSObject

//加密方法

+ (NSString*)encrypt:(NSString*)plainText;

//解密方法

+ (NSString*)decrypt:(NSString*)encryptText;

@end#import

@interfaceDES3Util :NSObject

//加密方法

+ (NSString*)encrypt:(NSString*)plainText;

//解密方法

+ (NSString*)decrypt:(NSString*)encryptText;

@end

作者:默著
連結:http://www.jianshu.com/p/630e5899582d
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。