200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > ios java aes128_iOS AES128加密解密的两种模式(CBC和ECB)

ios java aes128_iOS AES128加密解密的两种模式(CBC和ECB)

时间:2018-12-21 18:19:07

相关推荐

ios java aes128_iOS  AES128加密解密的两种模式(CBC和ECB)

原理什么的不在本篇的范畴,网上很多大牛总结的很好了 请参考AES加密过程详解

1. 苹果默认是CBC模式的,有文档为证:

/*!

@enum CCOptions

@abstract Options flags, passed to CCCryptorCreate().

@constant kCCOptionPKCS7Padding Perform PKCS7 padding.

@constant kCCOptionECBMode Electronic Code Book Mode.

Default is CBC.

*/

enum {

/* options for block ciphers */

kCCOptionPKCS7Padding = 0x0001,

kCCOptionECBMode = 0x0002

/* stream ciphers currently have no options */

};

2. 一般来说,我们客户端单纯只是做做业务的话,接触的加密算法或者需要我们去深入底层的东西少之又少,通常是后端提供加密的key(秘钥)和iv(偏移量)给前端小伙伴们使用.

3. CBC和EBC,在调用方看来,仅仅只是一个枚举值的区别

//CBC模式

kCCOptionPKCS7Padding

//ECB模式

kCCOptionPKCS7Padding | kCCOptionECBMode

4. 下面👇贴一段ECB加密解密的代码

@implementation NSData (AESEncryption)

//AES128加密

- (NSData *)AES128ParmEncryptWithKey:(NSString *)key iv:(NSString *)iv

{

char keyPtr[kCCKeySizeAES128+1];

bzero(keyPtr, sizeof(keyPtr));

[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

char ivPtr[kCCBlockSizeAES128 + 1];

bzero(ivPtr, sizeof(ivPtr));

[iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];

NSUInteger dataLength = [self length];

size_t bufferSize = dataLength + kCCBlockSizeAES128;

void *buffer = malloc(bufferSize);

size_t numBytesEncrypted = 0;

CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,

kCCOptionPKCS7Padding | kCCOptionECBMode,

keyPtr, kCCBlockSizeAES128,

ivPtr,

[self bytes], dataLength,

buffer, bufferSize,

&numBytesEncrypted);

if (cryptStatus == kCCSuccess) {

return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];

}

free(buffer);

return nil;

}

//解密

- (NSData *)AES128ParmDecryptWithKey:(NSString *)key iv:(NSString *)iv

{

char keyPtr[kCCKeySizeAES128 + 1];

bzero(keyPtr, sizeof(keyPtr));

[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

char ivPtr[kCCBlockSizeAES128 + 1];

bzero(ivPtr, sizeof(ivPtr));

[iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];

NSUInteger dataLength = [self length];

size_t bufferSize = dataLength + kCCBlockSizeAES128;

void *buffer = malloc(bufferSize);

size_t numBytesDecrypted = 0;

CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128,

kCCOptionPKCS7Padding|kCCOptionECBMode,

keyPtr, kCCBlockSizeAES128,

ivPtr,

[self bytes], dataLength,

buffer, bufferSize,

&numBytesDecrypted);

if (cryptStatus == kCCSuccess) {

return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];

}

free(buffer);

return nil;

}

@end

5. 最后在Demo地址

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。