欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android、iOS和Java通用的AES128加密解密示例代碼

 更新時(shí)間:2016年11月04日 10:05:28   投稿:daisy  
現(xiàn)在很多App在與服務(wù)器接口的請(qǐng)求和響應(yīng)過(guò)程中,為了安全都會(huì)涉及到加密和解密的問(wèn)題,如果不加的話就會(huì)是明文的,即使加了GZIP也可以被直接解壓成明文。如果同時(shí)有Android和IOS的App的話、必須要保證加密和解密的算法一致、不然后臺(tái)沒(méi)法處理,下面通過(guò)這篇文章學(xué)習(xí)下。

前言

移動(dòng)端越來(lái)越火了,我們?cè)陂_(kāi)發(fā)過(guò)程中,總會(huì)碰到要和移動(dòng)端打交道的場(chǎng)景,比如android和iOS的打交道。為了讓數(shù)據(jù)交互更安全,我們需要對(duì)數(shù)據(jù)進(jìn)行加密傳輸。

這篇文章給大家分享AES的加密和解密、Android和ios通用的AES加密算法、大家可以直接集成到自己的項(xiàng)目、服務(wù)器接口如果是用Java寫(xiě)的話、整個(gè)框架都完美了、如果是.NET編寫(xiě)的后臺(tái)接口的話、得改造一下哦

IOS加密

/*加密方法*/
 (NSString *)AES256EncryptWithPlainText:(NSString *)plain {
 NSData *plainText = [plain dataUsingEncoding:NSUTF8StringEncoding];
 // ´key´ should be 32 bytes for AES256, will be null-padded otherwise
 char keyPtr[kCCKeySizeAES256 1]; // room for terminator (unused)
 bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
  
 NSUInteger dataLength = [plainText length];

 size_t bufferSize = dataLength kCCBlockSizeAES128;
 void *buffer = malloc(bufferSize);
 bzero(buffer, sizeof(buffer));
 
 size_t numBytesEncrypted = 0;
 
 CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,kCCOptionPKCS7Padding,
           [[NSData AESKeyForPassword:PASSWORD] bytes], kCCKeySizeAES256,
           ivBuff /* initialization vector (optional) */,
           [plainText bytes], dataLength, /* input */
           buffer, bufferSize, /* output */
           &numBytesEncrypted);
 if (cryptStatus == kCCSuccess) {
  NSData *encryptData = [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
  return [encryptData base64Encoding];
 }
 
 free(buffer); //free the buffer;
 return nil;
}

IOS解密

/*解密方法*/
 (NSString *)AES256DecryptWithCiphertext:(NSString *)ciphertexts{
 
 NSData *cipherData = [NSData dataWithBase64EncodedString:ciphertexts];
 // ´key´ should be 32 bytes for AES256, will be null-padded otherwise
 char keyPtr[kCCKeySizeAES256 1]; // room for terminator (unused)
 bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
  
 NSUInteger dataLength = [cipherData length];
 
 size_t bufferSize = dataLength kCCBlockSizeAES128;
 void *buffer = malloc(bufferSize);
  
 size_t numBytesDecrypted = 0;
 CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
           [[NSData AESKeyForPassword:PASSWORD] bytes], kCCKeySizeAES256, 
           ivBuff ,/* initialization vector (optional) */
           [cipherData bytes], dataLength, /* input */
           buffer, bufferSize, /* output */
           &numBytesDecrypted);
 
 if (cryptStatus == kCCSuccess) {
  NSData *encryptData = [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
  return [[[NSString alloc] initWithData:encryptData encoding:NSUTF8StringEncoding] init];
 }
 
 free(buffer); //free the buffer;
 return nil;
}

Android加密

private byte[] encrypt(String cmp, SecretKey sk, IvParameterSpec IV,
  byte[] msg) {
 try {
  Cipher c = Cipher.getInstance(cmp);
  c.init(Cipher.ENCRYPT_MODE, sk, IV);
  return c.doFinal(msg);
 } catch (NoSuchAlgorithmException nsae) {
  Log.e("AESdemo", "no cipher getinstance support for " cmp);
 } catch (NoSuchPaddingException nspe) {
  Log.e("AESdemo", "no cipher getinstance support for padding " cmp);
 } catch (InvalidKeyException e) {
  Log.e("AESdemo", "invalid key exception");
 } catch (InvalidAlgorithmParameterException e) {
  Log.e("AESdemo", "invalid algorithm parameter exception");
 } catch (IllegalBlockSizeException e) {
  Log.e("AESdemo", "illegal block size exception");
 } catch (BadPaddingException e) {
  Log.e("AESdemo", "bad padding exception");
 }
 return null;
}

