java教程WWw.LLlt.net

先前一直在做安卓,最近要开发iPhone客户端,这其中遇到的最让人纠结的要属Java、Android和iPhone三个平台加解密不一致的问题。因为手机端后台通常是用JAVA开发的Web Service,Android和iPhone客户端调用同样的Web Service接口,为了数据安全考虑,要对数据进行加密。头疼的问题就来了,很难编写出一套加密程序,在3个平台间加解密的结果一致,总不能为Android和iPhone两个客户端各写一套Web Service接口吧?我相信还会有很多朋友为此困惑,在此分享一套3DES加密程序,能够实现Java、Android和iPhone三个平台加解密一致

首先是JAVA端的加密工具类,它同样适用于Android端,无需任何修改,即可保证Java与Android端的加解密一致,并且中文不会乱码。

importjava.security.Key; importjavax.crypto.Cipher; importjavax.crypto.SecretKeyFactory; importjavax.crypto.spec.DESedeKeySpec; importjavax.crypto.spec.IvParameterSpec; /** *3DES加密工具类 */ publicclassDes3{ //密钥 privatefinalstaticStringsecretKey="7ab8e76faa2845beb7b0c349b39389ed"; //向量 privatefinalstaticStringiv="01234567"; //加解密统一使用的编码方式 privatefinalstaticStringencoding="utf-8"; /** *3DES加密 * *@paramplainText普通文本 *@return *@throwsException */ publicstaticStringencode(StringplainText)throwsException{ Keydeskey=null; DESedeKeySpecspec=newDESedeKeySpec(secretKey.getBytes()); SecretKeyFactorykeyfactory=SecretKeyFactory.getInstance("desede"); deskey=keyfactory.generateSecret(spec); Ciphercipher=Cipher.getInstance("desede/CBC/PKCS5Padding"); IvParameterSpecips=newIvParameterSpec(iv.getBytes()); cipher.init(Cipher.ENCRYPT_MODE,deskey,ips); byte[]encryptData=cipher.doFinal(plainText.getBytes(encoding)); returnBase64.encode(encryptData); } /** *3DES解密 * *@paramencryptText加密文本 *@return *@throwsException */ publicstaticStringdecode(StringencryptText)throwsException{ Keydeskey=null; DESedeKeySpecspec=newDESedeKeySpec(secretKey.getBytes()); SecretKeyFactorykeyfactory=SecretKeyFactory.getInstance("desede"); deskey=keyfactory.generateSecret(spec); Ciphercipher=Cipher.getInstance("desede/CBC/PKCS5Padding"); IvParameterSpecips=newIvParameterSpec(iv.getBytes()); cipher.init(Cipher.DECRYPT_MODE,deskey,ips); byte[]decryptData=cipher.doFinal(Base64.decode(encryptText)); returnnewString(decryptData,encoding); } }

上面的加密工具类会使用到Base64这个类,该类的源代码如下:

importjava.io.ByteArrayOutputStream; importjava.io.IOException; importjava.io.OutputStream; /** *Base64编码工具类 * */ publicclassBase64{ privatestaticfinalchar[]legalChars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray(); publicstaticStringencode(byte[]data){ intstart=0; intlen=data.length; StringBufferbuf=newStringBuffer(data.length*3/2); intend=len-3; inti=start; intn=0; while(i<=end){ intd=((((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){ intd=((((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("="); }elseif(i==start+len-1){ intd=(((int)data[i])&0x0ff)<<16; buf.append(legalChars[(d>>18)&63]); buf.append(legalChars[(d>>12)&63]); buf.append("=="); } returnbuf.toString(); } privatestaticintdecode(charc){ if(c>='A'&&c='a'&&c='0'&&c<='9') return((int)c)-48+26+26; else switch(c){ case'+': return62; case'/': return63; case'=': return0; default: thrownewRuntimeException("unexpectedcode:"+c); } } /** *DecodesthegivenBase64encodedStringtoanewbytearray.Thebytearrayholdingthedecodeddataisreturned. */ publicstaticbyte[]decode(Strings){ ByteArrayOutputStreambos=newByteArrayOutputStream(); try{ decode(s,bos); }catch(IOExceptione){ thrownewRuntimeException(); } byte[]decodedBytes=bos.toByteArray(); try{ bos.close(); bos=null; }catch(IOExceptionex){ System.err.println("ErrorwhiledecodingBASE64:"+ex.toString()); } returndecodedBytes; } privatestaticvoiddecode(Strings,OutputStreamos)throwsIOException{ inti=0; intlen=s.length(); while(true){ while(i<len&&s.charAt(i)<='') i++; if(i==len) break; inttri=(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加密程序,源代码如下:

#import@interfaceDES3Util:NSObject{ } //加密方法 +(NSString*)encrypt:(NSString*)plainText; //解密方法 +(NSString*)decrypt:(NSString*)encryptText; @end#import"DES3Util.h" #import#import"GTMBase64.h" #definegkey @"7ab8e76faa2845beb7b0c349b39389ed" #definegIv@"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]autorelease]; returnresult; } @end

iPhone端的加密工具类中引入了“GTMBase64.h”,这是iOS平台的Base64编码工具类,就不在这里贴出相关代码了,需要的百度一下就能找到,实在找不到就回复留言给我。

好了,赶紧试一下吧,JAVA,Android和iPhone三个平台的加密不一致问题是不是解决了呢?其实,对此问题,还有一种更好的实现方式,那就是用C语言写一套加密程序,这样在iOS平台是可以直接使用C程序的,而在Java和Android端通过JNI去调用C语言编写的加密方法,这是不是就实现了3个平台调用同一套加密程序呢?

java教程WWw.LLlt.net

声明:有的资源来自网络转载,版权归原作者所有,如有侵犯到您的权益请联系邮箱:our333@126.com我们将配合处理!

原文地址:Android、iPhone和Java三个平台一致的对称加密工具发布于2021-11-26 09:33:01