iOS数据的加密解密

  • Base64编码解码:

  基于64个可打印的字符来表示二进制数据的方法。

Base64编码:

- (NSString *)encode:(NSString *)string
{
    //先将string转换成data
    NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];

    NSData *base64Data = [data base64EncodedDataWithOptions:0];

    NSString *baseString = [[NSString alloc]initWithData:base64Data encoding:NSUTF8StringEncoding];

    return baseString;
}

  Base64解码:

- (NSString *)dencode:(NSString *)base64String
{
    //NSData *base64data = [string dataUsingEncoding:NSUTF8StringEncoding];

    NSData *data = [[NSData alloc]initWithBase64EncodedString:base64String options:NSDataBase64DecodingIgnoreUnknownCharacters];

    NSString *string = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

    return string;
}
  • MD5(Message Digest Algorithm 5:消息摘要算法第5版)

  MD5加密是从一段字符串中通过相应特征生成一段32位的数字字母混合码。对输入信息生成唯一的固定的128位散列值(32个字符),即128个0和1的二进制位,而在实际应用开发中,通常是以16进制输出的,所以正好就是32位的16进制。MD5主要特点是 不可逆,相同数据的MD5值肯定一样。

  注意点:

  (1)一定要和后台开发人员约定好,MD5加密的位数是16位还是32位(大多数都是32位的),16位的可以通过32位的转换得到。

  (2)MD5加密区分 大小写,使用时要和后台约定好。

MD5解密网站:http://www.cmd5.com/

  加密方法:

#[email protected] MD5Encrypt : NSObject
// MD5加密
/*
*由于MD5加密是不可逆的,多用来进行验证
*/
// 32位小写
+(NSString *)MD5ForLower32Bate:(NSString *)str;
// 32位大写
+(NSString *)MD5ForUpper32Bate:(NSString *)str;
// 16为大写
+(NSString *)MD5ForUpper16Bate:(NSString *)str;
// 16位小写
+(NSString *)MD5ForLower16Bate:(NSString *)str;
@end
#import "MD5Encrypt.h"
#import <CommonCrypto/CommonDigest.h>

@implementation MD5Encrypt

#pragma mark - 32位 小写
+(NSString *)MD5ForLower32Bate:(NSString *)str{

    //要进行UTF8的转码
    const char* input = [str UTF8String];
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5(input, (CC_LONG)strlen(input), result);

    NSMutableString *digest = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
    for (NSInteger i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
        [digest appendFormat:@"%02x", result[i]];
    }

    return digest;
}

#pragma mark - 32位 大写
+(NSString *)MD5ForUpper32Bate:(NSString *)str{

    //要进行UTF8的转码
    const char* input = [str UTF8String];
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5(input, (CC_LONG)strlen(input), result);

    NSMutableString *digest = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
    for (NSInteger i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
        [digest appendFormat:@"%02X", result[i]];
    }

    return digest;
}

#pragma mark - 16位 大写
+(NSString *)MD5ForUpper16Bate:(NSString *)str{

    NSString *md5Str = [self MD5ForUpper32Bate:str];

    NSString  *string;
    for (int i=0; i<24; i++) {
        string=[md5Str substringWithRange:NSMakeRange(8, 16)];
    }
    return string;
}

#pragma mark - 16位 小写
+(NSString *)MD5ForLower16Bate:(NSString *)str{

    NSString *md5Str = [self MD5ForLower32Bate:str];

    NSString  *string;
    for (int i=0; i<24; i++) {
        string=[md5Str substringWithRange:NSMakeRange(8, 16)];
    }
    return string;
}

@end
  • AES256

   AES:高级加密标准(Advanced Encryption Standard)

    加密步骤: 字符串经过AES加密得到NSData类型数据,然后在对加密后的NSData数据进行Base64转码,得出最终的字符串

    解密步骤: 对要解密的字符串进行Base64解码得到NSData类型数据,然后对NSData数据经过AES解密,得出原字符串

//创建一个基于NSObject的AESUtility类
#import <Foundation/Foundation.h>

@interface AESUtility : NSObject
+ (NSString *)EncryptString:(NSString *)sourceStr;
+ (NSString *)DecryptString:(NSString *)secretStr;
@end
#import "AESUtility.h"

#import <CommonCrypto/CommonDigest.h>
#import <CommonCrypto/CommonCryptor.h>

//加密与解密的秘钥,保持与后台的秘钥相同
static NSString *key = @"12345678";

@implementation AESUtility

