DES 加密解密詳解 CCCrypt函式
世界最美好的樣子,便是有你的日子
一, 接觸到加解密後,總結了一下AES, DES,3DES 加解密,其中 包含 <CommonCrypto/CommonCrypto.h>
裡的api
1, 主要注意 buffer 的記憶體大小。和 加解密結果的狀態, 重點是 CCCrypt
函式
直接上程式碼
首先包含加密用到的API標頭檔案
#import <CommonCrypto/CommonCrypto.h>
- 1
然後就是加密過程了
//加密過程
- (NSString*)encryptionType:(CCAlgorithm)encryptionType encodingStr:(NSString
{
// 1, 將 str裝換成 data資料
NSData * baseData = [originStrdataUsingEncoding:NSUTF8StringEncodingallowLossyConversion:YES];
size_t dataOutOffset = 0;
NSUInteger dataLength = baseData.length +100+[keydataUsingEncoding:NSUTF8StringEncodingallowLossyConversion:YES].length;
unsigned char buffer[dataLength];
memset(buffer, 0,sizeof(char));
CCCryptorStatus cryptorStatus = CCCrypt(
kCCEncrypt, // 加密還是解密
encryptionType, // 加密的方式 DES, 3DES, AES
kCCOptionPKCS7Padding|kCCOptionECBMode,
[key UTF8String], //把key轉換為C串
keyLength, //祕鑰的size,固定的 kCCKeySizeDES,kCCKeySize3DES
nil,
[baseData bytes],
[baseData length],
buffer, // 注意接收加密的buffer的大小
dataLength, //
&dataOutOffset //
);
NSString * encoding=@"";
if (cryptorStatus == kCCSuccess) {
NSData * data = [NSDatadataWithBytes:bufferlength:dataOutOffset];
encoding = [data base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
NSLog(@"加密後的串:[%@]", encoding);
}else
NSLog(@"加密失敗!%d",cryptorStatus);
return encoding;
}
最後是解密過程
//2, 解密與加密對應
- (NSString *)decryptionType:(CCAlgorithm)decryptionType decryptionStr:(NSString *)baseStr key:(NSString*)key
{
//因為加密後的data 是用 base64 顯示的,所以這裡要先將baseStr 用 base64解密成data。
NSData * baseData = [[NSDataalloc]initWithBase64EncodedString:baseStroptions:NSDataBase64DecodingIgnoreUnknownCharacters];
NSUInteger dataLength = baseData.length +100+[keydataUsingEncoding:NSUTF8StringEncodingallowLossyConversion:YES].length;
unsigned char buffer[dataLength];
memset(buffer, 0,sizeof(char));
size_t dataOffset = 0;
CCCryptorStatus status =CCCrypt(kCCDecrypt,
decryptionType,
kCCOptionPKCS7Padding|kCCOptionECBMode,
[key UTF8String],
keyLength,
nil,
[baseData bytes],
[baseData length],
buffer,
dataLength,
&dataOffset );
NSString * decodingStr =nil;
if (status == 0) {
NSData * data = [[NSDataalloc]initWithBytes:bufferlength:dataOffset];
decodingStr = [[NSStringalloc]initWithData:dataencoding:NSUTF8StringEncoding];
NSLog(@"解密後的串:[%@]", decodingStr);
}
else
NSLog(@"解密失敗;");
return decodingStr;
// CCCryptorStatus status = CCCrypt(CCOperation op,
// CCAlgorithm alg,
// CCOptions options,
// const void *key,
// size_t keyLength,
// const void *iv,
// const void *dataIn,
// size_t dataInLength,
// void *dataOut,
// size_t dataOutAvailable,
// size_t *dataOutMoved )
}
這個加解密過程支援英文,中文,數字,特殊符號!
輸出結果
2017-10-26 10:21:13.872466+0800 Encryped[1234:363896] 加密後的串:[txy0DYBpvlac2jEh5KS0uQ==]
2017-10-26 10:21:13.872746+0800 Encryped[1234:363896] 解密後的串:[crypto]
2017-10-26 10:24:27.443502+0800 Encryped[1234:363896] 加密後的串:[iW47IPpbH5Eks1APH+ZDpaUdYV/Lb/ykqybXhOfuqUItaOOUTYFwURQpZdXt+ZpD]
2017-10-26 10:24:27.443763+0800 Encryped[1234:363896] 解密後的串:[{“加密的”:”*&^%$#~!@@abcj”}]
- 1
- 2
- 3
- 4
- 5