Android解密

private byte[] decrypt(String cmp, SecretKey sk, IvParameterSpec IV,
   byte[] ciphertext) {
 try {
  Cipher c = Cipher.getInstance(cmp);
  c.init(Cipher.DECRYPT_MODE, sk, IV);
  return c.doFinal(ciphertext);
 } catch (NoSuchAlgorithmException nsae) {
  Log.e("AESdemo", "no cipher getinstance support for " cmp);
 } catch (NoSuchPaddingException nspe) {
  Log.e("AESdemo", "no cipher getinstance support for padding " cmp);
 } catch (InvalidKeyException e) {
  Log.e("AESdemo", "invalid key exception");
 } catch (InvalidAlgorithmParameterException e) {
  Log.e("AESdemo", "invalid algorithm parameter exception");
 } catch (IllegalBlockSizeException e) {
  Log.e("AESdemo", "illegal block size exception");
 } catch (BadPaddingException e) {
  Log.e("AESdemo", "bad padding exception");
  e.printStackTrace();
 }
 return null;
}

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)各位開(kāi)發(fā)者們能有所幫助,如果有疑問(wèn)大家可以留言交流。

相關(guān)文章

  • 如何使用MAVEN打JAR包(直接使用)

    如何使用MAVEN打JAR包(直接使用)

    這篇文章主要介紹了如何使用MAVEN打JAR包(直接使用),文中通過(guò)實(shí)例代碼介紹了maven?使用assembly插件進(jìn)行打包的方法,需要的朋友可以參考下
    2023-03-03
  • 淺談HashMap在高并發(fā)下的問(wèn)題

    淺談HashMap在高并發(fā)下的問(wèn)題

    這篇文章主要介紹了HashMap在高并發(fā)下的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java中對(duì)象的克隆詳解

    Java中對(duì)象的克隆詳解

    這篇文章主要介紹了Java中對(duì)象的克隆詳解,Java中對(duì)象的復(fù)制分為淺復(fù)制與深復(fù)制的不同之處就在于深復(fù)制還會(huì)復(fù)制對(duì)象的引用對(duì)象,需要的朋友可以參考下
    2023-08-08
  • java分割文本字符串的方法

    java分割文本字符串的方法

    這篇文章主要為大家詳細(xì)介紹了java分割文本字符串的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • mybatis實(shí)現(xiàn)遍歷Map的key和value

    mybatis實(shí)現(xiàn)遍歷Map的key和value

    這篇文章主要介紹了mybatis實(shí)現(xiàn)遍歷Map的key和value方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 淺談java8中map的新方法--replace

    淺談java8中map的新方法--replace

    下面小編就為大家?guī)?lái)一篇淺談java8中map的新方法--replace。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-10-10
  • Java并發(fā)編程之Executors類(lèi)詳解

    Java并發(fā)編程之Executors類(lèi)詳解

    今天給大家?guī)?lái)的是關(guān)于Java并發(fā)編程的相關(guān)知識(shí),文章圍繞著Java Executors類(lèi)展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Java實(shí)戰(zhàn)項(xiàng)目之斗地主和斗牛游戲的實(shí)現(xiàn)

    Java實(shí)戰(zhàn)項(xiàng)目之斗地主和斗牛游戲的實(shí)現(xiàn)

    讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java實(shí)現(xiàn)一個(gè)斗地主和一個(gè)斗牛游戲,大家可以在過(guò)程中查缺補(bǔ)漏,提升水平
    2021-11-11
  • Java實(shí)現(xiàn)評(píng)論回復(fù)功能的完整步驟

    Java實(shí)現(xiàn)評(píng)論回復(fù)功能的完整步驟

    這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)評(píng)論回復(fù)功能的完整步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Java中遞歸原理實(shí)例分析

    Java中遞歸原理實(shí)例分析

    這篇文章主要介紹了Java中遞歸原理,實(shí)例分析了java中遞歸的原理與實(shí)現(xiàn)方法,以及使用過(guò)程中的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05

最新評(píng)論