+ (NSString *)EncryptString:(NSString *)sourceStr
{
    char keyPtr[kCCKeySizeAES256 + 1];
    bzero(keyPtr, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    NSData *sourceData = [sourceStr dataUsingEncoding:NSUTF8StringEncoding];
    NSUInteger dataLength = [sourceData length];
    size_t buffersize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(buffersize);
    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding | kCCOptionECBMode, keyPtr, kCCBlockSizeAES128, NULL, [sourceData bytes], dataLength, buffer, buffersize, &numBytesEncrypted);

    if (cryptStatus == kCCSuccess) {
        NSData *encryptData = [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
        //对加密后的二进制数据进行base64转码
        return [encryptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
    }
    else
    {
        free(buffer);
        return nil;
    }
}

+ (NSString *)DecryptString:(NSString *)secretStr
{
    //先对加密的字符串进行base64解码
    NSData *decodeData = [[NSData alloc] initWithBase64EncodedString:secretStr options:NSDataBase64DecodingIgnoreUnknownCharacters];

    char keyPtr[kCCKeySizeAES256 + 1];
    bzero(keyPtr, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [decodeData length];
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    size_t numBytesDecrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding | kCCOptionECBMode, keyPtr, kCCBlockSizeAES128, NULL, [decodeData bytes], dataLength, buffer, bufferSize, &numBytesDecrypted);
    if (cryptStatus == kCCSuccess) {
        NSData *data = [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
        NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        return result;
    }
    else
    {
        free(buffer);
        return nil;
    }
}
@end
注意点:
    1. 加密与解密的秘钥key,需要与后台协商共同定义,保持与后台的秘钥相同,也可以通过接口从后台获得;
    2. 导入头文件:#import <CommonCrypto/CommonDigest.h>和#import <CommonCrypto/CommonCryptor.h>
  • RSA

原文地址:https://www.cnblogs.com/Blueleaf-tech/p/9807826.html

时间: 2024-10-11 06:02:16

iOS数据的加密解密的相关文章

iOS中使用RSA对数据进行加密解密

RSA算法是一种非对称加密算法,常被用于加密数据传输.如果配合上数字摘要算法, 也可以用于文件签名. 本文将讨论如何在iOS中使用RSA传输加密数据. 本文环境 mac os openssl-1.0.1j, openssl需要使用1.x版本, 推荐使用[homebrew](http://brew.sh/)安装. Java 8 RSA基本原理 RSA使用"秘匙对"对数据进行加密解密.在加密解密数据前,需要先生成公钥(public key)和私钥(private key). 公钥(publ

C#/IOS/Android通用加密解密方法

原文:C#/IOS/Android通用加密解密方法 公司在做移动端ios/android,服务器提供接口使用的.net,用到加密解密这一块,也在网上找了一些方法,有些是.net加密了android解密不了,或者反之.下面的是三个平台都可以加密解密的方法.加密解密中用到的key="1234578";在调取方法时传值即可. C#代码 #region 跨平台加解密(c#) /// <summary> /// 对字符串进行DES加密 /// </summary> ///

使用 GPG 对数据进行加密解密签名

一:使用 GPG 对数据进行加密解密签名 基本的工具使用 1. GPG 是GNUPG 免费开源的gpg加密工具,和同pgp兼容,pgp收费. 2. 在mac上使用https://gpgtools.org/ 下载安装之后,打开GPG Keychain mac程序, 可以点击新建创建一份自己的公钥和私钥,并把公钥上传到开源服务器上,各服务器间数据同步: 创建完成之后!我们对一个文件加密,解密,签名验证签名就可以了! 选中文件,右键,服务里面即可看到支持的工具 3. 在 windows 上使用 htt

.NET/andriod/java/iOS AES通用加密解密

移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如.NET和android或者iOS的打交道.为了让数据交互更安全,我们需要对数据进行加密传输.今天研究了一下,把几种语言的加密都实践了一遍,实现了.NET,java(andriod),iOS都同一套的加密算法,下面就分享给大家. AES加密有多种算法模式,下面提供两套模式的可用源码. 加密方式: 先将文本AES加密 返回Base64转码 解密方式: 将数据进行Base64解码 进行AES解密 一.CBC(Cipher Blo

java&amp;Ios rsa 进行加密解密

最近公司要准备做一个传输数据加密准备用RSA 首先说一下自己开发中越到到坑 开始后台做给了我字符串格式的公钥.私钥做调试 后台自己加密.解密.加签.验签,都没有问题, 我这边同样也是加密.解密.加签.验签都没有问题 加密每次都是不同的,但是加签只要铭文固定,结果是一样 问题出在,同样的铭文,前端和后台加签出来不结果 最后和后台讨论用我们前端生成的文件进行加密解密 一.首先说一下生成公钥.私钥.证书的过程 openssl genrsa -out private_key.pem 1024 opens

MAC系统用RSA 对数据进行加密解密

创建密钥对 在终端中一次输入下面的脚本 openssl genrsa -out private_key.pem 1024 openssl req -new -key private_key.pem -out rsaCertReq.csr openssl x509 -req -days 3650 -in rsaCertReq.csr -signkey private_key.pem -out rsaCert.crt openssl x509 -outform der -in rsaCert.crt

数据的加密解密

所谓对数据的加密,即就是利用各种算法对数据进行封装,使通信双方能安全的进行数据通信,防止数据被篡改.一.加密算法和协议1.对称加密技术对称加密技术是发送者和接收者采用相同的密钥进行对数据的封装和解封装主流的对称加密算法有:DES:此算法是将64位明文转变为64位密文,实际加密长度为56位,其余为校验位3DES,DES3:是基于DES算法,使用三次56位密钥对数据进行加密AES:Blowfish:可参考https://baike.baidu.com/item/BLOWFISH/1677776?fr

iOS之钥匙串加密解密

注意:不需要看这里面的代码实现 KeychainItemWrapper.h #import <UIKit/UIKit.h> /* The KeychainItemWrapper class is an abstraction layer for the iPhone Keychain communication. It is merely a simple wrapper to provide a distinct barrier between all the idiosyncracies

iOS之AES加密解密

//AES加密解密#import <CommonCrypto/CommonCrypto.h>#import <CommonCrypto/CommonDigest.h> //AES128位加密 base64编码 注:kCCKeySizeAES128点进去可以更换256位加密 -(NSString *)AES128Encrypt:(NSString *)plainText key:(NSString *)key { char keyPtr[kCCKeySizeAES128+1];//