iOS開發中AES的加密和解密
關於AES的介紹請參考AES演算法詳解,這裡我就不多介紹了,我主要介紹到我們專案中用到的AES加密和解密的使用方法。
建立內方法
//AES加密和解密
+(NSString*)AesEncrypt:(NSString*)str;
+(NSString*)AesDecrypt:(NSString*)str;
在.m檔案裡程式碼如下
AES加密
+(NSString*)AesEncrypt:(NSString*)str{
NSString*key=@"X*Z_j2#3%z5&H+M4";//金鑰
NSData*data=[strdataUsingEncoding:NSUTF8StringEncoding];//待加密字元轉為NSData型
charkeyPtr[kCCKeySizeAES128+1];
memset(keyPtr,0,sizeof(keyPtr));
[key getCString:keyPtrmaxLength:sizeof(keyPtr)encoding:NSUTF8StringEncoding];
NSUIntegerdataLength = [datalength];
size_tbufferSize = dataLength +kCCBlockSizeAES128;
void*buffer =malloc(bufferSize);
size_tnumBytesCrypted =0;
CCCryptorStatuscryptStatus =CCCrypt(
kCCEncrypt, // 加密 kCCDecrypt解密
kCCAlgorithmAES128, //填充方式
kCCOptionPKCS7Padding|kCCOptionECBMode, //工作模式
keyPtr, //AES的金鑰長度有128位元組、192位元組、256位元組幾種,這裡舉出可能存在的最大長度
kCCBlockSizeAES128, //密文長度+補位長度
nil, //偏移量,由於是對稱加密,用不到
[databytes], //位元組大小
dataLength, //位元組長度
buffer,
bufferSize,
&numBytesCrypted);
if(cryptStatus ==kCCSuccess) {
NSData*resultData=[NSDatadataWithBytesNoCopy:bufferlength:numBytesCrypted];
NSString*result =[selfbase64EncodedStringFrom:resultData];
returnresult;
}
free(buffer);
returnstr;
}
解密操作:
+(NSString*)AesDecrypt:(NSString*)str{
NSString*key=@"X*Z_j2#3%z5&H+M4";M //金鑰
NSData*data=[selfdataWithBase64EncodedString:str];// base4解碼
charkeyPtr[kCCKeySizeAES128+1];
memset(keyPtr,0,sizeof(keyPtr));
[keygetCString:keyPtrmaxLength:sizeof(keyPtr)encoding:NSUTF8StringEncoding];
NSUIntegerdataLength = [datalength];
size_tbufferSize = dataLength +kCCBlockSizeAES128;
void*buffer =malloc(bufferSize);
size_tnumBytesCrypted =0;
CCCryptorStatuscryptStatus =CCCrypt(kCCDecrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding|kCCOptionECBMode,
keyPtr,
kCCBlockSizeAES128,
nil,
[databytes],
dataLength,
buffer,
bufferSize,
&numBytesCrypted);
if(cryptStatus ==kCCSuccess) {
NSData*resultData=[NSDatadataWithBytesNoCopy:bufferlength:numBytesCrypted];
NSString*result =[[NSStringalloc]initWithData:resultDataencoding:NSUTF8StringEncoding];
returnresult;
}
free(buffer);
returnstr;
}
總結一下:
常見的字元編碼有:UTF-8、ASCII、Base64、十六進位制等等,不要使用UTF-8,加密過程是使用UTF-8完成的,但是加密完後的NSData無法通過UTF-8編碼格式轉出成NSString,推薦使用Base64編碼或者十六進位制編碼,取決於後臺。另外加密的資料長度大於10位的情況下,工作模式不要只寫kCCOptionPKCS7Padding要把kCCOptionECBMode也加上,請測在密文在16位以上解密以後跟後臺不一致,加上kCCOptionECBMode會解決.
以下是base64的編碼和解碼
.m檔案加上這個
#import <CommonCrypto/CommonCryptor.h>
static constcharencodingTable[] ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
#define LocalStr_None @""//空字串
+ (NSString*)base64StringFromText:(NSString*)text
{
if(text && ![textisEqualToString:LocalStr_None]) {
NSData*data = [textdataUsingEncoding:NSUTF8StringEncoding];
return[selfbase64EncodedStringFrom:data];
}
else{
returnLocalStr_None;
}
}
+ (NSString*)textFromBase64String:(NSString*)base64
{
if(base64 && ![base64isEqualToString:LocalStr_None]) {
NSData*data = [selfdataWithBase64EncodedString:base64];
return[[NSStringalloc]initWithData:dataencoding:NSUTF8StringEncoding];
}
else{
returnLocalStr_None;
}
}
+ (NSData*)dataWithBase64EncodedString:(NSString*)string
{
if(string ==nil)
[NSExceptionraise:NSInvalidArgumentExceptionformat:nil];
if([stringlength] ==0)
return[NSDatadata];
staticchar*decodingTable =NULL;
if(decodingTable ==NULL)
{
decodingTable =malloc(256);
if(decodingTable ==NULL)
returnnil;
memset(decodingTable,CHAR_MAX,256);
NSUIntegeri;
for(i =0; i <64; i++)
decodingTable[(short)encodingTable[i]] = i;
}
constchar*characters = [stringcStringUsingEncoding:NSASCIIStringEncoding];
if(characters ==NULL)//Not an ASCII string!
returnnil;
char*bytes =malloc((([stringlength] +3) /4) *3);
if(bytes ==NULL)
returnnil;
NSUIntegerlength =0;
NSUIntegeri =0;
while(YES)
{
charbuffer[4];
shortbufferLength;
for(bufferLength =0; bufferLength <4; i++)
{
if(characters[i] =='\0')
break;
if(isspace(characters[i]) || characters[i] =='=')
continue;
buffer[bufferLength] = decodingTable[(short)characters[i]];
if(buffer[bufferLength++] ==CHAR_MAX)//Illegal character!
{
free(bytes);
returnnil;
}
}
if(bufferLength ==0)
break;
if(bufferLength ==1)//At least two characters are needed to produce one byte!
{
free(bytes);
returnnil;
}
//Decode the characters in the buffer to bytes.
bytes[length++] = (buffer[0] <<2) | (buffer[1] >>4);
if(bufferLength >2)
bytes[length++] = (buffer[1] <<4) | (buffer[2] >>2);
if(bufferLength >3)
bytes[length++] = (buffer[2] <<6) | buffer[3];
}
bytes =realloc(bytes, length);
return[NSDatadataWithBytesNoCopy:byteslength:length];
}
+ (NSString*)base64EncodedStringFrom:(NSData*)data
{
if([datalength] ==0)
return@"";
char*characters =malloc((([datalength] +2) /3) *4);
if(characters ==NULL)
returnnil;
NSUIntegerlength =0;
NSUIntegeri =0;
while(i < [datalength])
{
charbuffer[3] = {0,0,0};
shortbufferLength =0;
while(bufferLength <3&& i < [datalength])
buffer[bufferLength++] = ((char*)[databytes])[i++];
//Encode the bytes in the buffer to four characters, including padding "=" characters if necessary.
characters[length++] =encodingTable[(buffer[0] &0xFC) >>2];
characters[length++] =encodingTable[((buffer[0] &0x03) <<4) | ((buffer[1] &0xF0) >>4)];
if(bufferLength >1)
characters[length++] =encodingTable[((buffer[1] &0x0F) <<2) | ((buffer[2] &0xC0) >>6)];
elsecharacters[length++] ='=';
if(bufferLength >2)
characters[length++] =encodingTable[buffer[2] &0x3F];
elsecharacters[length++] ='=';
}
return [[NSStringalloc]initWithBytesNoCopy:characterslength:lengthencoding:NSASCIIStringEncodin gfreeWhenDone:YES];
}
相關文章
- AES加密解密加密解密
- AES 加密&解密加密解密
- AES CBC 加密解密加密解密
- JavaScript前端和Java後端的AES加密和解密JavaScript前端後端加密解密
- Python AES 加密和解密(qbit)Python加密解密
- golang AES-CBC 加密解密Golang加密解密
- python AES-CBC 加密解密Python加密解密
- Java AES加密和解密教程 - BaeldungJava加密解密
- php中aes加密和rsa加密的區別PHP加密
- AES位元組陣列加密解密流程陣列加密解密
- delphi加密C#解密(AES-256)加密C#解密
- AES線上加密解密-附AES128,192,256,CBC,CFB,ECB,OFB,PCBC各種加密解密原始碼加密解密原始碼
- app直播原始碼,android AES加密解密實現APP原始碼Android加密解密
- Python使用AES進行鹽值加密和解密Python加密解密
- 通過Go實現AES加密和解密工具Go加密解密
- AES實現財務資料的加密解密儲存加密解密
- AES加密加密
- 介面加密傳輸設計及AES加解密程式碼DEMO加密解密
- RSA der加密 p12解密以及配合AES使用詳解加密解密
- iOS 開發加密做法iOS加密
- C#開發中常用的加密解密方法C#加密解密
- Golang AES加密Golang加密
- Windows10 VS2017 C++使用crypto++庫加密解密(AES)WindowsC++加密解密
- Vue使用AES加密Vue加密
- 非對稱加密中,加解密和簽名加密解密
- C#開發中常用加密解密方法解析C#加密解密
- aes加密解密原始碼,含 128、192、256位,cbc、cfb、ecb、ofb、pcbc模式加密解密原始碼模式
- iOS端基於RSA公鑰加密和解密iOS加密解密
- AES-CBC 模式加密模式加密
- AES加解密使用總結解密
- Java 開發者必備:一文解決 AES 加密中的“非法金鑰大小”異常Java加密
- 加密解密加密解密
- 玩轉iOS開發:iOS中的NSOperation開發(一)iOS
- iOS BLE藍芽開發資料傳輸協議詳解 常用演算法(AES加密,HMAC_hash,PRF)iOS藍芽協議演算法加密Mac
- 使用 TypeScript 開發 Node.js 的微信開放平臺/企業微信/釘釘開放平臺訊息 AES 加密解密庫並且釋出TypeScriptNode.js加密解密
- OpenSSL 使用AES對檔案加解密解密
- CryptoJs 使用 AES CBC 加解密資料JS解密
- VUE專案 AES加解密(小白版)Vue解密
- 記一次前端CryptoJS AES解密前端JS解密