NSUInteger 和 NSInteger 区别和联系

NSUInteger是无符号的整型, NSInteger是有符号的整型

 

 

索引值要用NSUInteger例如:NSUInteger row=[indexPath row]

 

因为索引值永远不小于0.是非负数,所有用NSUInteger来代表更加准确。

 

更多信息请参考:

 

http://www.apple.com.cn/developer/mac/library/documentation/Cocoa/Conceptual/Cocoa64BitGuide/64BitChangesCocoa/64BitChangesCocoa.html

在iOS中使用OpenSSL实现AES-GCM和ECB加密解密需要以下步骤: 1. 下载OpenSSL库并将其添加到iOS项目中。 2. 导入OpenSSL库头文件: ```objc #import <openssl/evp.h> #import <openssl/aes.h> ``` 3. 实现AES-GCM加密解密: ```objc // AES-GCM加密 + (NSData *)AESGCMEncryptWithKey:(NSData *)key iv:(NSData *)iv aad:(NSData *)aad plainText:(NSData *)plainText tagLength:(NSUInteger)tagLength { EVP_CIPHER_CTX *ctx; int len, outlen; unsigned char *outbuf; NSData *tag = nil; NSData *cipherText = nil; // 初始化EVP_CIPHER_CTX ctx = EVP_CIPHER_CTX_new(); EVP_EncryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, NULL, NULL); // 设置key和iv EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, (int)iv.length, NULL); EVP_EncryptInit_ex(ctx, NULL, NULL, key.bytes, iv.bytes); // 设置aad EVP_EncryptUpdate(ctx, NULL, &len, aad.bytes, (int)aad.length); // 加密明文 outbuf = malloc(plainText.length + AES_BLOCK_SIZE); EVP_EncryptUpdate(ctx, outbuf, &len, plainText.bytes, (int)plainText.length); cipherText = [NSData dataWithBytes:outbuf length:len]; free(outbuf); // 获取tag outbuf = malloc(tagLength); EVP_EncryptFinal_ex(ctx, outbuf, &outlen); tag = [NSData dataWithBytes:outbuf length:outlen]; free(outbuf); // 释放EVP_CIPHER_CTX EVP_CIPHER_CTX_free(ctx); // 返回加密结果和tag NSMutableData *resultData = [NSMutableData dataWithData:cipherText]; [resultData appendData:tag]; return resultData; } // AES-GCM解密 + (NSData *)AESGCMDecryptWithKey:(NSData *)key iv:(NSData *)iv aad:(NSData *)aad cipherText:(NSData *)cipherText tagLength:(NSUInteger)tagLength { EVP_CIPHER_CTX *ctx; int len, outlen; unsigned char *outbuf; NSData *tag = nil; NSData *plainText = nil; // 初始化EVP_CIPHER_CTX ctx = EVP_CIPHER_CTX_new(); EVP_DecryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, NULL, NULL); // 设置key和iv EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, (int)iv.length, NULL); EVP_DecryptInit_ex(ctx, NULL, NULL, key.bytes, iv.bytes); // 设置aad EVP_DecryptUpdate(ctx, NULL, &len, aad.bytes, (int)aad.length); // 解密密文 outbuf = malloc(cipherText.length); EVP_DecryptUpdate(ctx, outbuf, &len, cipherText.bytes, (int)cipherText.length - tagLength); plainText = [NSData dataWithBytes:outbuf length:len]; free(outbuf); // 获取tag tag = [cipherText subdataWithRange:NSMakeRange(cipherText.length - tagLength, tagLength)]; EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_TAG, (int)tag.length, (void *)tag.bytes); // 验证tag if (EVP_DecryptFinal_ex(ctx, NULL, &outlen) <= 0) { return nil; // tag验证失败 } // 释放EVP_CIPHER_CTX EVP_CIPHER_CTX_free(ctx); // 返回解密结果 return plainText; } ``` 4. 实现ECB加密解密: ```objc // ECB加密 + (NSData *)ECBEncryptWithKey:(NSData *)key plainText:(NSData *)plainText { EVP_CIPHER_CTX *ctx; int len; unsigned char *outbuf; NSData *cipherText = nil; // 初始化EVP_CIPHER_CTX ctx = EVP_CIPHER_CTX_new(); EVP_EncryptInit_ex(ctx, EVP_aes_256_ecb(), NULL, key.bytes, NULL); // 加密明文 outbuf = malloc(plainText.length + AES_BLOCK_SIZE); EVP_EncryptUpdate(ctx, outbuf, &len, plainText.bytes, (int)plainText.length); cipherText = [NSData dataWithBytes:outbuf length:len]; free(outbuf); // 释放EVP_CIPHER_CTX EVP_CIPHER_CTX_free(ctx); // 返回加密结果 return cipherText; } // ECB解密 + (NSData *)ECBDecryptWithKey:(NSData *)key cipherText:(NSData *)cipherText { EVP_CIPHER_CTX *ctx; int len; unsigned char *outbuf; NSData *plainText = nil; // 初始化EVP_CIPHER_CTX ctx = EVP_CIPHER_CTX_new(); EVP_DecryptInit_ex(ctx, EVP_aes_256_ecb(), NULL, key.bytes, NULL); // 解密密文 outbuf = malloc(cipherText.length); EVP_DecryptUpdate(ctx, outbuf, &len, cipherText.bytes, (int)cipherText.length); plainText = [NSData dataWithBytes:outbuf length:len]; free(outbuf); // 释放EVP_CIPHER_CTX EVP_CIPHER_CTX_free(ctx); // 返回解密结果 return plainText; } ``` 以上就是使用OpenSSL实现AES-GCM和ECB加密解密的步骤,需要注意的是,在iOS13及以上版本中,Apple已经将OpenSSL库废弃,推荐使用自带的CryptoKit框架实现加密解密。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值