在发送数据中采用二进制编码,但还是明文传输,可采用base64编码(加密)将二进制数据转成另外格式的字符串.
base64的特点:编码之后,只会由64字符生成:a~z A~Z / + 加上一个辅助字符=(补充两个0就是一个=)
方法:采用:data=[string dataUsingEncoding:NSUTF8StringEncoding];字符串转成二进制
[data base64Encoding];二进制数据进行base64编码,得到加密后的字符串
采用:data=[[NSData alloc]initWithBase64EncodedData:str(base64加密的字符串) options:0];将base64加密的字符串转成二进制数据
[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];将二进制数据转成明文的字符串
RSA算法:找两个很大的质数:(至少100位以上)
加密用明文^P次方
解密用密文^Q次方
P可称为公钥
Q可称为私钥
DES,AES都是有RSA衍生的,比RSA更加难破解
MD5加密:用散列函数(HASH)函数(同时时间戳加盐避免被解密,)
如果这种加密方式还不行,可以使用辅助手段,记录ip,手机短信验证码,操作异常等.
对于本地不能存明文密码(采用钥匙串)
+ (NSString * _Nullable)MD5:(NSString * _Nonnull)string {//MD5加密
if (string == nil || [string length] == 0) {
return nil;
}
unsigned char digest[CC_MD5_DIGEST_LENGTH], i;
CC_MD5([string UTF8String], (int)[string lengthOfBytesUsingEncoding:NSUTF8StringEncoding], digest);
NSMutableString *ms = [NSMutableString string];
for (i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
[ms appendFormat: @"%02x", (int)(digest[i])];
}
return [ms copy];
}
+ (NSString * _Nullable)SHA1:(NSString * _Nonnull)string {//SHA加密
if (string == nil || [string length] == 0) {
return nil;
}
unsigned char digest[CC_SHA1_DIGEST_LENGTH], i;
CC_SHA1([string UTF8String], (int)[string lengthOfBytesUsingEncoding:NSUTF8StringEncoding], digest);
NSMutableString *ms = [NSMutableString string];
for (i = 0; i < CC_SHA1_DIGEST_LENGTH; i++) {
[ms appendFormat: @"%02x", (int)(digest[i])];
}
return [ms copy];
}
+ (NSString * _Nullable)SHA256:(NSString * _Nonnull)string {//SHA216加密
if (string == nil || [string length] == 0) {
return nil;
}
unsigned char digest[CC_SHA256_DIGEST_LENGTH], i;
CC_SHA256([string UTF8String], (int)[string lengthOfBytesUsingEncoding:NSUTF8StringEncoding], digest);
NSMutableString *ms = [NSMutableString string];
for (i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
[ms appendFormat: @"%02x", (int)(digest[i])];
}
return [ms copy];
}
+ (NSString * _Nullable)SHA512:(NSString * _Nonnull)string {//SHA512加密
if (string == nil || [string length] == 0) {
return nil;
}
unsigned char digest[CC_SHA512_DIGEST_LENGTH], i;
CC_SHA512([string UTF8String], (int)[string lengthOfBytesUsingEncoding:NSUTF8StringEncoding], digest);
NSMutableString *ms = [NSMutableString string];
for (i = 0; i < CC_SHA512_DIGEST_LENGTH; i++)
{
[ms appendFormat: @"%02x", (int)(digest[i])];
}
return [ms copy];
}
+ (NSData * _Nullable)AES128EncryptData:(NSData * _Nonnull)data withKey:(NSString * _Nonnull)key {//AES128加密
char keyPtr[kCCKeySizeAES128+1];
bzero(keyPtr, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [data length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, keyPtr, kCCKeySizeAES128, NULL, [data bytes], dataLength, buffer, bufferSize, &numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
free(buffer);
return nil;
}
+ (NSData *)AES128DecryptData:(NSData * _Nonnull)data withKey:(NSString * _Nonnull)key {//AES128解密
char keyPtr[kCCKeySizeAES128+1];
bzero(keyPtr, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [data length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesDecrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, keyPtr, kCCKeySizeAES128, NULL, [data bytes], dataLength, buffer, bufferSize, &numBytesDecrypted);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
}
free(buffer);
return nil;
}
+ (NSData * _Nullable)AES256EncryptData:(NSData * _Nonnull)data withKey:(NSString * _Nonnull)key {//AES256加密
char keyPtr[kCCKeySizeAES256+1];
bzero(keyPtr, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [data length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, keyPtr, kCCKeySizeAES256, NULL, [data bytes], dataLength, buffer, bufferSize, &numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
free(buffer);
return nil;
}
+ (NSData *)AES256DecryptData:(NSData * _Nonnull)data withKey:(NSString * _Nonnull)key {//AES256解密
char keyPtr[kCCKeySizeAES256+1];
bzero(keyPtr, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [data length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesDecrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, keyPtr, kCCKeySizeAES256, NULL, [data bytes], dataLength, buffer, bufferSize, &numBytesDecrypted);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
}
free(buffer);
return nil;
}
+ (NSData * _Nullable)AES128EncryptString:(NSString * _Nonnull)string withKey:(NSString * _Nonnull)key {
return [BFCryptor AES128EncryptData:[string convertToNSData] withKey:key];
}
+ (NSData * _Nullable)AES128DecryptString:(NSString * _Nonnull)string withKey:(NSString * _Nonnull)key {
return [BFCryptor AES128DecryptData:[string convertToNSData] withKey:key];
}
+ (NSData * _Nullable)AES256EncryptString:(NSString * _Nonnull)string withKey:(NSString * _Nonnull)key {
return [BFCryptor AES256EncryptData:[string convertToNSData] withKey:key];
}
+ (NSData * _Nullable)AES256DecryptString:(NSString * _Nonnull)string withKey:(NSString * _Nonnull)key {
return [BFCryptor AES256DecryptData:[string convertToNSData] withKey:key];
}