一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|

服務器之家 - 編程語言 - JAVA教程 - Android、iOS和Java通用的AES128加密解密示例代碼

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

2020-06-30 11:18daisy JAVA教程

現在很多App在與服務器接口的請求和響應過程中,為了安全都會涉及到加密和解密的問題,如果不加的話就會是明文的,即使加了GZIP也可以被直接解壓成明文。如果同時有Android和IOS的App的話、必須要保證加密和解密的算法一致、不

前言

移動端越來越火了,我們在開發過程中,總會碰到要和移動端打交道的場景,比如android和iOS的打交道。為了讓數據交互更安全,我們需要對數據進行加密傳輸。

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

IOS加密

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/*加密方法*/
 (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解密

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/*解密方法*/
 (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加密

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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解密

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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;
}

總結

以上就是這篇文章的全部內容了,希望本文的內容對各位開發者們能有所幫助,如果有疑問大家可以留言交流。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成人深夜视频 | 久久精品观看影院2828 | 国产欧美综合精品一区二区 | 色在线影院 | 爆操女友 | 亚洲人成在线播放 | 亚洲国产成人久久综合区 | 亚洲一级视频在线观看 | 学校捏奶揉下面污文h | 97国产蝌蚪视频在线观看 | 四虎影院在线免费 | 无毛黄片 | 日韩精品一区二区三区中文字幕 | 3d欧美人与禽交 | 亚洲午夜精品久久久久 | 99久久精品免费看国产 | www.亚洲色图 | 美女扒开尿口让男生添 漫画 | 国产亚洲玖玖玖在线观看 | 风间由美被义子中文字幕 | 日韩成本大片35分钟免费播放 | 国产激情一区二区三区成人91 | 青青青青青 | 日本高清视频网址 | 草莓视频在线免费观看 | 女性性色生活片免费观看 | 成人免费片 | 极品丝袜乱系列在线阅读 | 国产拍拍视频一二三四区 | 俄罗斯引擎首页进入 | 五月天网站 | 成人免费体验区福利云点播 | 好骚好紧| 青青在线香蕉国产精品 | 被18号每天强行榨干acg | 91久久福利国产成人精品 | 人人福利 | 3d动漫美女物被遭强视频 | 国产日本免费 | 放荡护士玩3p口述 | 日韩欧美精品一区二区 |