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 gkey@"Mozhe@lx100$#365#$"

#define gIv@"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 = "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(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
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值