├── .DS_Store ├── EncryptionTools ├── .DS_Store ├── Openssl编程.pdf ├── EncryptionTools │ ├── .DS_Store │ ├── Encryptions │ │ ├── .DS_Store │ │ ├── RSAEncrypt │ │ │ ├── RSA.h │ │ │ └── RSA.m │ │ ├── Hash │ │ │ ├── NSString+Hash.h │ │ │ └── NSString+Hash.m │ │ ├── Base64.h │ │ ├── NSString+Encryption │ │ │ ├── NSString+Encryption.h │ │ │ └── NSString+Encryption.m │ │ ├── CocoaSecurity.h │ │ ├── Base64.m │ │ └── CocoaSecurity.m │ ├── ViewController.h │ ├── AppDelegate.h │ ├── main.m │ ├── Assets.xcassets │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── Info.plist │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ ├── AppDelegate.m │ └── ViewController.m └── EncryptionTools.xcodeproj │ ├── project.xcworkspace │ └── contents.xcworkspacedata │ └── project.pbxproj ├── .gitignore └── README.md /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mddios/EncryptionTools/HEAD/.DS_Store -------------------------------------------------------------------------------- /EncryptionTools/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mddios/EncryptionTools/HEAD/EncryptionTools/.DS_Store -------------------------------------------------------------------------------- /EncryptionTools/Openssl编程.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mddios/EncryptionTools/HEAD/EncryptionTools/Openssl编程.pdf -------------------------------------------------------------------------------- /EncryptionTools/EncryptionTools/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mddios/EncryptionTools/HEAD/EncryptionTools/EncryptionTools/.DS_Store -------------------------------------------------------------------------------- /EncryptionTools/EncryptionTools/Encryptions/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mddios/EncryptionTools/HEAD/EncryptionTools/EncryptionTools/Encryptions/.DS_Store -------------------------------------------------------------------------------- /EncryptionTools/EncryptionTools.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /EncryptionTools/EncryptionTools/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // EncryptionTools 4 | // 5 | // Created by mdd on 16/5/17. 6 | // Copyright © 2016年 com.personal. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ViewController : UIViewController 12 | 13 | 14 | @end 15 | 16 | -------------------------------------------------------------------------------- /EncryptionTools/EncryptionTools/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // EncryptionTools 4 | // 5 | // Created by mdd on 16/5/17. 6 | // Copyright © 2016年 com.personal. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | 16 | @end 17 | 18 | -------------------------------------------------------------------------------- /EncryptionTools/EncryptionTools/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // EncryptionTools 4 | // 5 | // Created by mdd on 16/5/17. 6 | // Copyright © 2016年 com.personal. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) { 13 | @autoreleasepool { 14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /EncryptionTools/EncryptionTools/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | } 33 | ], 34 | "info" : { 35 | "version" : 1, 36 | "author" : "xcode" 37 | } 38 | } -------------------------------------------------------------------------------- /EncryptionTools/EncryptionTools/Encryptions/RSAEncrypt/RSA.h: -------------------------------------------------------------------------------- 1 | /* 2 | @author: ideawu 3 | @link: https://github.com/ideawu/Objective-C-RSA 4 | */ 5 | 6 | #import 7 | 8 | @interface RSA : NSObject 9 | 10 | // return base64 encoded string 11 | + (NSString *)encryptString:(NSString *)str publicKey:(NSString *)pubKey; 12 | // return raw data 13 | + (NSData *)encryptData:(NSData *)data publicKey:(NSString *)pubKey; 14 | // return base64 encoded string 15 | // enc with private key NOT working YET! 16 | //+ (NSString *)encryptString:(NSString *)str privateKey:(NSString *)privKey; 17 | // return raw data 18 | //+ (NSData *)encryptData:(NSData *)data privateKey:(NSString *)privKey; 19 | 20 | // decrypt base64 encoded string, convert result to string(not base64 encoded) 21 | + (NSString *)decryptString:(NSString *)str publicKey:(NSString *)pubKey; 22 | + (NSData *)decryptData:(NSData *)data publicKey:(NSString *)pubKey; 23 | + (NSString *)decryptString:(NSString *)str privateKey:(NSString *)privKey; 24 | + (NSData *)decryptData:(NSData *)data privateKey:(NSString *)privKey; 25 | 26 | @end 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata 19 | 20 | ## Other 21 | *.xccheckout 22 | *.moved-aside 23 | *.xcuserstate 24 | *.xcscmblueprint 25 | 26 | ## Obj-C/Swift specific 27 | *.hmap 28 | *.ipa 29 | 30 | # CocoaPods 31 | # 32 | # We recommend against adding the Pods directory to your .gitignore. However 33 | # you should judge for yourself, the pros and cons are mentioned at: 34 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 35 | # 36 | # Pods/ 37 | 38 | # Carthage 39 | # 40 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 41 | # Carthage/Checkouts 42 | 43 | Carthage/Build 44 | 45 | # fastlane 46 | # 47 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 48 | # screenshots whenever they are needed. 49 | # For more information about the recommended setup visit: 50 | # https://github.com/fastlane/fastlane/blob/master/docs/Gitignore.md 51 | 52 | fastlane/report.xml 53 | fastlane/screenshots 54 | -------------------------------------------------------------------------------- /EncryptionTools/EncryptionTools/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /EncryptionTools/EncryptionTools/Encryptions/Hash/NSString+Hash.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSString+Hash.h 3 | // Encryptions 4 | // 5 | // Created by mdd on 15/5/17. 6 | // Copyright © 2015年 com.personal. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface NSString (Hash) 12 | 13 | /** 14 | 返回结果:32长度(128位,16字节,16进制字符输出则为32字节长度) 终端命令:md5 -s "123" 15 | */ 16 | - (NSString *)md5Hash; 17 | 18 | /** 19 | 返回结果:40长度 终端命令:echo -n "123" | openssl sha -sha1 20 | */ 21 | - (NSString *)sha1Hash; 22 | 23 | /** 24 | 返回结果:56长度 终端命令:echo -n "123" | openssl sha -sha224 25 | */ 26 | - (NSString *)sha224Hash; 27 | 28 | /** 29 | 返回结果:64长度 终端命令:echo -n "123" | openssl sha -sha256 30 | */ 31 | - (NSString *)sha256Hash; 32 | 33 | /** 34 | 返回结果:96长度 终端命令:echo -n "123" | openssl sha -sha384 35 | */ 36 | - (NSString *)sha384Hash; 37 | 38 | /** 39 | 返回结果:128长度 终端命令:echo -n "123" | openssl sha -sha512 40 | */ 41 | - (NSString *)sha512Hash; 42 | 43 | #pragma mark - HMAC 44 | 45 | /// 返回结果:32长度 终端命令:echo -n "123" | openssl dgst -md5 -hmac "123" 46 | - (NSString *)hmacMD5WithKey:(NSString *)key; 47 | 48 | /// 返回结果:40长度 echo -n "123" | openssl sha -sha1 -hmac "123" 49 | - (NSString *)hmacSHA1WithKey:(NSString *)key; 50 | - (NSString *)hmacSHA224WithKey:(NSString *)key; 51 | - (NSString *)hmacSHA256WithKey:(NSString *)key; 52 | - (NSString *)hmacSHA384WithKey:(NSString *)key; 53 | - (NSString *)hmacSHA512WithKey:(NSString *)key; 54 | @end 55 | -------------------------------------------------------------------------------- /EncryptionTools/EncryptionTools/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /EncryptionTools/EncryptionTools/Encryptions/Base64.h: -------------------------------------------------------------------------------- 1 | // 2 | // Base64.h 3 | // 4 | // Version 1.2 5 | // 6 | // Created by Nick Lockwood on 12/01/2012. 7 | // Copyright (C) 2012 Charcoal Design 8 | // 9 | // Distributed under the permissive zlib License 10 | // Get the latest version from here: 11 | // 12 | // https://github.com/nicklockwood/Base64 13 | // 14 | // This software is provided 'as-is', without any express or implied 15 | // warranty. In no event will the authors be held liable for any damages 16 | // arising from the use of this software. 17 | // 18 | // Permission is granted to anyone to use this software for any purpose, 19 | // including commercial applications, and to alter it and redistribute it 20 | // freely, subject to the following restrictions: 21 | // 22 | // 1. The origin of this software must not be misrepresented; you must not 23 | // claim that you wrote the original software. If you use this software 24 | // in a product, an acknowledgment in the product documentation would be 25 | // appreciated but is not required. 26 | // 27 | // 2. Altered source versions must be plainly marked as such, and must not be 28 | // misrepresented as being the original software. 29 | // 30 | // 3. This notice may not be removed or altered from any source distribution. 31 | // 32 | 33 | #import 34 | 35 | 36 | @interface NSData (Base64) 37 | 38 | + (NSData *)dataWithBase64EncodedString:(NSString *)string; 39 | - (NSString *)base64EncodedStringWithWrapWidth:(NSUInteger)wrapWidth; 40 | - (NSString *)base64EncodedString; 41 | 42 | @end 43 | 44 | 45 | @interface NSString (Base64) 46 | 47 | + (NSString *)stringWithBase64EncodedString:(NSString *)string; 48 | - (NSString *)base64EncodedStringWithWrapWidth:(NSUInteger)wrapWidth; 49 | - (NSString *)base64EncodedString; 50 | - (NSString *)base64DecodedString; 51 | - (NSData *)base64DecodedData; 52 | 53 | @end 54 | -------------------------------------------------------------------------------- /EncryptionTools/EncryptionTools/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // EncryptionTools 4 | // 5 | // Created by mdd on 16/5/17. 6 | // Copyright © 2016年 com.personal. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | @interface AppDelegate () 12 | 13 | @end 14 | 15 | @implementation AppDelegate 16 | 17 | 18 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 19 | // Override point for customization after application launch. 20 | return YES; 21 | } 22 | 23 | - (void)applicationWillResignActive:(UIApplication *)application { 24 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 25 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 26 | } 27 | 28 | - (void)applicationDidEnterBackground:(UIApplication *)application { 29 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 30 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 31 | } 32 | 33 | - (void)applicationWillEnterForeground:(UIApplication *)application { 34 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 35 | } 36 | 37 | - (void)applicationDidBecomeActive:(UIApplication *)application { 38 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 39 | } 40 | 41 | - (void)applicationWillTerminate:(UIApplication *)application { 42 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 43 | } 44 | 45 | @end 46 | -------------------------------------------------------------------------------- /EncryptionTools/EncryptionTools/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /EncryptionTools/EncryptionTools/Encryptions/NSString+Encryption/NSString+Encryption.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSString+Encryption.h 3 | // EncryptionTools 4 | // 5 | // Created by mdd on 16/4/2. 6 | // Copyright © 2016年 com.personal. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | #import 12 | 13 | /// 默认使用kCCOptionPKCS7Padding填充 14 | #define kPaddingMode kCCOptionPKCS7Padding 15 | 16 | @interface NSString (Encryption) 17 | 18 | #pragma mark - AES加密 19 | 20 | /** 21 | AES-CBC模式加密,默认模式 22 | @param key Hex形式,密钥支持128 192 256bit,16、24、32字节,转换为16进制字符串长度为32、48、64,长度错误将抛出异常 23 | @param iv 进制字符串形式;初始化向量iv为16字节。如果为nil,则初始化向量为0 24 | @return 加密结果为base64编码 25 | */ 26 | - (NSString *)aesEncryptWithHexKey:(NSString *)key hexIv:(NSString *)iv; 27 | 28 | /** 29 | AES-CBC模式加密,默认模式 30 | @param key 密钥支持128 192 256bit,16、24、32字节,长度错误将抛出异常 31 | @param iv 进制字符串形式;初始化向量iv为16字节。如果为nil,则初始化向量为0 32 | @return 加密结果为base64编码 33 | */ 34 | - (NSString *)aesEncryptWithKey:(NSString *)key iv:(NSString *)iv; 35 | 36 | /** 37 | AES-CBC模式加密,默认模式 38 | @param data 要加密的数据 39 | @param key 密钥支持128 192 256bit,16、24、32字节,长度错误将抛出异常 40 | @param iv 初始化向量iv为16字节。如果为nil,则初始化向量为0 41 | @return 加密结果为NSData形式 42 | */ 43 | - (NSData *)aesEncryptWithDataKey:(NSData *)key dataIv:(NSData *)iv; 44 | 45 | /** 46 | AES-ECB模式加密 47 | @param key Hex形式,密钥支持128 192 256bit,16、24、32字节,转换为16进制字符串长度为32、48、64,长度错误将抛出异常 48 | @return 加密结果为base64编码 49 | */ 50 | - (NSString *)aesECBEncryptWithHexKey:(NSString *)key; 51 | 52 | /** 53 | AES-ECB模式加密 54 | @param key base64形式,密钥支持128 192 256bit,16、24、32字节,转换为16进制字符串长度为32、48、64,长度错误将抛出异常 55 | @return 加密结果为base64编码 56 | */ 57 | - (NSString *)aesECBEncryptWithBase64Key:(NSString *)key; 58 | 59 | /** 60 | AES-ECB模式加密 61 | @param key 字符串形式,密钥支持128 192 256bit,16、24、32字节,长度错误将抛出异常 62 | @return 加密结果为base64编码 63 | */ 64 | - (NSString *)aesECBEncryptWithKey:(NSString *)key; 65 | 66 | /** 67 | AES-ECB模式加密 68 | @param key 密钥支持128 192 256bit,16、24、32字节,长度错误将抛出异常 69 | */ 70 | - (NSData *)aesECBEncryptWithDataKey:(NSData *)key; 71 | 72 | #pragma mark - AES解密 73 | 74 | /** 75 | AES-CBC模式解密,要求NSString为base64的结果 76 | @param key 密钥支持128 192 256bit,16、24、32字节,长度错误将抛出异常 77 | @param iv 进制字符串形式;初始化向量iv为16字节。如果为nil,则初始化向量为0 78 | */ 79 | - (NSString *)aesBase64StringDecryptWithHexKey:(NSString *)key hexIv:(NSString *)iv; 80 | 81 | /** 82 | AES-CBC模式解密 83 | @param key 密钥支持128 192 256bit,16、24、32字节,长度错误将抛出异常 84 | @param iv 初始化向量iv为16字节。如果为nil,则初始化向量为0 85 | */ 86 | + (NSData *)aesDecryptWithData:(NSData *)data dataKey:(NSData *)key dataIv:(NSData *)iv; 87 | 88 | /* 89 | ECB模式解密,要求输入为Base64格式的nsstring,返回为NSString 90 | */ 91 | - (NSString *)aesECBBase64StringDecryptWithHexKey:(NSString *)key; 92 | 93 | /* 94 | ECB模式解密,要求输入为Base64格式,返回为NSString 95 | */ 96 | - (NSString *)aesECBBase64StringDecryptWithBase64Key:(NSString *)key; 97 | 98 | /* 99 | ECB模式解密,返回为NSData 100 | */ 101 | + (NSData *)aesECBDecryptWithData:(NSData *)data withDataKey:(NSData *)key; 102 | 103 | 104 | ///* 105 | // ECB模式解密,返回base64编码 106 | // */ 107 | //- (NSString *)aesECBDecryptWithHexKey:(NSString *)key; 108 | // 109 | ///* 110 | // ECB模式解密,返回NSData 111 | // */ 112 | //- (NSData *)aesECBDecryptWithDataKey:(NSData *)key; 113 | 114 | #pragma mark - DES加密 115 | 116 | /* 117 | DES加密 key为NSString形式 结果返回base64编码 118 | */ 119 | - (NSString *)desEncryptWithKey:(NSString *)key; 120 | 121 | /* 122 | DES加密 key为NSData形式 结果返回NSData 123 | */ 124 | - (NSData *)desEncryptWithDataKey:(NSData *)key; 125 | 126 | #pragma mark - DES解密 127 | 128 | /* 129 | DES解密,字符串必须为base64格式,key为字符串形式 130 | */ 131 | - (NSString *)desDecryptWithKey:(NSString *)key; 132 | 133 | /* 134 | DES解密 135 | */ 136 | + (NSData *)desDecryptWithData:(NSData *)data dataKey:(NSData *)key; 137 | 138 | @end 139 | 140 | 141 | 142 | -------------------------------------------------------------------------------- /EncryptionTools/EncryptionTools/Encryptions/CocoaSecurity.h: -------------------------------------------------------------------------------- 1 | /* 2 | CocoaSecurity 1.1 3 | 4 | Created by Kelp on 12/5/12. 5 | Copyright (c) 2012 Kelp http://kelp.phate.org/ 6 | MIT License 7 | 8 | CocoaSecurity is core. It provides AES encrypt, AES decrypt, Hash(MD5, HmacMD5, SHA1~SHA512, HmacSHA1~HmacSHA512) messages. 9 | */ 10 | 11 | #import 12 | #import 13 | 14 | 15 | #pragma mark - CocoaSecurityResult 16 | @interface CocoaSecurityResult : NSObject 17 | 18 | @property (strong, nonatomic, readonly) NSData *data; 19 | @property (strong, nonatomic, readonly) NSString *utf8String; 20 | @property (strong, nonatomic, readonly) NSString *hex; 21 | @property (strong, nonatomic, readonly) NSString *hexLower; 22 | @property (strong, nonatomic, readonly) NSString *base64; 23 | 24 | - (id)initWithBytes:(unsigned char[])initData length:(NSUInteger)length; 25 | 26 | @end 27 | 28 | 29 | #pragma mark - CocoaSecurity 30 | @interface CocoaSecurity : NSObject 31 | #pragma mark - AES Encrypt 32 | + (CocoaSecurityResult *)aesEncrypt:(NSString *)data key:(NSString *)key; 33 | + (CocoaSecurityResult *)aesEncrypt:(NSString *)data hexKey:(NSString *)key hexIv:(NSString *)iv; 34 | + (CocoaSecurityResult *)aesEncrypt:(NSString *)data key:(NSData *)key iv:(NSData *)iv; 35 | + (CocoaSecurityResult *)aesEncryptWithData:(NSData *)data key:(NSData *)key iv:(NSData *)iv; 36 | #pragma mark AES Decrypt 37 | + (CocoaSecurityResult *)aesDecryptWithBase64:(NSString *)data key:(NSString *)key; 38 | + (CocoaSecurityResult *)aesDecryptWithBase64:(NSString *)data hexKey:(NSString *)key hexIv:(NSString *)iv; 39 | + (CocoaSecurityResult *)aesDecryptWithBase64:(NSString *)data key:(NSData *)key iv:(NSData *)iv; 40 | + (CocoaSecurityResult *)aesDecryptWithData:(NSData *)data key:(NSData *)key iv:(NSData *)iv; 41 | 42 | #pragma mark - MD5 43 | + (CocoaSecurityResult *)md5:(NSString *)hashString; 44 | + (CocoaSecurityResult *)md5WithData:(NSData *)hashData; 45 | #pragma mark HMAC-MD5 46 | + (CocoaSecurityResult *)hmacMd5:(NSString *)hashString hmacKey:(NSString *)key; 47 | + (CocoaSecurityResult *)hmacMd5WithData:(NSData *)hashData hmacKey:(NSString *)key; 48 | 49 | #pragma mark - SHA 50 | + (CocoaSecurityResult *)sha1:(NSString *)hashString; 51 | + (CocoaSecurityResult *)sha1WithData:(NSData *)hashData; 52 | + (CocoaSecurityResult *)sha224:(NSString *)hashString; 53 | + (CocoaSecurityResult *)sha224WithData:(NSData *)hashData; 54 | + (CocoaSecurityResult *)sha256:(NSString *)hashString; 55 | + (CocoaSecurityResult *)sha256WithData:(NSData *)hashData; 56 | + (CocoaSecurityResult *)sha384:(NSString *)hashString; 57 | + (CocoaSecurityResult *)sha384WithData:(NSData *)hashData; 58 | + (CocoaSecurityResult *)sha512:(NSString *)hashString; 59 | + (CocoaSecurityResult *)sha512WithData:(NSData *)hashData; 60 | #pragma mark HMAC-SHA 61 | + (CocoaSecurityResult *)hmacSha1:(NSString *)hashString hmacKey:(NSString *)key; 62 | + (CocoaSecurityResult *)hmacSha1WithData:(NSData *)hashData hmacKey:(NSString *)key; 63 | + (CocoaSecurityResult *)hmacSha224:(NSString *)hashString hmacKey:(NSString *)key; 64 | + (CocoaSecurityResult *)hmacSha224WithData:(NSData *)hashData hmacKey:(NSString *)key; 65 | + (CocoaSecurityResult *)hmacSha256:(NSString *)hashString hmacKey:(NSString *)key; 66 | + (CocoaSecurityResult *)hmacSha256WithData:(NSData *)hashData hmacKey:(NSString *)key; 67 | + (CocoaSecurityResult *)hmacSha384:(NSString *)hashString hmacKey:(NSString *)key; 68 | + (CocoaSecurityResult *)hmacSha384WithData:(NSData *)hashData hmacKey:(NSString *)key; 69 | + (CocoaSecurityResult *)hmacSha512:(NSString *)hashString hmacKey:(NSString *)key; 70 | + (CocoaSecurityResult *)hmacSha512WithData:(NSData *)hashData hmacKey:(NSString *)key; 71 | @end 72 | 73 | 74 | #pragma mark - CocoaSecurityEncoder 75 | @interface CocoaSecurityEncoder : NSObject 76 | - (NSString *)base64:(NSData *)data; 77 | - (NSString *)hex:(NSData *)data useLower:(BOOL)isOutputLower; 78 | @end 79 | 80 | 81 | #pragma mark - CocoaSecurityDecoder 82 | @interface CocoaSecurityDecoder : NSObject 83 | - (NSData *)base64:(NSString *)data; 84 | - (NSData *)hex:(NSString *)data; 85 | @end 86 | -------------------------------------------------------------------------------- /EncryptionTools/EncryptionTools/Encryptions/Base64.m: -------------------------------------------------------------------------------- 1 | // 2 | // Base64.m 3 | // 4 | // Version 1.2 5 | // 6 | // Created by Nick Lockwood on 12/01/2012. 7 | // Copyright (C) 2012 Charcoal Design 8 | // 9 | // Distributed under the permissive zlib License 10 | // Get the latest version from here: 11 | // 12 | // https://github.com/nicklockwood/Base64 13 | // 14 | // This software is provided 'as-is', without any express or implied 15 | // warranty. In no event will the authors be held liable for any damages 16 | // arising from the use of this software. 17 | // 18 | // Permission is granted to anyone to use this software for any purpose, 19 | // including commercial applications, and to alter it and redistribute it 20 | // freely, subject to the following restrictions: 21 | // 22 | // 1. The origin of this software must not be misrepresented; you must not 23 | // claim that you wrote the original software. If you use this software 24 | // in a product, an aacknowledgment in the product documentation would be 25 | // appreciated but is not required. 26 | // 27 | // 2. Altered source versions must be plainly marked as such, and must not be 28 | // misrepresented as being the original software. 29 | // 30 | // 3. This notice may not be removed or altered from any source distribution. 31 | // 32 | 33 | #import "Base64.h" 34 | 35 | 36 | #pragma GCC diagnostic ignored "-Wselector" 37 | 38 | 39 | #import 40 | #if !__has_feature(objc_arc) 41 | #error This library requires automatic reference counting 42 | #endif 43 | 44 | 45 | @implementation NSData (Base64) 46 | 47 | + (NSData *)dataWithBase64EncodedString:(NSString *)string 48 | { 49 | if (![string length]) return nil; 50 | 51 | NSData *decoded = nil; 52 | 53 | #if /*__MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_9 ||*/ __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_7_0 54 | NSLog(@"%d",__IPHONE_OS_VERSION_MIN_REQUIRED); 55 | if (![NSData instancesRespondToSelector:@selector(initWithBase64EncodedString:options:)]) 56 | { 57 | decoded = [[self alloc] initWithBase64Encoding:[string stringByReplacingOccurrencesOfString:@"[^A-Za-z0-9+/=]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, [string length])]]; 58 | } 59 | else 60 | 61 | #endif 62 | 63 | { 64 | decoded = [[self alloc] initWithBase64EncodedString:string options:NSDataBase64DecodingIgnoreUnknownCharacters]; 65 | } 66 | 67 | return [decoded length]? decoded: nil; 68 | } 69 | 70 | - (NSString *)base64EncodedStringWithWrapWidth:(NSUInteger)wrapWidth 71 | { 72 | if (![self length]) return nil; 73 | 74 | NSString *encoded = nil; 75 | 76 | #if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_9 || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_7_0 77 | 78 | if (![NSData instancesRespondToSelector:@selector(base64EncodedStringWithOptions:)]) 79 | { 80 | encoded = [self base64Encoding]; 81 | } 82 | else 83 | 84 | #endif 85 | 86 | { 87 | switch (wrapWidth) 88 | { 89 | case 64: 90 | { 91 | return [self base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength]; 92 | } 93 | case 76: 94 | { 95 | return [self base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength]; 96 | } 97 | default: 98 | { 99 | encoded = [self base64EncodedStringWithOptions:(NSDataBase64EncodingOptions)0]; 100 | } 101 | } 102 | } 103 | 104 | if (!wrapWidth || wrapWidth >= [encoded length]) 105 | { 106 | return encoded; 107 | } 108 | 109 | wrapWidth = (wrapWidth / 4) * 4; 110 | NSMutableString *result = [NSMutableString string]; 111 | for (NSUInteger i = 0; i < [encoded length]; i+= wrapWidth) 112 | { 113 | if (i + wrapWidth >= [encoded length]) 114 | { 115 | [result appendString:[encoded substringFromIndex:i]]; 116 | break; 117 | } 118 | [result appendString:[encoded substringWithRange:NSMakeRange(i, wrapWidth)]]; 119 | [result appendString:@"\r\n"]; 120 | } 121 | 122 | return result; 123 | } 124 | 125 | - (NSString *)base64EncodedString 126 | { 127 | return [self base64EncodedStringWithWrapWidth:0]; 128 | } 129 | 130 | @end 131 | 132 | 133 | @implementation NSString (Base64) 134 | 135 | + (NSString *)stringWithBase64EncodedString:(NSString *)string 136 | { 137 | NSData *data = [NSData dataWithBase64EncodedString:string]; 138 | if (data) 139 | { 140 | return [[self alloc] initWithData:data encoding:NSUTF8StringEncoding]; 141 | } 142 | return nil; 143 | } 144 | 145 | - (NSString *)base64EncodedStringWithWrapWidth:(NSUInteger)wrapWidth 146 | { 147 | NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]; 148 | return [data base64EncodedStringWithWrapWidth:wrapWidth]; 149 | } 150 | 151 | - (NSString *)base64EncodedString 152 | { 153 | NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]; 154 | return [data base64EncodedString]; 155 | } 156 | 157 | - (NSString *)base64DecodedString 158 | { 159 | return [NSString stringWithBase64EncodedString:self]; 160 | } 161 | 162 | - (NSData *)base64DecodedData 163 | { 164 | return [NSData dataWithBase64EncodedString:self]; 165 | } 166 | 167 | @end 168 | -------------------------------------------------------------------------------- /EncryptionTools/EncryptionTools/Encryptions/Hash/NSString+Hash.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSString+Hash.m 3 | // Encryptions 4 | // 5 | // Created by mdd on 15/5/17. 6 | // Copyright © 2015年 com.personal. All rights reserved. 7 | // 8 | 9 | #import "NSString+Hash.h" 10 | #import 11 | #import 12 | 13 | @implementation NSString (Hash) 14 | 15 | #pragma mark - md5 16 | - (NSString *)md5Hash { 17 | const char *plain = self.UTF8String; 18 | unsigned char *digest; 19 | digest = malloc(CC_MD5_DIGEST_LENGTH); 20 | 21 | CC_MD5(plain, (CC_LONG)strlen(plain), digest); 22 | 23 | NSString *encode = [self stringFromBytes:digest length:CC_MD5_DIGEST_LENGTH]; 24 | free(digest); 25 | return encode; 26 | } 27 | 28 | - (NSString *)sha1Hash { 29 | const char *plain = self.UTF8String; 30 | unsigned char *digest; 31 | digest = malloc(CC_SHA1_DIGEST_LENGTH); 32 | 33 | CC_SHA1(plain, (CC_LONG)strlen(plain), digest); 34 | 35 | NSString *encode = [self stringFromBytes:digest length:CC_SHA1_DIGEST_LENGTH]; 36 | free(digest); 37 | return encode; 38 | } 39 | 40 | - (NSString *)sha224Hash { 41 | const char *str = self.UTF8String; 42 | unsigned char *digest; 43 | digest = malloc(CC_SHA224_DIGEST_LENGTH); 44 | 45 | CC_SHA224(str, (CC_LONG)strlen(str), digest); 46 | 47 | NSString *encode = [self stringFromBytes:digest length:CC_SHA224_DIGEST_LENGTH]; 48 | free(digest); 49 | return encode; 50 | } 51 | 52 | - (NSString *)sha256Hash { 53 | const char *str = self.UTF8String; 54 | unsigned char *digest; 55 | digest = malloc(CC_SHA256_DIGEST_LENGTH); 56 | 57 | CC_SHA256(str, (CC_LONG)strlen(str), digest); 58 | 59 | NSString *encode = [self stringFromBytes:digest length:CC_SHA256_DIGEST_LENGTH]; 60 | free(digest); 61 | return encode; 62 | } 63 | 64 | - (NSString *)sha384Hash { 65 | const char *str = self.UTF8String; 66 | unsigned char *digest; 67 | digest = malloc(CC_SHA384_DIGEST_LENGTH); 68 | 69 | CC_SHA384(str, (CC_LONG)strlen(str), digest); 70 | 71 | NSString *encode = [self stringFromBytes:digest length:CC_SHA384_DIGEST_LENGTH]; 72 | free(digest); 73 | return encode; 74 | } 75 | 76 | - (NSString *)sha512Hash { 77 | const char *str = self.UTF8String; 78 | unsigned char *digest; 79 | digest = malloc(CC_SHA512_DIGEST_LENGTH); 80 | 81 | CC_SHA512(str, (CC_LONG)strlen(str), digest); 82 | 83 | NSString *encode = [self stringFromBytes:digest length:CC_SHA512_DIGEST_LENGTH]; 84 | free(digest); 85 | return encode; 86 | } 87 | 88 | #pragma mark - HMAC 89 | - (NSString *)hmacMD5WithKey:(NSString *)key { 90 | const char *keyData = key.UTF8String; 91 | const char *strData = self.UTF8String; 92 | uint8_t buffer[CC_MD5_DIGEST_LENGTH]; 93 | 94 | CCHmac(kCCHmacAlgMD5, keyData, strlen(keyData), strData, strlen(strData), buffer); 95 | 96 | return [self stringFromBytes:buffer length:CC_MD5_DIGEST_LENGTH]; 97 | } 98 | 99 | - (NSString *)hmacSHA1WithKey:(NSString *)key { 100 | NSData *hashData = [self dataUsingEncoding:NSUTF8StringEncoding]; 101 | 102 | unsigned char *digest; 103 | digest = malloc(CC_SHA1_DIGEST_LENGTH); 104 | const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding]; 105 | CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), [hashData bytes], [hashData length], digest); 106 | 107 | NSString *encode = [self stringFromBytes:digest length:CC_SHA1_DIGEST_LENGTH]; 108 | free(digest); 109 | cKey = nil; 110 | return encode; 111 | } 112 | 113 | - (NSString *)hmacSHA224WithKey:(NSString *)key { 114 | NSData *hashData = [self dataUsingEncoding:NSUTF8StringEncoding]; 115 | 116 | unsigned char *digest; 117 | digest = malloc(CC_SHA224_DIGEST_LENGTH); 118 | const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding]; 119 | CCHmac(kCCHmacAlgSHA224, cKey, strlen(cKey), [hashData bytes], [hashData length], digest); 120 | 121 | NSString *encode = [self stringFromBytes:digest length:CC_SHA224_DIGEST_LENGTH]; 122 | free(digest); 123 | cKey = nil; 124 | return encode; 125 | } 126 | 127 | - (NSString *)hmacSHA256WithKey:(NSString *)key { 128 | NSData *hashData = [self dataUsingEncoding:NSUTF8StringEncoding]; 129 | 130 | unsigned char *digest; 131 | digest = malloc(CC_SHA256_DIGEST_LENGTH); 132 | const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding]; 133 | CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), [hashData bytes], [hashData length], digest); 134 | 135 | NSString *encode = [self stringFromBytes:digest length:CC_SHA256_DIGEST_LENGTH]; 136 | free(digest); 137 | cKey = nil; 138 | return encode; 139 | } 140 | 141 | - (NSString *)hmacSHA384WithKey:(NSString *)key { 142 | NSData *hashData = [self dataUsingEncoding:NSUTF8StringEncoding]; 143 | 144 | unsigned char *digest; 145 | digest = malloc(CC_SHA384_DIGEST_LENGTH); 146 | const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding]; 147 | CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), [hashData bytes], [hashData length], digest); 148 | 149 | NSString *encode = [self stringFromBytes:digest length:CC_SHA384_DIGEST_LENGTH]; 150 | free(digest); 151 | cKey = nil; 152 | return encode; 153 | } 154 | 155 | - (NSString *)hmacSHA512WithKey:(NSString *)key { 156 | NSData *hashData = [self dataUsingEncoding:NSUTF8StringEncoding]; 157 | 158 | unsigned char *digest; 159 | digest = malloc(CC_SHA512_DIGEST_LENGTH); 160 | const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding]; 161 | CCHmac(kCCHmacAlgSHA512, cKey, strlen(cKey), [hashData bytes], [hashData length], digest); 162 | 163 | NSString *encode = [self stringFromBytes:digest length:CC_SHA512_DIGEST_LENGTH]; 164 | free(digest); 165 | cKey = nil; 166 | return encode; 167 | } 168 | 169 | #pragma mark - Bytes转字符串 170 | /** 171 | 字符大小写可以通过修改“%02X”中的x修改,下面采用的是大写 172 | */ 173 | - (NSString *)stringFromBytes:(uint8_t *)bytes length:(int)length { 174 | NSMutableString *strM = [NSMutableString string]; 175 | 176 | for (int i = 0; i < length; i++) { 177 | [strM appendFormat:@"%02X", bytes[i]]; 178 | } 179 | 180 | return [strM copy]; 181 | } 182 | 183 | 184 | @end 185 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # EncryptionTools 2 | 加密工具: Base64 MD5 SHA1 SHA224 SHA256 SHA384 HMAC(SHA1~SHA512) AES DES RSA 3 | 4 | `NSString+Hash.m`与`NSString+Hash.h`文件实现了`MD5 SHA1 SHA224 SHA256 SHA384 HMAC(SHA1~SHA512)`可以单独拷贝出来使用 5 | 6 | `NSString+Encryption.m`与`NSString+Encryption.h`文件实现了AES DES RSA加密解密,也可以单独拷贝出来使用 7 | 8 | ## 更新NSString+Hash 9 | hmacSHA有笔误,错把 `const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding];`写为`const char *cKey = [self cStringUsingEncoding:NSUTF8StringEncoding];`,感谢简书 @靓模袭地球 10 | 11 | --- 12 | 13 | --- 14 | 15 | ## 一、Base64编码 16 | Base64编码要求把3个8位字节`(3*8=24)`转化为4个6位的字节`(4*6=24)`,之后在6位的前面补两个0,形成8位一个字节的形式,这样每一个字节的有效位为6位,则取值范围0~63`0 ~ (2^6 - 1)`。如果最后剩下的字符不到3个字节,则用0填充,输出字符使用'=',因此我们看到Base64末尾会有1到2个'='。另外标准还要求每76个字符要插入换行(不过,这个视具体情况定)。 17 | 18 | iOS7之后苹果有自己的Base64编码解码API,NSData的扩展:`NSData (NSDataBase64Encoding)` 19 | 20 | 21 | #### 两种存储方式 22 | * 可见字符串形式 23 | 24 | 为了保证所输出的每一个编码字节都是可读字符,而不是0~63这些数字,Base64制作了一个码表,就像ASCII码表一样,每一个Base64码值都有对应的字符。64个可读字符从0到63非别是`A-Z、a-z、0-9、+、/`,这也是Base64名字的由来。 25 | 26 | * 以16进制形式 27 | 28 | 即NSData形式保存,Base64编码结果为字符,而这些字符又对应ASCII码表的码值,NSData就是存储ASCII码表的码值。 29 | 30 | 31 | #### 下面举个例子,并以苹果提供的API来详细介绍Base64编码解码过程: 32 | 33 | 假设我们对字符串"123"进行Base64编码,"123"对应的16进制是313233,二进制为`00110001、00110010、00110011`,将其变为4*6结果即下表中的第一行。然后根据Base64的码表,它们分别对应表中的第二行。那么"123"编码的最终结果即为MTIz,以字符串的形式保存。然后根据MTIz对应ASCII码值,以NSData形式存储,如表中的第三行。 34 | 35 | 转换为4*6结果 | 00001100 | 00010011 | 00001000 | 00110011 36 | ----|-------- | ---------- | --------- | -------- 37 | Base64对应字符|M | T | I | z 38 | 对应ASCII码值(16进制)|4d |54 | 49 |7a 39 | 40 | 上面的过程通过代码实现如下: 41 | 42 | ``` 43 | // 1 待编码的原始字符串 44 | NSString *plainStr = @"123"; 45 | // 2 将其转换成NSData保存,那么"123"对应的ASCII码表码值是31、32、33(16进制) 46 | NSData *plainData = [plainStr dataUsingEncoding:NSUTF8StringEncoding]; 47 | // 3.1 将其进行Base64编码,且结果以字符串形式保存,对应表中的第二行 48 | NSString *baseStr = [plainData base64EncodedStringWithOptions:0]; 49 | // 3.2 将其进行Base64编码,且结果以NSData形式保存 50 | NSData *base64Data = [plainData base64EncodedDataWithOptions:0]; 51 | ``` 52 | 另外对于参数NSDataBase64EncodingOptions选项,有多种取值 53 | 54 | * NSDataBase64Encoding64CharacterLineLength:每64个字符插入\r或\n 55 | * NSDataBase64Encoding76CharacterLineLength:每76个字符插入\r或\n,标准中有要求是76个字符要换行,不过具体还是自己定 56 | * NSDataBase64EncodingEndLineWithCarriageReturn:插入字符为\r 57 | * NSDataBase64EncodingEndLineWithLineFeed:插入字符为\n 58 | 59 | 前两个选项为是否允许插入字符,以及多少个字符长度插入,两个可以选其一或者都不选。后两个选项代表要插入的具体字符。比如我们想76个字符后插入一个\r则可以`NSDataBase64Encoding76CharacterLineLength | NSDataBase64EncodingEndLineWithCarriageReturn`。而在上面举的例子中选项为0,则代表不插入字符。 60 | 61 | #### 第三方框架 62 | 在iOS7之前我们一般用的都是第三方框架,比如nicklockwood写的[https://github.com/nicklockwood/Base64](https://github.com/nicklockwood/Base64)还有Google的GTMBase64,虽然苹果有了自己的实现,但是许多其它的加密框架都用到了它,所以还是要了解一下,另外它还提供任意长度字符插入`\r\n`,而苹果只能是64或76长度。 63 | 64 | ## 二、MD5、SHA1、SHA256、SHA512、HMAC实现 65 | 主要用于验证,防止信息被修改。介绍请参照[http://www.jianshu.com/p/003b85fd3e36](http://www.jianshu.com/p/003b85fd3e36)。 66 | 67 | 具体的实现参考第三方框架:[https://github.com/kelp404/CocoaSecurity](https://github.com/kelp404/CocoaSecurity)。非常全面,不过不是太方便,比如想要获得MD5结果 68 | 69 | ``` 70 | NSString *plainStr = @"123"; 71 | CocoaSecurityResult *md5 = [CocoaSecurity md5:plainStr]; 72 | // 获取md5结果 73 | NSString *md5Str = md5.hexLower; 74 | ``` 75 | 76 | 不能直接plainStr.MD5Hash就获得字符串形式的结果,这里我封装了一个,可以参见工程中的NSString+Hash类[https://github.com/mddios/EncryptionTools](https://github.com/mddios/EncryptionTools),可以直接对字符串进行操作,类似`plainStr.MD5Hash、plainStr.sha1Hash···plainStr.sha256Hash···`,非常方便。 77 | 78 | 比如对@"123"哈希,下面用上面提到的两种方法举例: 79 | 80 | ``` 81 | - (void)hashTest { 82 | NSString *plainStr = @"123"; 83 | // md5 84 | CocoaSecurityResult *md5 = [CocoaSecurity md5:plainStr]; 85 | NSLog(@"md5:%lu---%@---%@",plainStr.md5Hash.length, plainStr.md5Hash,md5.hex); 86 | // 40 87 | CocoaSecurityResult *sha1 = [CocoaSecurity sha1:plainStr]; 88 | NSLog(@"sha1:%lu---%@---%@",plainStr.sha1Hash.length, plainStr.sha1Hash,sha1.hex); 89 | // 56 90 | CocoaSecurityResult *sha224 = [CocoaSecurity sha224:plainStr]; 91 | NSLog(@"sha224:%lu---%@---%@",plainStr.sha224Hash.length,plainStr.sha224Hash,sha224.hex); 92 | // 64 93 | CocoaSecurityResult *sha256 = [CocoaSecurity sha256:plainStr]; 94 | NSLog(@"sha256:%lu---%@---%@",plainStr.sha256Hash.length,plainStr.sha256Hash,sha256.hex); 95 | // 96 96 | CocoaSecurityResult *sha384 = [CocoaSecurity sha384:plainStr]; 97 | NSLog(@"sha384:%lu---%@---%@",plainStr.sha384Hash.length,plainStr.sha384Hash,sha384.hex); 98 | // 128 99 | CocoaSecurityResult *sha512 = [CocoaSecurity sha512:plainStr]; 100 | NSLog(@"sha512:%lu---%@---%@",plainStr.sha512Hash.length,plainStr.sha512Hash,sha512.hex); 101 | 102 | // hmac 103 | CocoaSecurityResult *hmacmd5 = [CocoaSecurity hmacMd5:plainStr hmacKey:plainStr]; 104 | NSLog(@"hmacmd5:%lu---%@---%@",[plainStr hmacMD5WithKey:plainStr].length,[plainStr hmacMD5WithKey:plainStr],hmacmd5.hex); 105 | } 106 | ``` 107 | 108 | * 在电脑终端来获取结果 109 | 110 | 封装的代码中`NSString+Hash.h`头文件,有具体列出终端命令方法,如下: 111 | 112 | ``` 113 | /// 返回结果:32长度 终端命令:md5 -s "123" 114 | - (NSString *)md5Hash; 115 | 116 | /// 返回结果:40长度 终端命令:echo -n "123" | openssl sha -sha1 117 | - (NSString *)sha1Hash; 118 | 119 | /// 返回结果:56长度 终端命令:echo -n "123" | openssl sha -sha224 120 | - (NSString *)sha224Hash; 121 | 122 | /// 返回结果:64长度 终端命令:echo -n "123" | openssl sha -sha256 123 | - (NSString *)sha256Hash; 124 | 125 | /// 返回结果:96长度 终端命令:echo -n "123" | openssl sha -sha384 126 | - (NSString *)sha384Hash; 127 | 128 | /// 返回结果:128长度 终端命令:echo -n "123" | openssl sha -sha512 129 | - (NSString *)sha512Hash; 130 | 131 | #pragma mark - HMAC 132 | 133 | /// 返回结果:32长度 终端命令:echo -n "123" | openssl dgst -md5 -hmac "123" 134 | - (NSString *)hmacMD5WithKey:(NSString *)key; 135 | 136 | /// 返回结果:40长度 echo -n "123" | openssl sha -sha1 -hmac "123" 137 | - (NSString *)hmacSHA1WithKey:(NSString *)key; 138 | - (NSString *)hmacSHA224WithKey:(NSString *)key; 139 | - (NSString *)hmacSHA256WithKey:(NSString *)key; 140 | - (NSString *)hmacSHA384WithKey:(NSString *)key; 141 | - (NSString *)hmacSHA512WithKey:(NSString *)key; 142 | ``` 143 | 144 | 145 | * 关于MD5加盐,只是多了下面第一行 146 | 147 | ``` 148 | plainStr = [plainStr stringByAppendingString:salt]; 149 | NSString *md5Str = plainStr.md5Hash; 150 | ``` 151 | 152 | 博客: 153 | 154 | * [http://www.jianshu.com/p/185a581e7afa](http://www.jianshu.com/p/185a581e7afa) 155 | * [http://www.cnblogs.com/mddblog/p/5512708.html](http://www.cnblogs.com/mddblog/p/5512708.html) 156 | -------------------------------------------------------------------------------- /EncryptionTools/EncryptionTools/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // EncryptionTools 4 | // 5 | // Created by mdd on 16/5/17. 6 | // Copyright © 2016年 com.personal. All rights reserved. 7 | // 8 | 9 | #import "ViewController.h" 10 | #import "NSString+Hash.h" 11 | #import "CocoaSecurity.h" 12 | #import "NSString+Encryption.h" 13 | #import "RSA.h" 14 | 15 | @interface ViewController () 16 | @property (nonatomic, strong) NSData *data; 17 | @end 18 | 19 | @implementation ViewController 20 | 21 | - (void)viewDidLoad { 22 | [super viewDidLoad]; 23 | // [self base64Test]; 24 | 25 | [self hashTest]; 26 | 27 | // [self aesCBCTest]; 28 | // [self aesECBTest]; 29 | // [self desTest]; 30 | // 31 | // [self rsaTest]; 32 | // [self blockTest]; 33 | } 34 | 35 | - (void)base64Test { 36 | // 1 待编码的原始字符串 37 | NSString *plainStr = @"123"; 38 | // 2 将其转换成NSData保存,那么"123"对应的ASCII码表码值是31、32、33(16进制) 39 | NSData *plainData = [plainStr dataUsingEncoding:NSUTF8StringEncoding]; 40 | // 3.1 将其进行Base64编码,且结果以字符串形式保存 41 | NSString *baseStr = [plainData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength]; 42 | // 3.2 将其进行Base64编码,且结果以NSData形式保存 43 | NSData *base64Data = [plainData base64EncodedDataWithOptions:0]; 44 | 45 | NSLog(@"%@---%@---%@---%@", plainData,base64Data,[NSString stringWithUTF8String:[base64Data bytes]],baseStr); 46 | } 47 | 48 | - (void)hashTest { 49 | NSString *plainStr = @"123"; 50 | NSString *key = @"456"; 51 | // md5 52 | CocoaSecurityResult *md5 = [CocoaSecurity md5:plainStr]; 53 | NSLog(@"md5:%lu---%@---%@",plainStr.md5Hash.length, plainStr.md5Hash,md5.hex); 54 | // 40 55 | CocoaSecurityResult *sha1 = [CocoaSecurity sha1:plainStr]; 56 | NSLog(@"sha1:%lu---%@---%@",plainStr.sha1Hash.length, plainStr.sha1Hash,sha1.hex); 57 | // 56 58 | CocoaSecurityResult *sha224 = [CocoaSecurity sha224:plainStr]; 59 | NSLog(@"sha224:%lu---%@---%@",plainStr.sha224Hash.length,plainStr.sha224Hash,sha224.hex); 60 | // 64 61 | CocoaSecurityResult *sha256 = [CocoaSecurity sha256:plainStr]; 62 | NSLog(@"sha256:%lu---%@---%@",plainStr.sha256Hash.length,plainStr.sha256Hash,sha256.hex); 63 | // 96 64 | CocoaSecurityResult *sha384 = [CocoaSecurity sha384:plainStr]; 65 | NSLog(@"sha384:%lu---%@---%@",plainStr.sha384Hash.length,plainStr.sha384Hash,sha384.hex); 66 | // 128 67 | CocoaSecurityResult *sha512 = [CocoaSecurity sha512:plainStr]; 68 | NSLog(@"sha512:%lu---%@---%@",plainStr.sha512Hash.length,plainStr.sha512Hash,sha512.hex); 69 | 70 | /// hmac 71 | CocoaSecurityResult *hmacmd5 = [CocoaSecurity hmacMd5:plainStr hmacKey:key]; 72 | NSLog(@"hmacmd5:%lu---%@---%@",[plainStr hmacMD5WithKey:plainStr].length,[plainStr hmacMD5WithKey:key],hmacmd5.hex); 73 | 74 | CocoaSecurityResult *hmacSHA1 = [CocoaSecurity hmacSha1:plainStr hmacKey:key]; 75 | NSLog(@"hmacmd5:%lu---%@---%@",[plainStr hmacSHA1WithKey:key].length,[plainStr hmacSHA1WithKey:key],hmacSHA1.hex); 76 | } 77 | 78 | - (void)blockTest { 79 | NSString *str = @"123"; 80 | 81 | CocoaSecurityResult *md5 = [CocoaSecurity md5:str]; 82 | CocoaSecurityResult *result1 = [CocoaSecurity md5WithData:md5.data]; 83 | CocoaSecurityResult *result2 = [CocoaSecurity md5:md5.hexLower]; 84 | 85 | NSLog(@"%@ -- %@",[md5.hexLower dataUsingEncoding:NSUTF8StringEncoding],md5.data); 86 | NSLog(@"%@", result1.hexLower); 87 | NSLog(@"%@", result2.hexLower); 88 | } 89 | 90 | - (void)aesCBCTest { 91 | NSString *plainText = @"123"; 92 | 93 | NSString *key128 = @"0123456789ABCDEF"; 94 | // 16进制字符串 95 | NSString *key128Hex = @"30313233343536373839414243444546"; 96 | 97 | NSString *iv = @"0123456789ABCDEF"; 98 | // 16进制字符串 99 | NSString *ivHex = @"30313233343536373839414243444546"; 100 | 101 | CocoaSecurityResult *result = [CocoaSecurity aesEncrypt:plainText hexKey:key128Hex hexIv:ivHex]; 102 | 103 | NSString *aesBase64 = [plainText aesEncryptWithKey:key128 iv:iv]; 104 | NSData *aesData = [plainText aesEncryptWithDataKey:[key128 dataUsingEncoding:NSUTF8StringEncoding] dataIv:[iv dataUsingEncoding:NSUTF8StringEncoding]]; 105 | NSLog(@"SecurityResult加密:\r\n%@ --- %@",result.base64,result.hexLower); 106 | NSLog(@"NSString+Encryption加密:\r\n%@ --- %@",aesBase64,aesData); 107 | 108 | // 解密 109 | NSString *decryptStr = [aesBase64 aesBase64StringDecryptWithHexKey:key128Hex hexIv:ivHex]; 110 | NSData *data = [NSString aesDecryptWithData:aesData dataKey:[key128 dataUsingEncoding:NSUTF8StringEncoding] dataIv:[iv dataUsingEncoding:NSUTF8StringEncoding]]; 111 | NSLog(@"解密:%@ --- %@",decryptStr,data); 112 | } 113 | 114 | - (void)aesECBTest { 115 | NSString *plainText = @"123"; 116 | 117 | NSString *key128 = @"0123456789ABCDEF"; 118 | NSString *key128Hex = @"30313233343536373839414243444546"; 119 | 120 | NSString *aesBase64 = [plainText aesECBEncryptWithKey:key128]; 121 | NSData *aesData = [plainText aesECBEncryptWithDataKey:[key128 dataUsingEncoding:NSUTF8StringEncoding]]; 122 | NSLog(@"加密:%@ --- %@",aesBase64, aesData); 123 | 124 | // 解密 125 | NSString *decStr = [aesBase64 aesECBBase64StringDecryptWithHexKey:key128Hex]; 126 | NSData *decData = [NSString aesECBDecryptWithData:aesData withDataKey:[key128 dataUsingEncoding:NSUTF8StringEncoding]]; 127 | NSLog(@"解密:%@---%@",decStr, decData); 128 | } 129 | 130 | - (void)desTest { 131 | NSString *plainText = @"123"; 132 | 133 | NSString *key = @"01234567"; 134 | NSString *desBase64 = [plainText desEncryptWithKey:key]; 135 | NSData *keydata = [key dataUsingEncoding:NSUTF8StringEncoding]; 136 | NSData *desData = [plainText desEncryptWithDataKey:keydata]; 137 | 138 | NSLog(@"DES加密:%@ --- %@",desBase64,desData); 139 | 140 | NSString *decryptStr = [desBase64 desDecryptWithKey:key]; 141 | NSData *data = [NSString desDecryptWithData:desData dataKey:keydata]; 142 | NSLog(@"解密:%@ --- %@",decryptStr,data); 143 | } 144 | 145 | - (void)rsaTest { 146 | NSString *plainText = @"123"; 147 | NSString *privateKey = @"\ 148 | -----BEGIN PRIVATE KEY-----\ 149 | MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAM7GhkiwVsUx5HQ5\ 150 | adz+wXkDcaPQFaygKVBbcEqC8xDzlldUIzruDpci2XmxJbYTIxoh5Dy1GwzQcjig\ 151 | K+U4yNJWB3JmaptR9pkOgNg9bakNsuowOv+jV4rFimyxsDIfpkPIl5M4S73IXtdS\ 152 | wiKWiTNzQP2L649zzKn+8thM8MkRAgMBAAECgYAVQx69zLwvbND0Do9PNTcJzYva\ 153 | 72O7K4D0DWL/lnWOEa4s7q7suVvwuJmqRMf+7/rVDhUdFPZiG/ES142L9YnYv7XB\ 154 | NlhZsT80gcGWzh1MO3hqIwZQbbLq4FwU+YH3uyNPeh9w4dVm4VzzSS3KFW6/Hmiw\ 155 | HyhtkduOf7eGf+kgXQJBAPHVuiWW7ddcvTxgmtLWakHcX/zsddzENrR1ZSioFFQI\ 156 | +OoL7xK7Fp108rpEW+RvVTJYk3NDkxvc5m3rn+yKl0MCQQDa4xZ/S6RNGHGIRiFk\ 157 | gkNJoRFh5pYVT6ZzqYLb/9Ny/LuGV0F7XmftRA0paXsNsjdns2a4o9r6tarABKq0\ 158 | EAcbAkA5q/uJbVXpDx+931fswd9zN2fYvFdbP5vAK2LlcDfw1nbt8cygzecVw8cC\ 159 | 7rxvXLGXoRIA4fOaKHL3ccKguWhbAkBGh1ePatMlGFQ0wcwus5500hZkwkTn1wNe\ 160 | T2df9f2vFmpiLilmVBQOqpfHGTrSPfOGUZMuuXVsxS6gsqBCZsuzAkAh+/VXDXxh\ 161 | wR7FY8GSfmIq5+7QWjv5nvvqUMtg/WQ3JBl6iGh8ABZg1C8dnhZOmIjGLYVn3EhG\ 162 | 74zuyawizSHa\ 163 | -----END PRIVATE KEY-----\ 164 | "; 165 | 166 | NSString *publicKey = @"\ 167 | -----BEGIN PUBLIC KEY-----\ 168 | MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOxoZIsFbFMeR0OWnc/sF5A3Gj\ 169 | 0BWsoClQW3BKgvMQ85ZXVCM67g6XItl5sSW2EyMaIeQ8tRsM0HI4oCvlOMjSVgdy\ 170 | ZmqbUfaZDoDYPW2pDbLqMDr/o1eKxYpssbAyH6ZDyJeTOEu9yF7XUsIilokzc0D9\ 171 | i+uPc8yp/vLYTPDJEQIDAQAB\ 172 | -----END PUBLIC KEY-----\ 173 | "; 174 | 175 | NSString *encWithPubKey = [RSA encryptString:plainText publicKey:publicKey]; 176 | NSString *decWithPrivKey = [RSA decryptString:encWithPubKey privateKey:privateKey]; 177 | 178 | NSLog(@"RSA:%@ --- %@",encWithPubKey,decWithPrivKey); 179 | } 180 | 181 | @end 182 | 183 | 184 | 185 | 186 | -------------------------------------------------------------------------------- /EncryptionTools/EncryptionTools/Encryptions/NSString+Encryption/NSString+Encryption.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSString+Encryption.m 3 | // EncryptionTools 4 | // 5 | // Created by mdd on 16/4/2. 6 | // Copyright © 2016年 com.personal. All rights reserved. 7 | // 8 | 9 | #import "NSString+Encryption.h" 10 | #import "NSString+Hash.h" 11 | 12 | @implementation NSString (Encryption) 13 | 14 | #pragma mark - AES加密 15 | 16 | /* 17 | 默认CBC模式,返回base64编码 18 | */ 19 | - (NSString *)aesEncryptWithHexKey:(NSString *)key hexIv:(NSString *)iv { 20 | NSData *aesKey = [key dataFromHexString]; 21 | if (iv == nil) { 22 | // 32长度 23 | iv = @"00000000000000000000000000000000"; 24 | } 25 | NSData *aesIv = [iv dataFromHexString]; 26 | NSData *resultData = [self aesEncryptWithDataKey:aesKey dataIv:aesIv]; 27 | return [resultData base64EncodedStringWithOptions:0]; 28 | } 29 | 30 | /* 31 | 默认CBC模式,返回base64编码 32 | */ 33 | - (NSString *)aesEncryptWithKey:(NSString *)key iv:(NSString *)iv { 34 | NSData *aesKey = [key dataUsingEncoding:NSUTF8StringEncoding]; 35 | if (iv == nil) { 36 | // 32长度 37 | iv = @"00000000000000000000000000000000"; 38 | } 39 | NSData *aesIv = [iv dataUsingEncoding:NSUTF8StringEncoding]; 40 | NSData *resultData = [self aesEncryptWithDataKey:aesKey dataIv:aesIv]; 41 | return [resultData base64EncodedStringWithOptions:0]; 42 | } 43 | 44 | /* 45 | CBC模式,返回NSData 46 | */ 47 | - (NSData *)aesEncryptWithDataKey:(NSData *)key dataIv:(NSData *)iv { 48 | return [self aesEncryptOrDecrypt:kCCEncrypt data:[self dataUsingEncoding:NSUTF8StringEncoding] dataKey:key dataIv:iv mode:kPaddingMode]; 49 | } 50 | 51 | /* 52 | ECB模式,返回base64编码 53 | */ 54 | - (NSString *)aesECBEncryptWithHexKey:(NSString *)key { 55 | NSData *aesKey = [key dataFromHexString]; 56 | NSData *resultData = [self aesECBEncryptWithDataKey:aesKey]; 57 | return [resultData base64EncodedStringWithOptions:0]; 58 | } 59 | 60 | /* 61 | ECB模式,返回base64编码 62 | */ 63 | - (NSString *)aesECBEncryptWithKey:(NSString *)key { 64 | NSData *aesKey = [key dataUsingEncoding:NSUTF8StringEncoding]; 65 | NSData *resultData = [self aesECBEncryptWithDataKey:aesKey]; 66 | return [resultData base64EncodedStringWithOptions:0]; 67 | } 68 | 69 | /* 70 | ECB模式,返回base64 71 | */ 72 | - (NSString *)aesECBEncryptWithBase64Key:(NSString *)key { 73 | NSData *aesKey = [[NSData alloc] initWithBase64EncodedString:key options:NSDataBase64DecodingIgnoreUnknownCharacters]; 74 | NSData *resultData = [self aesECBEncryptWithDataKey:aesKey]; 75 | return [resultData base64EncodedStringWithOptions:0]; 76 | } 77 | 78 | /* 79 | ECB模式,返回NSData 80 | */ 81 | - (NSData *)aesECBEncryptWithDataKey:(NSData *)key { 82 | NSData *aesIv = [@"00000000000000000000000000000000" dataFromHexString]; 83 | return [self aesEncryptOrDecrypt:kCCEncrypt data:[self dataUsingEncoding:NSUTF8StringEncoding] dataKey:key dataIv:aesIv mode:kPaddingMode | kCCOptionECBMode]; 84 | } 85 | 86 | #pragma mark - AES解密 87 | 88 | /* 89 | 默认CBC模式解密,默认string为base64格式 90 | */ 91 | - (NSString *)aesBase64StringDecryptWithHexKey:(NSString *)key hexIv:(NSString *)iv { 92 | NSData *aesKey = [key dataFromHexString]; 93 | if (iv == nil) { 94 | // 32长度 95 | iv = @"00000000000000000000000000000000"; 96 | } 97 | NSData *aesIv = [iv dataFromHexString]; 98 | NSData *data = [[NSData alloc] initWithBase64EncodedString:self options:0]; 99 | NSData *resultData = [NSString aesDecryptWithData:data dataKey:aesKey dataIv:aesIv]; 100 | return [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding]; 101 | } 102 | 103 | /* 104 | CBC模式解密,返回NSData 105 | */ 106 | + (NSData *)aesDecryptWithData:(NSData *)data dataKey:(NSData *)key dataIv:(NSData *)iv { 107 | return [[NSString alloc] aesEncryptOrDecrypt:kCCDecrypt data:data dataKey:key dataIv:iv mode:kPaddingMode]; 108 | } 109 | 110 | /* 111 | ECB模式解密,要求输入为Base64格式,返回为NSString 112 | */ 113 | - (NSString *)aesECBBase64StringDecryptWithHexKey:(NSString *)key { 114 | NSData *aesKey = [key dataFromHexString]; 115 | NSData *data = [[NSData alloc] initWithBase64EncodedString:self options:0]; 116 | NSData *resultData = [NSString aesECBDecryptWithData:data withDataKey:aesKey]; 117 | return [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding]; 118 | } 119 | 120 | /* 121 | ECB模式解密,要求输入为Base64格式,返回为NSString 122 | */ 123 | - (NSString *)aesECBBase64StringDecryptWithBase64Key:(NSString *)key { 124 | NSData *aesKey = [[NSData alloc] initWithBase64EncodedString:key options:NSDataBase64DecodingIgnoreUnknownCharacters]; 125 | NSData *data = [[NSData alloc] initWithBase64EncodedString:self options:0]; 126 | NSData *resultData = [NSString aesECBDecryptWithData:data withDataKey:aesKey]; 127 | return [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding]; 128 | } 129 | 130 | /* 131 | ECB模式解密,返回为NSData 132 | */ 133 | + (NSData *)aesECBDecryptWithData:(NSData *)data withDataKey:(NSData *)key{ 134 | NSData *aesIv = [@"00000000000000000000000000000000" dataFromHexString]; 135 | return [[NSString alloc] aesEncryptOrDecrypt:kCCDecrypt data:data dataKey:key dataIv:aesIv mode:kPaddingMode | kCCOptionECBMode]; 136 | } 137 | 138 | ///* 139 | // ECB模式解密,返回base64编码 140 | // */ 141 | //- (NSString *)aesECBDecryptWithHexKey:(NSString *)key { 142 | // NSData *aesKey = [key dataFromHexString]; 143 | // NSData *resultData = [self aesECBEncryptWithDataKey:aesKey]; 144 | // return [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding];; 145 | //} 146 | // 147 | ///* 148 | // ECB模式解密,返回NSData 149 | // */ 150 | //- (NSData *)aesECBDecryptWithDataKey:(NSData *)key { 151 | // NSData *aesIv = [@"00000000000000000000000000000000" dataFromHexString]; 152 | // return [self aesEncryptOrDecrypt:kCCDecrypt data:[self dataUsingEncoding:NSUTF8StringEncoding] dataKey:key dataIv:aesIv mode:kPaddingMode | kCCOptionECBMode]; 153 | //} 154 | 155 | 156 | - (NSData *)aesEncryptOrDecrypt:(CCOperation)option data:(NSData *)data dataKey:(NSData *)key dataIv:(NSData *)iv mode:(int)mode{ 157 | // check length of key and iv 158 | if ([iv length] != 16) { 159 | @throw [NSException exceptionWithName:@"Encrypt" 160 | reason:@"Length of iv is wrong. Length of iv should be 16(128bits)" 161 | userInfo:nil]; 162 | } 163 | if ([key length] != 16 && [key length] != 24 && [key length] != 32 ) { 164 | @throw [NSException exceptionWithName:@"Encrypt" 165 | reason:@"Length of key is wrong. Length of iv should be 16, 24 or 32(128, 192 or 256bits)" 166 | userInfo:nil]; 167 | } 168 | 169 | // setup output buffer 170 | size_t bufferSize = [data length] + kCCBlockSizeAES128; 171 | void *buffer = malloc(bufferSize); 172 | 173 | // do encrypt 174 | size_t encryptedSize = 0; 175 | CCCryptorStatus cryptStatus = CCCrypt(option, 176 | kCCAlgorithmAES128, 177 | mode, 178 | [key bytes], // Key 179 | [key length], // kCCKeySizeAES 180 | [iv bytes], // IV 181 | [data bytes], 182 | [data length], 183 | buffer, 184 | bufferSize, 185 | &encryptedSize); 186 | NSData *resultData = nil; 187 | if (cryptStatus == kCCSuccess) { 188 | NSData *resultData = [NSData dataWithBytes:buffer length:encryptedSize]; 189 | free(buffer); 190 | return resultData; 191 | } else { 192 | free(buffer); 193 | @throw [NSException exceptionWithName:@"Encrypt" 194 | reason:@"Encrypt Error!" 195 | userInfo:nil]; 196 | return resultData; 197 | } 198 | return resultData; 199 | } 200 | 201 | #pragma mark - DES加密 202 | 203 | /* 204 | DES加密 key为NSString形式 结果返回base64编码 205 | */ 206 | - (NSString *)desEncryptWithKey:(NSString *)key { 207 | NSData *desKey = [key dataUsingEncoding:NSUTF8StringEncoding]; 208 | NSData *resultData = [self desEncryptWithDataKey:desKey]; 209 | return [resultData base64EncodedStringWithOptions:0]; 210 | } 211 | 212 | /* 213 | DES加密 key为NSData形式 结果返回NSData 214 | */ 215 | - (NSData *)desEncryptWithDataKey:(NSData *)key { 216 | return [self desEncryptOrDecrypt:kCCEncrypt data:[self dataUsingEncoding:NSUTF8StringEncoding] dataKey:key mode:kPaddingMode | kCCOptionECBMode]; 217 | } 218 | 219 | #pragma mark - DES解密 220 | 221 | - (NSString *)desDecryptWithKey:(NSString *)key { 222 | NSData *desKey = [key dataUsingEncoding:NSUTF8StringEncoding]; 223 | NSData *data = [[NSData alloc] initWithBase64EncodedString:self options:0]; 224 | NSData *resultData = [NSString desDecryptWithData:data dataKey:desKey]; 225 | return [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding]; 226 | } 227 | 228 | + (NSData *)desDecryptWithData:(NSData *)data dataKey:(NSData *)key { 229 | return [[NSString alloc] desEncryptOrDecrypt:kCCDecrypt data:data dataKey:key mode:kPaddingMode | kCCOptionECBMode]; 230 | } 231 | 232 | - (NSData *)desEncryptOrDecrypt:(CCOperation)option data:(NSData *)data dataKey:(NSData *)key mode:(int)mode{ 233 | // if ([key length] != 16 && [key length] != 24 && [key length] != 32 ) { 234 | // @throw [NSException exceptionWithName:@"Encrypt" 235 | // reason:@"Length of key is wrong. Length of iv should be 16, 24 or 32(128, 192 or 256bits)" 236 | // userInfo:nil]; 237 | // } 238 | 239 | // setup output buffer 240 | size_t bufferSize = [data length] + kCCBlockSizeDES; 241 | void *buffer = malloc(bufferSize); 242 | 243 | // do encrypt 244 | size_t encryptedSize = 0; 245 | CCCryptorStatus cryptStatus = CCCrypt(option, 246 | kCCAlgorithmDES, 247 | mode, 248 | [key bytes], // Key 249 | kCCKeySizeDES, // kCCKeySizeAES 250 | NULL, // IV 251 | [data bytes], 252 | [data length], 253 | buffer, 254 | bufferSize, 255 | &encryptedSize); 256 | NSData *resultData = nil; 257 | if (cryptStatus == kCCSuccess) { 258 | NSData *resultData = [NSData dataWithBytes:buffer length:encryptedSize]; 259 | free(buffer); 260 | return resultData; 261 | } else { 262 | free(buffer); 263 | @throw [NSException exceptionWithName:@"Encrypt" 264 | reason:@"Encrypt Error!" 265 | userInfo:nil]; 266 | return resultData; 267 | } 268 | return resultData; 269 | } 270 | 271 | /** 272 | hex形式的字符串转换为data 273 | */ 274 | - (NSData *)dataFromHexString { 275 | 276 | if (self.length == 0) { 277 | return nil; 278 | } 279 | 280 | static const unsigned char HexDecodeChars[] = { 281 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 282 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 283 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 285 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, //49 286 | 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, //59 287 | 0, 0, 0, 0, 0, 10, 11, 12, 13, 14, 288 | 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, //79 289 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 290 | 0, 0, 0, 0, 0, 0, 0, 10, 11, 12, //99 291 | 13, 14, 15 292 | }; 293 | 294 | // convert data(NSString) to CString 295 | const char *source = [self cStringUsingEncoding:NSUTF8StringEncoding]; 296 | // malloc buffer 297 | unsigned char *buffer; 298 | NSUInteger length = strlen(source) / 2; 299 | buffer = malloc(length); 300 | for (NSUInteger index = 0; index < length; index++) { 301 | buffer[index] = (HexDecodeChars[source[index * 2]] << 4) + (HexDecodeChars[source[index * 2 + 1]]); 302 | } 303 | // init result NSData 304 | NSData *result = [NSData dataWithBytes:buffer length:length]; 305 | free(buffer); 306 | source = nil; 307 | 308 | return result; 309 | } 310 | 311 | @end 312 | 313 | 314 | -------------------------------------------------------------------------------- /EncryptionTools/EncryptionTools/Encryptions/RSAEncrypt/RSA.m: -------------------------------------------------------------------------------- 1 | /* 2 | @author: ideawu 3 | @link: https://github.com/ideawu/Objective-C-RSA 4 | */ 5 | 6 | #import "RSA.h" 7 | #import 8 | 9 | @implementation RSA 10 | 11 | /* 12 | static NSString *base64_encode(NSString *str){ 13 | NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding]; 14 | if(!data){ 15 | return nil; 16 | } 17 | return base64_encode_data(data); 18 | } 19 | */ 20 | 21 | static NSString *base64_encode_data(NSData *data){ 22 | data = [data base64EncodedDataWithOptions:0]; 23 | NSString *ret = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 24 | return ret; 25 | } 26 | 27 | static NSData *base64_decode(NSString *str){ 28 | NSData *data = [[NSData alloc] initWithBase64EncodedString:str options:NSDataBase64DecodingIgnoreUnknownCharacters]; 29 | return data; 30 | } 31 | 32 | + (NSData *)stripPublicKeyHeader:(NSData *)d_key{ 33 | // Skip ASN.1 public key header 34 | if (d_key == nil) return(nil); 35 | 36 | unsigned long len = [d_key length]; 37 | if (!len) return(nil); 38 | 39 | unsigned char *c_key = (unsigned char *)[d_key bytes]; 40 | unsigned int idx = 0; 41 | 42 | if (c_key[idx++] != 0x30) return(nil); 43 | 44 | if (c_key[idx] > 0x80) idx += c_key[idx] - 0x80 + 1; 45 | else idx++; 46 | 47 | // PKCS #1 rsaEncryption szOID_RSA_RSA 48 | static unsigned char seqiod[] = 49 | { 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 50 | 0x01, 0x05, 0x00 }; 51 | if (memcmp(&c_key[idx], seqiod, 15)) return(nil); 52 | 53 | idx += 15; 54 | 55 | if (c_key[idx++] != 0x03) return(nil); 56 | 57 | if (c_key[idx] > 0x80) idx += c_key[idx] - 0x80 + 1; 58 | else idx++; 59 | 60 | if (c_key[idx++] != '\0') return(nil); 61 | 62 | // Now make a new NSData from this buffer 63 | return([NSData dataWithBytes:&c_key[idx] length:len - idx]); 64 | } 65 | 66 | //credit: http://hg.mozilla.org/services/fx-home/file/tip/Sources/NetworkAndStorage/CryptoUtils.m#l1036 67 | + (NSData *)stripPrivateKeyHeader:(NSData *)d_key{ 68 | // Skip ASN.1 private key header 69 | if (d_key == nil) return(nil); 70 | 71 | unsigned long len = [d_key length]; 72 | if (!len) return(nil); 73 | 74 | unsigned char *c_key = (unsigned char *)[d_key bytes]; 75 | unsigned int idx = 22; //magic byte at offset 22 76 | 77 | if (0x04 != c_key[idx++]) return nil; 78 | 79 | //calculate length of the key 80 | unsigned int c_len = c_key[idx++]; 81 | int det = c_len & 0x80; 82 | if (!det) { 83 | c_len = c_len & 0x7f; 84 | } else { 85 | int byteCount = c_len & 0x7f; 86 | if (byteCount + idx > len) { 87 | //rsa length field longer than buffer 88 | return nil; 89 | } 90 | unsigned int accum = 0; 91 | unsigned char *ptr = &c_key[idx]; 92 | idx += byteCount; 93 | while (byteCount) { 94 | accum = (accum << 8) + *ptr; 95 | ptr++; 96 | byteCount--; 97 | } 98 | c_len = accum; 99 | } 100 | 101 | // Now make a new NSData from this buffer 102 | return [d_key subdataWithRange:NSMakeRange(idx, c_len)]; 103 | } 104 | 105 | + (SecKeyRef)addPublicKey:(NSString *)key{ 106 | NSRange spos = [key rangeOfString:@"-----BEGIN PUBLIC KEY-----"]; 107 | NSRange epos = [key rangeOfString:@"-----END PUBLIC KEY-----"]; 108 | if(spos.location != NSNotFound && epos.location != NSNotFound){ 109 | NSUInteger s = spos.location + spos.length; 110 | NSUInteger e = epos.location; 111 | NSRange range = NSMakeRange(s, e-s); 112 | key = [key substringWithRange:range]; 113 | } 114 | key = [key stringByReplacingOccurrencesOfString:@"\r" withString:@""]; 115 | key = [key stringByReplacingOccurrencesOfString:@"\n" withString:@""]; 116 | key = [key stringByReplacingOccurrencesOfString:@"\t" withString:@""]; 117 | key = [key stringByReplacingOccurrencesOfString:@" " withString:@""]; 118 | 119 | // This will be base64 encoded, decode it. 120 | NSData *data = base64_decode(key); 121 | data = [RSA stripPublicKeyHeader:data]; 122 | if(!data){ 123 | return nil; 124 | } 125 | 126 | //a tag to read/write keychain storage 127 | NSString *tag = @"RSAUtil_PubKey"; 128 | NSData *d_tag = [NSData dataWithBytes:[tag UTF8String] length:[tag length]]; 129 | 130 | // Delete any old lingering key with the same tag 131 | NSMutableDictionary *publicKey = [[NSMutableDictionary alloc] init]; 132 | [publicKey setObject:(__bridge id) kSecClassKey forKey:(__bridge id)kSecClass]; 133 | [publicKey setObject:(__bridge id) kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType]; 134 | [publicKey setObject:d_tag forKey:(__bridge id)kSecAttrApplicationTag]; 135 | SecItemDelete((__bridge CFDictionaryRef)publicKey); 136 | 137 | // Add persistent version of the key to system keychain 138 | [publicKey setObject:data forKey:(__bridge id)kSecValueData]; 139 | [publicKey setObject:(__bridge id) kSecAttrKeyClassPublic forKey:(__bridge id) 140 | kSecAttrKeyClass]; 141 | [publicKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id) 142 | kSecReturnPersistentRef]; 143 | 144 | CFTypeRef persistKey = nil; 145 | OSStatus status = SecItemAdd((__bridge CFDictionaryRef)publicKey, &persistKey); 146 | if (persistKey != nil){ 147 | CFRelease(persistKey); 148 | } 149 | if ((status != noErr) && (status != errSecDuplicateItem)) { 150 | return nil; 151 | } 152 | 153 | [publicKey removeObjectForKey:(__bridge id)kSecValueData]; 154 | [publicKey removeObjectForKey:(__bridge id)kSecReturnPersistentRef]; 155 | [publicKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnRef]; 156 | [publicKey setObject:(__bridge id) kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType]; 157 | 158 | // Now fetch the SecKeyRef version of the key 159 | SecKeyRef keyRef = nil; 160 | status = SecItemCopyMatching((__bridge CFDictionaryRef)publicKey, (CFTypeRef *)&keyRef); 161 | if(status != noErr){ 162 | return nil; 163 | } 164 | return keyRef; 165 | } 166 | 167 | + (SecKeyRef)addPrivateKey:(NSString *)key{ 168 | NSRange spos; 169 | NSRange epos; 170 | spos = [key rangeOfString:@"-----BEGIN RSA PRIVATE KEY-----"]; 171 | if(spos.length > 0){ 172 | epos = [key rangeOfString:@"-----END RSA PRIVATE KEY-----"]; 173 | }else{ 174 | spos = [key rangeOfString:@"-----BEGIN PRIVATE KEY-----"]; 175 | epos = [key rangeOfString:@"-----END PRIVATE KEY-----"]; 176 | } 177 | if(spos.location != NSNotFound && epos.location != NSNotFound){ 178 | NSUInteger s = spos.location + spos.length; 179 | NSUInteger e = epos.location; 180 | NSRange range = NSMakeRange(s, e-s); 181 | key = [key substringWithRange:range]; 182 | } 183 | key = [key stringByReplacingOccurrencesOfString:@"\r" withString:@""]; 184 | key = [key stringByReplacingOccurrencesOfString:@"\n" withString:@""]; 185 | key = [key stringByReplacingOccurrencesOfString:@"\t" withString:@""]; 186 | key = [key stringByReplacingOccurrencesOfString:@" " withString:@""]; 187 | 188 | // This will be base64 encoded, decode it. 189 | NSData *data = base64_decode(key); 190 | data = [RSA stripPrivateKeyHeader:data]; 191 | if(!data){ 192 | return nil; 193 | } 194 | 195 | //a tag to read/write keychain storage 196 | NSString *tag = @"RSAUtil_PrivKey"; 197 | NSData *d_tag = [NSData dataWithBytes:[tag UTF8String] length:[tag length]]; 198 | 199 | // Delete any old lingering key with the same tag 200 | NSMutableDictionary *privateKey = [[NSMutableDictionary alloc] init]; 201 | [privateKey setObject:(__bridge id) kSecClassKey forKey:(__bridge id)kSecClass]; 202 | [privateKey setObject:(__bridge id) kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType]; 203 | [privateKey setObject:d_tag forKey:(__bridge id)kSecAttrApplicationTag]; 204 | SecItemDelete((__bridge CFDictionaryRef)privateKey); 205 | 206 | // Add persistent version of the key to system keychain 207 | [privateKey setObject:data forKey:(__bridge id)kSecValueData]; 208 | [privateKey setObject:(__bridge id) kSecAttrKeyClassPrivate forKey:(__bridge id) 209 | kSecAttrKeyClass]; 210 | [privateKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id) 211 | kSecReturnPersistentRef]; 212 | 213 | CFTypeRef persistKey = nil; 214 | OSStatus status = SecItemAdd((__bridge CFDictionaryRef)privateKey, &persistKey); 215 | if (persistKey != nil){ 216 | CFRelease(persistKey); 217 | } 218 | if ((status != noErr) && (status != errSecDuplicateItem)) { 219 | return nil; 220 | } 221 | 222 | [privateKey removeObjectForKey:(__bridge id)kSecValueData]; 223 | [privateKey removeObjectForKey:(__bridge id)kSecReturnPersistentRef]; 224 | [privateKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnRef]; 225 | [privateKey setObject:(__bridge id) kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType]; 226 | 227 | // Now fetch the SecKeyRef version of the key 228 | SecKeyRef keyRef = nil; 229 | status = SecItemCopyMatching((__bridge CFDictionaryRef)privateKey, (CFTypeRef *)&keyRef); 230 | if(status != noErr){ 231 | return nil; 232 | } 233 | return keyRef; 234 | } 235 | 236 | /* START: Encryption & Decryption with RSA private key */ 237 | 238 | + (NSData *)encryptData:(NSData *)data withKeyRef:(SecKeyRef) keyRef{ 239 | const uint8_t *srcbuf = (const uint8_t *)[data bytes]; 240 | size_t srclen = (size_t)data.length; 241 | 242 | size_t block_size = SecKeyGetBlockSize(keyRef) * sizeof(uint8_t); 243 | void *outbuf = malloc(block_size); 244 | size_t src_block_size = block_size - 11; 245 | 246 | NSMutableData *ret = [[NSMutableData alloc] init]; 247 | for(int idx=0; idx src_block_size){ 251 | data_len = src_block_size; 252 | } 253 | 254 | size_t outlen = block_size; 255 | OSStatus status = noErr; 256 | status = SecKeyEncrypt(keyRef, 257 | kSecPaddingPKCS1, 258 | srcbuf + idx, 259 | data_len, 260 | outbuf, 261 | &outlen 262 | ); 263 | if (status != 0) { 264 | NSLog(@"SecKeyEncrypt fail. Error Code: %d", status); 265 | ret = nil; 266 | break; 267 | }else{ 268 | [ret appendBytes:outbuf length:outlen]; 269 | } 270 | } 271 | 272 | free(outbuf); 273 | CFRelease(keyRef); 274 | return ret; 275 | } 276 | 277 | + (NSString *)encryptString:(NSString *)str privateKey:(NSString *)privKey{ 278 | NSData *data = [RSA encryptData:[str dataUsingEncoding:NSUTF8StringEncoding] privateKey:privKey]; 279 | NSString *ret = base64_encode_data(data); 280 | return ret; 281 | } 282 | 283 | + (NSData *)encryptData:(NSData *)data privateKey:(NSString *)privKey{ 284 | if(!data || !privKey){ 285 | return nil; 286 | } 287 | SecKeyRef keyRef = [RSA addPrivateKey:privKey]; 288 | if(!keyRef){ 289 | return nil; 290 | } 291 | return [RSA encryptData:data withKeyRef:keyRef]; 292 | } 293 | 294 | + (NSData *)decryptData:(NSData *)data withKeyRef:(SecKeyRef) keyRef{ 295 | const uint8_t *srcbuf = (const uint8_t *)[data bytes]; 296 | size_t srclen = (size_t)data.length; 297 | 298 | size_t block_size = SecKeyGetBlockSize(keyRef) * sizeof(uint8_t); 299 | UInt8 *outbuf = malloc(block_size); 300 | size_t src_block_size = block_size; 301 | 302 | NSMutableData *ret = [[NSMutableData alloc] init]; 303 | for(int idx=0; idx src_block_size){ 307 | data_len = src_block_size; 308 | } 309 | 310 | size_t outlen = block_size; 311 | OSStatus status = noErr; 312 | status = SecKeyDecrypt(keyRef, 313 | kSecPaddingNone, 314 | srcbuf + idx, 315 | data_len, 316 | outbuf, 317 | &outlen 318 | ); 319 | if (status != 0) { 320 | NSLog(@"SecKeyEncrypt fail. Error Code: %d", status); 321 | ret = nil; 322 | break; 323 | }else{ 324 | //the actual decrypted data is in the middle, locate it! 325 | int idxFirstZero = -1; 326 | int idxNextZero = (int)outlen; 327 | for ( int i = 0; i < outlen; i++ ) { 328 | if ( outbuf[i] == 0 ) { 329 | if ( idxFirstZero < 0 ) { 330 | idxFirstZero = i; 331 | } else { 332 | idxNextZero = i; 333 | break; 334 | } 335 | } 336 | } 337 | 338 | [ret appendBytes:&outbuf[idxFirstZero+1] length:idxNextZero-idxFirstZero-1]; 339 | } 340 | } 341 | 342 | free(outbuf); 343 | CFRelease(keyRef); 344 | return ret; 345 | } 346 | 347 | 348 | + (NSString *)decryptString:(NSString *)str privateKey:(NSString *)privKey{ 349 | NSData *data = [[NSData alloc] initWithBase64EncodedString:str options:NSDataBase64DecodingIgnoreUnknownCharacters]; 350 | data = [RSA decryptData:data privateKey:privKey]; 351 | NSString *ret = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 352 | return ret; 353 | } 354 | 355 | + (NSData *)decryptData:(NSData *)data privateKey:(NSString *)privKey{ 356 | if(!data || !privKey){ 357 | return nil; 358 | } 359 | SecKeyRef keyRef = [RSA addPrivateKey:privKey]; 360 | if(!keyRef){ 361 | return nil; 362 | } 363 | return [RSA decryptData:data withKeyRef:keyRef]; 364 | } 365 | 366 | /* END: Encryption & Decryption with RSA private key */ 367 | 368 | /* START: Encryption & Decryption with RSA public key */ 369 | 370 | + (NSString *)encryptString:(NSString *)str publicKey:(NSString *)pubKey{ 371 | NSData *data = [RSA encryptData:[str dataUsingEncoding:NSUTF8StringEncoding] publicKey:pubKey]; 372 | NSString *ret = base64_encode_data(data); 373 | return ret; 374 | } 375 | 376 | + (NSData *)encryptData:(NSData *)data publicKey:(NSString *)pubKey{ 377 | if(!data || !pubKey){ 378 | return nil; 379 | } 380 | SecKeyRef keyRef = [RSA addPublicKey:pubKey]; 381 | if(!keyRef){ 382 | return nil; 383 | } 384 | return [RSA encryptData:data withKeyRef:keyRef]; 385 | } 386 | 387 | + (NSString *)decryptString:(NSString *)str publicKey:(NSString *)pubKey{ 388 | NSData *data = [[NSData alloc] initWithBase64EncodedString:str options:NSDataBase64DecodingIgnoreUnknownCharacters]; 389 | data = [RSA decryptData:data publicKey:pubKey]; 390 | NSString *ret = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 391 | return ret; 392 | } 393 | 394 | + (NSData *)decryptData:(NSData *)data publicKey:(NSString *)pubKey{ 395 | if(!data || !pubKey){ 396 | return nil; 397 | } 398 | SecKeyRef keyRef = [RSA addPublicKey:pubKey]; 399 | if(!keyRef){ 400 | return nil; 401 | } 402 | return [RSA decryptData:data withKeyRef:keyRef]; 403 | } 404 | 405 | /* END: Encryption & Decryption with RSA public key */ 406 | 407 | @end 408 | -------------------------------------------------------------------------------- /EncryptionTools/EncryptionTools.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 60638A701CEB154C0039DE1A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 60638A6F1CEB154C0039DE1A /* main.m */; }; 11 | 60638A731CEB154C0039DE1A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 60638A721CEB154C0039DE1A /* AppDelegate.m */; }; 12 | 60638A761CEB154D0039DE1A /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 60638A751CEB154D0039DE1A /* ViewController.m */; }; 13 | 60638A791CEB154D0039DE1A /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 60638A771CEB154D0039DE1A /* Main.storyboard */; }; 14 | 60638A7B1CEB154D0039DE1A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 60638A7A1CEB154D0039DE1A /* Assets.xcassets */; }; 15 | 60638A7E1CEB154D0039DE1A /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 60638A7C1CEB154D0039DE1A /* LaunchScreen.storyboard */; }; 16 | 60638A911CEDBB5C0039DE1A /* Base64.m in Sources */ = {isa = PBXBuildFile; fileRef = 60638A8E1CEDBB5C0039DE1A /* Base64.m */; }; 17 | 60638A921CEDBB5C0039DE1A /* CocoaSecurity.m in Sources */ = {isa = PBXBuildFile; fileRef = 60638A901CEDBB5C0039DE1A /* CocoaSecurity.m */; }; 18 | 60638A981CEEF71D0039DE1A /* NSString+Hash.m in Sources */ = {isa = PBXBuildFile; fileRef = 60638A971CEEF71D0039DE1A /* NSString+Hash.m */; }; 19 | 6069CA651CF2D50A00FDC811 /* README.md in Sources */ = {isa = PBXBuildFile; fileRef = 6069CA641CF2D50A00FDC811 /* README.md */; }; 20 | 6088B0E71D0020B600BF676A /* NSString+Encryption.m in Sources */ = {isa = PBXBuildFile; fileRef = 6088B0E61D0020B600BF676A /* NSString+Encryption.m */; }; 21 | 6088B0EE1D0D5E2B00BF676A /* RSA.m in Sources */ = {isa = PBXBuildFile; fileRef = 6088B0ED1D0D5E2B00BF676A /* RSA.m */; }; 22 | /* End PBXBuildFile section */ 23 | 24 | /* Begin PBXFileReference section */ 25 | 60638A6B1CEB154C0039DE1A /* EncryptionTools.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = EncryptionTools.app; sourceTree = BUILT_PRODUCTS_DIR; }; 26 | 60638A6F1CEB154C0039DE1A /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 27 | 60638A711CEB154C0039DE1A /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 28 | 60638A721CEB154C0039DE1A /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 29 | 60638A741CEB154C0039DE1A /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 30 | 60638A751CEB154D0039DE1A /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 31 | 60638A781CEB154D0039DE1A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 32 | 60638A7A1CEB154D0039DE1A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 33 | 60638A7D1CEB154D0039DE1A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 34 | 60638A7F1CEB154D0039DE1A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 35 | 60638A8D1CEDBB5C0039DE1A /* Base64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Base64.h; sourceTree = ""; }; 36 | 60638A8E1CEDBB5C0039DE1A /* Base64.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Base64.m; sourceTree = ""; }; 37 | 60638A8F1CEDBB5C0039DE1A /* CocoaSecurity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CocoaSecurity.h; sourceTree = ""; }; 38 | 60638A901CEDBB5C0039DE1A /* CocoaSecurity.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CocoaSecurity.m; sourceTree = ""; }; 39 | 60638A961CEEF71D0039DE1A /* NSString+Hash.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+Hash.h"; sourceTree = ""; }; 40 | 60638A971CEEF71D0039DE1A /* NSString+Hash.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+Hash.m"; sourceTree = ""; }; 41 | 6069CA641CF2D50A00FDC811 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../../README.md; sourceTree = ""; }; 42 | 6088B0E51D0020B600BF676A /* NSString+Encryption.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+Encryption.h"; sourceTree = ""; }; 43 | 6088B0E61D0020B600BF676A /* NSString+Encryption.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+Encryption.m"; sourceTree = ""; }; 44 | 6088B0EC1D0D5E2B00BF676A /* RSA.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RSA.h; sourceTree = ""; }; 45 | 6088B0ED1D0D5E2B00BF676A /* RSA.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RSA.m; sourceTree = ""; }; 46 | /* End PBXFileReference section */ 47 | 48 | /* Begin PBXFrameworksBuildPhase section */ 49 | 60638A681CEB154C0039DE1A /* Frameworks */ = { 50 | isa = PBXFrameworksBuildPhase; 51 | buildActionMask = 2147483647; 52 | files = ( 53 | ); 54 | runOnlyForDeploymentPostprocessing = 0; 55 | }; 56 | /* End PBXFrameworksBuildPhase section */ 57 | 58 | /* Begin PBXGroup section */ 59 | 60638A621CEB154C0039DE1A = { 60 | isa = PBXGroup; 61 | children = ( 62 | 60638A6D1CEB154C0039DE1A /* EncryptionTools */, 63 | 60638A6C1CEB154C0039DE1A /* Products */, 64 | ); 65 | sourceTree = ""; 66 | }; 67 | 60638A6C1CEB154C0039DE1A /* Products */ = { 68 | isa = PBXGroup; 69 | children = ( 70 | 60638A6B1CEB154C0039DE1A /* EncryptionTools.app */, 71 | ); 72 | name = Products; 73 | sourceTree = ""; 74 | }; 75 | 60638A6D1CEB154C0039DE1A /* EncryptionTools */ = { 76 | isa = PBXGroup; 77 | children = ( 78 | 60638A711CEB154C0039DE1A /* AppDelegate.h */, 79 | 60638A721CEB154C0039DE1A /* AppDelegate.m */, 80 | 60638A741CEB154C0039DE1A /* ViewController.h */, 81 | 60638A751CEB154D0039DE1A /* ViewController.m */, 82 | 60638A8C1CEDBB5C0039DE1A /* Encryptions */, 83 | 60638A771CEB154D0039DE1A /* Main.storyboard */, 84 | 60638A7A1CEB154D0039DE1A /* Assets.xcassets */, 85 | 60638A7C1CEB154D0039DE1A /* LaunchScreen.storyboard */, 86 | 60638A7F1CEB154D0039DE1A /* Info.plist */, 87 | 60638A6E1CEB154C0039DE1A /* Supporting Files */, 88 | ); 89 | path = EncryptionTools; 90 | sourceTree = ""; 91 | }; 92 | 60638A6E1CEB154C0039DE1A /* Supporting Files */ = { 93 | isa = PBXGroup; 94 | children = ( 95 | 6069CA641CF2D50A00FDC811 /* README.md */, 96 | 60638A6F1CEB154C0039DE1A /* main.m */, 97 | ); 98 | name = "Supporting Files"; 99 | sourceTree = ""; 100 | }; 101 | 60638A8C1CEDBB5C0039DE1A /* Encryptions */ = { 102 | isa = PBXGroup; 103 | children = ( 104 | 6088B0E81D080E1000BF676A /* RSAEncrypt */, 105 | 60638A951CEEF71D0039DE1A /* Hash */, 106 | 6088B0E41D0020A700BF676A /* NSString+Encryption */, 107 | 60638A8D1CEDBB5C0039DE1A /* Base64.h */, 108 | 60638A8E1CEDBB5C0039DE1A /* Base64.m */, 109 | 60638A8F1CEDBB5C0039DE1A /* CocoaSecurity.h */, 110 | 60638A901CEDBB5C0039DE1A /* CocoaSecurity.m */, 111 | ); 112 | path = Encryptions; 113 | sourceTree = ""; 114 | }; 115 | 60638A951CEEF71D0039DE1A /* Hash */ = { 116 | isa = PBXGroup; 117 | children = ( 118 | 60638A961CEEF71D0039DE1A /* NSString+Hash.h */, 119 | 60638A971CEEF71D0039DE1A /* NSString+Hash.m */, 120 | ); 121 | path = Hash; 122 | sourceTree = ""; 123 | }; 124 | 6088B0E41D0020A700BF676A /* NSString+Encryption */ = { 125 | isa = PBXGroup; 126 | children = ( 127 | 6088B0E51D0020B600BF676A /* NSString+Encryption.h */, 128 | 6088B0E61D0020B600BF676A /* NSString+Encryption.m */, 129 | ); 130 | path = "NSString+Encryption"; 131 | sourceTree = ""; 132 | }; 133 | 6088B0E81D080E1000BF676A /* RSAEncrypt */ = { 134 | isa = PBXGroup; 135 | children = ( 136 | 6088B0EC1D0D5E2B00BF676A /* RSA.h */, 137 | 6088B0ED1D0D5E2B00BF676A /* RSA.m */, 138 | ); 139 | path = RSAEncrypt; 140 | sourceTree = ""; 141 | }; 142 | /* End PBXGroup section */ 143 | 144 | /* Begin PBXNativeTarget section */ 145 | 60638A6A1CEB154C0039DE1A /* EncryptionTools */ = { 146 | isa = PBXNativeTarget; 147 | buildConfigurationList = 60638A821CEB154D0039DE1A /* Build configuration list for PBXNativeTarget "EncryptionTools" */; 148 | buildPhases = ( 149 | 60638A671CEB154C0039DE1A /* Sources */, 150 | 60638A681CEB154C0039DE1A /* Frameworks */, 151 | 60638A691CEB154C0039DE1A /* Resources */, 152 | ); 153 | buildRules = ( 154 | ); 155 | dependencies = ( 156 | ); 157 | name = EncryptionTools; 158 | productName = EncryptionTools; 159 | productReference = 60638A6B1CEB154C0039DE1A /* EncryptionTools.app */; 160 | productType = "com.apple.product-type.application"; 161 | }; 162 | /* End PBXNativeTarget section */ 163 | 164 | /* Begin PBXProject section */ 165 | 60638A631CEB154C0039DE1A /* Project object */ = { 166 | isa = PBXProject; 167 | attributes = { 168 | LastUpgradeCheck = 0730; 169 | ORGANIZATIONNAME = com.personal; 170 | TargetAttributes = { 171 | 60638A6A1CEB154C0039DE1A = { 172 | CreatedOnToolsVersion = 7.3; 173 | }; 174 | }; 175 | }; 176 | buildConfigurationList = 60638A661CEB154C0039DE1A /* Build configuration list for PBXProject "EncryptionTools" */; 177 | compatibilityVersion = "Xcode 3.2"; 178 | developmentRegion = English; 179 | hasScannedForEncodings = 0; 180 | knownRegions = ( 181 | en, 182 | Base, 183 | ); 184 | mainGroup = 60638A621CEB154C0039DE1A; 185 | productRefGroup = 60638A6C1CEB154C0039DE1A /* Products */; 186 | projectDirPath = ""; 187 | projectRoot = ""; 188 | targets = ( 189 | 60638A6A1CEB154C0039DE1A /* EncryptionTools */, 190 | ); 191 | }; 192 | /* End PBXProject section */ 193 | 194 | /* Begin PBXResourcesBuildPhase section */ 195 | 60638A691CEB154C0039DE1A /* Resources */ = { 196 | isa = PBXResourcesBuildPhase; 197 | buildActionMask = 2147483647; 198 | files = ( 199 | 60638A7E1CEB154D0039DE1A /* LaunchScreen.storyboard in Resources */, 200 | 60638A7B1CEB154D0039DE1A /* Assets.xcassets in Resources */, 201 | 60638A791CEB154D0039DE1A /* Main.storyboard in Resources */, 202 | ); 203 | runOnlyForDeploymentPostprocessing = 0; 204 | }; 205 | /* End PBXResourcesBuildPhase section */ 206 | 207 | /* Begin PBXSourcesBuildPhase section */ 208 | 60638A671CEB154C0039DE1A /* Sources */ = { 209 | isa = PBXSourcesBuildPhase; 210 | buildActionMask = 2147483647; 211 | files = ( 212 | 60638A981CEEF71D0039DE1A /* NSString+Hash.m in Sources */, 213 | 60638A761CEB154D0039DE1A /* ViewController.m in Sources */, 214 | 60638A911CEDBB5C0039DE1A /* Base64.m in Sources */, 215 | 6069CA651CF2D50A00FDC811 /* README.md in Sources */, 216 | 60638A921CEDBB5C0039DE1A /* CocoaSecurity.m in Sources */, 217 | 60638A731CEB154C0039DE1A /* AppDelegate.m in Sources */, 218 | 6088B0EE1D0D5E2B00BF676A /* RSA.m in Sources */, 219 | 6088B0E71D0020B600BF676A /* NSString+Encryption.m in Sources */, 220 | 60638A701CEB154C0039DE1A /* main.m in Sources */, 221 | ); 222 | runOnlyForDeploymentPostprocessing = 0; 223 | }; 224 | /* End PBXSourcesBuildPhase section */ 225 | 226 | /* Begin PBXVariantGroup section */ 227 | 60638A771CEB154D0039DE1A /* Main.storyboard */ = { 228 | isa = PBXVariantGroup; 229 | children = ( 230 | 60638A781CEB154D0039DE1A /* Base */, 231 | ); 232 | name = Main.storyboard; 233 | sourceTree = ""; 234 | }; 235 | 60638A7C1CEB154D0039DE1A /* LaunchScreen.storyboard */ = { 236 | isa = PBXVariantGroup; 237 | children = ( 238 | 60638A7D1CEB154D0039DE1A /* Base */, 239 | ); 240 | name = LaunchScreen.storyboard; 241 | sourceTree = ""; 242 | }; 243 | /* End PBXVariantGroup section */ 244 | 245 | /* Begin XCBuildConfiguration section */ 246 | 60638A801CEB154D0039DE1A /* Debug */ = { 247 | isa = XCBuildConfiguration; 248 | buildSettings = { 249 | ALWAYS_SEARCH_USER_PATHS = NO; 250 | CLANG_ANALYZER_NONNULL = YES; 251 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 252 | CLANG_CXX_LIBRARY = "libc++"; 253 | CLANG_ENABLE_MODULES = YES; 254 | CLANG_ENABLE_OBJC_ARC = YES; 255 | CLANG_WARN_BOOL_CONVERSION = YES; 256 | CLANG_WARN_CONSTANT_CONVERSION = YES; 257 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 258 | CLANG_WARN_EMPTY_BODY = YES; 259 | CLANG_WARN_ENUM_CONVERSION = YES; 260 | CLANG_WARN_INT_CONVERSION = YES; 261 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 262 | CLANG_WARN_UNREACHABLE_CODE = YES; 263 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 264 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 265 | COPY_PHASE_STRIP = NO; 266 | DEBUG_INFORMATION_FORMAT = dwarf; 267 | ENABLE_STRICT_OBJC_MSGSEND = YES; 268 | ENABLE_TESTABILITY = YES; 269 | GCC_C_LANGUAGE_STANDARD = gnu99; 270 | GCC_DYNAMIC_NO_PIC = NO; 271 | GCC_NO_COMMON_BLOCKS = YES; 272 | GCC_OPTIMIZATION_LEVEL = 0; 273 | GCC_PREPROCESSOR_DEFINITIONS = ( 274 | "DEBUG=1", 275 | "$(inherited)", 276 | ); 277 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 278 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 279 | GCC_WARN_UNDECLARED_SELECTOR = YES; 280 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 281 | GCC_WARN_UNUSED_FUNCTION = YES; 282 | GCC_WARN_UNUSED_VARIABLE = YES; 283 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 284 | MTL_ENABLE_DEBUG_INFO = YES; 285 | ONLY_ACTIVE_ARCH = YES; 286 | SDKROOT = iphoneos; 287 | }; 288 | name = Debug; 289 | }; 290 | 60638A811CEB154D0039DE1A /* Release */ = { 291 | isa = XCBuildConfiguration; 292 | buildSettings = { 293 | ALWAYS_SEARCH_USER_PATHS = NO; 294 | CLANG_ANALYZER_NONNULL = YES; 295 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 296 | CLANG_CXX_LIBRARY = "libc++"; 297 | CLANG_ENABLE_MODULES = YES; 298 | CLANG_ENABLE_OBJC_ARC = YES; 299 | CLANG_WARN_BOOL_CONVERSION = YES; 300 | CLANG_WARN_CONSTANT_CONVERSION = YES; 301 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 302 | CLANG_WARN_EMPTY_BODY = YES; 303 | CLANG_WARN_ENUM_CONVERSION = YES; 304 | CLANG_WARN_INT_CONVERSION = YES; 305 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 306 | CLANG_WARN_UNREACHABLE_CODE = YES; 307 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 308 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 309 | COPY_PHASE_STRIP = NO; 310 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 311 | ENABLE_NS_ASSERTIONS = NO; 312 | ENABLE_STRICT_OBJC_MSGSEND = YES; 313 | GCC_C_LANGUAGE_STANDARD = gnu99; 314 | GCC_NO_COMMON_BLOCKS = YES; 315 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 316 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 317 | GCC_WARN_UNDECLARED_SELECTOR = YES; 318 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 319 | GCC_WARN_UNUSED_FUNCTION = YES; 320 | GCC_WARN_UNUSED_VARIABLE = YES; 321 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 322 | MTL_ENABLE_DEBUG_INFO = NO; 323 | SDKROOT = iphoneos; 324 | VALIDATE_PRODUCT = YES; 325 | }; 326 | name = Release; 327 | }; 328 | 60638A831CEB154D0039DE1A /* Debug */ = { 329 | isa = XCBuildConfiguration; 330 | buildSettings = { 331 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 332 | INFOPLIST_FILE = EncryptionTools/Info.plist; 333 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 334 | PRODUCT_BUNDLE_IDENTIFIER = com.personal.mdd.EncryptionTools; 335 | PRODUCT_NAME = "$(TARGET_NAME)"; 336 | }; 337 | name = Debug; 338 | }; 339 | 60638A841CEB154D0039DE1A /* Release */ = { 340 | isa = XCBuildConfiguration; 341 | buildSettings = { 342 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 343 | INFOPLIST_FILE = EncryptionTools/Info.plist; 344 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 345 | PRODUCT_BUNDLE_IDENTIFIER = com.personal.mdd.EncryptionTools; 346 | PRODUCT_NAME = "$(TARGET_NAME)"; 347 | }; 348 | name = Release; 349 | }; 350 | /* End XCBuildConfiguration section */ 351 | 352 | /* Begin XCConfigurationList section */ 353 | 60638A661CEB154C0039DE1A /* Build configuration list for PBXProject "EncryptionTools" */ = { 354 | isa = XCConfigurationList; 355 | buildConfigurations = ( 356 | 60638A801CEB154D0039DE1A /* Debug */, 357 | 60638A811CEB154D0039DE1A /* Release */, 358 | ); 359 | defaultConfigurationIsVisible = 0; 360 | defaultConfigurationName = Release; 361 | }; 362 | 60638A821CEB154D0039DE1A /* Build configuration list for PBXNativeTarget "EncryptionTools" */ = { 363 | isa = XCConfigurationList; 364 | buildConfigurations = ( 365 | 60638A831CEB154D0039DE1A /* Debug */, 366 | 60638A841CEB154D0039DE1A /* Release */, 367 | ); 368 | defaultConfigurationIsVisible = 0; 369 | defaultConfigurationName = Release; 370 | }; 371 | /* End XCConfigurationList section */ 372 | }; 373 | rootObject = 60638A631CEB154C0039DE1A /* Project object */; 374 | } 375 | -------------------------------------------------------------------------------- /EncryptionTools/EncryptionTools/Encryptions/CocoaSecurity.m: -------------------------------------------------------------------------------- 1 | // 2 | // CocoaSecurity.m 3 | // 4 | // Created by Kelp on 12/5/12. 5 | // Copyright (c) 2012 Kelp http://kelp.phate.org/ 6 | // MIT License 7 | // 8 | 9 | #import "CocoaSecurity.h" 10 | #import 11 | #import 12 | #import "Base64.h" 13 | 14 | #pragma mark - CocoaSecurity 15 | @implementation CocoaSecurity 16 | 17 | 18 | #pragma mark - AES Encrypt 19 | // default AES Encrypt, key -> SHA384(key).sub(0, 32), iv -> SHA384(key).sub(32, 16) 20 | + (CocoaSecurityResult *)aesEncrypt:(NSString *)data key:(NSString *)key 21 | { 22 | CocoaSecurityResult * sha = [self sha384:key]; 23 | NSData *aesKey = [sha.data subdataWithRange:NSMakeRange(0, 32)]; 24 | NSData *aesIv = [sha.data subdataWithRange:NSMakeRange(32, 16)]; 25 | 26 | return [self aesEncrypt:data key:aesKey iv:aesIv]; 27 | } 28 | #pragma mark AES Encrypt 128, 192, 256 29 | + (CocoaSecurityResult *)aesEncrypt:(NSString *)data hexKey:(NSString *)key hexIv:(NSString *)iv 30 | { 31 | CocoaSecurityDecoder *decoder = [CocoaSecurityDecoder new]; 32 | NSData *aesKey = [decoder hex:key]; 33 | NSData *aesIv = [decoder hex:iv]; 34 | 35 | return [self aesEncrypt:data key:aesKey iv:aesIv]; 36 | } 37 | + (CocoaSecurityResult *)aesEncrypt:(NSString *)data key:(NSData *)key iv:(NSData *)iv 38 | { 39 | return [self aesEncryptWithData:[data dataUsingEncoding:NSUTF8StringEncoding] key:key iv:iv]; 40 | } 41 | + (CocoaSecurityResult *)aesEncryptWithData:(NSData *)data key:(NSData *)key iv:(NSData *)iv 42 | { 43 | // check length of key and iv 44 | if ([iv length] != 16) { 45 | @throw [NSException exceptionWithName:@"Cocoa Security" 46 | reason:@"Length of iv is wrong. Length of iv should be 16(128bits)" 47 | userInfo:nil]; 48 | } 49 | if ([key length] != 16 && [key length] != 24 && [key length] != 32 ) { 50 | @throw [NSException exceptionWithName:@"Cocoa Security" 51 | reason:@"Length of key is wrong. Length of iv should be 16, 24 or 32(128, 192 or 256bits)" 52 | userInfo:nil]; 53 | } 54 | 55 | // setup output buffer 56 | size_t bufferSize = [data length] + kCCBlockSizeAES128; 57 | void *buffer = malloc(bufferSize); 58 | 59 | // do encrypt 60 | size_t encryptedSize = 0; 61 | CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, 62 | kCCAlgorithmAES128, 63 | kCCOptionPKCS7Padding, 64 | [key bytes], // Key 65 | [key length], // kCCKeySizeAES 66 | [iv bytes], // IV 67 | [data bytes], 68 | [data length], 69 | buffer, 70 | bufferSize, 71 | &encryptedSize); 72 | if (cryptStatus == kCCSuccess) { 73 | CocoaSecurityResult *result = [[CocoaSecurityResult alloc] initWithBytes:buffer length:encryptedSize]; 74 | free(buffer); 75 | 76 | return result; 77 | } 78 | else { 79 | free(buffer); 80 | @throw [NSException exceptionWithName:@"Cocoa Security" 81 | reason:@"Encrypt Error!" 82 | userInfo:nil]; 83 | return nil; 84 | } 85 | } 86 | #pragma mark - AES Decrypt 87 | // default AES Decrypt, key -> SHA384(key).sub(0, 32), iv -> SHA384(key).sub(32, 16) 88 | + (CocoaSecurityResult *)aesDecryptWithBase64:(NSString *)data key:(NSString *)key 89 | { 90 | CocoaSecurityResult * sha = [self sha384:key]; 91 | NSData *aesKey = [sha.data subdataWithRange:NSMakeRange(0, 32)]; 92 | NSData *aesIv = [sha.data subdataWithRange:NSMakeRange(32, 16)]; 93 | 94 | return [self aesDecryptWithBase64:data key:aesKey iv:aesIv]; 95 | } 96 | #pragma mark AES Decrypt 128, 192, 256 97 | + (CocoaSecurityResult *)aesDecryptWithBase64:(NSString *)data hexKey:(NSString *)key hexIv:(NSString *)iv 98 | { 99 | CocoaSecurityDecoder *decoder = [CocoaSecurityDecoder new]; 100 | NSData *aesKey = [decoder hex:key]; 101 | NSData *aesIv = [decoder hex:iv]; 102 | 103 | return [self aesDecryptWithBase64:data key:aesKey iv:aesIv]; 104 | } 105 | + (CocoaSecurityResult *)aesDecryptWithBase64:(NSString *)data key:(NSData *)key iv:(NSData *)iv 106 | { 107 | CocoaSecurityDecoder *decoder = [CocoaSecurityDecoder new]; 108 | return [self aesDecryptWithData:[decoder base64:data] key:key iv:iv]; 109 | } 110 | + (CocoaSecurityResult *)aesDecryptWithData:(NSData *)data key:(NSData *)key iv:(NSData *)iv 111 | { 112 | // check length of key and iv 113 | if ([iv length] != 16) { 114 | @throw [NSException exceptionWithName:@"Cocoa Security" 115 | reason:@"Length of iv is wrong. Length of iv should be 16(128bits)" 116 | userInfo:nil]; 117 | } 118 | if ([key length] != 16 && [key length] != 24 && [key length] != 32 ) { 119 | @throw [NSException exceptionWithName:@"Cocoa Security" 120 | reason:@"Length of key is wrong. Length of iv should be 16, 24 or 32(128, 192 or 256bits)" 121 | userInfo:nil]; 122 | } 123 | 124 | // setup output buffer 125 | size_t bufferSize = [data length] + kCCBlockSizeAES128; 126 | void *buffer = malloc(bufferSize); 127 | 128 | // do encrypt 129 | size_t encryptedSize = 0; 130 | CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, 131 | kCCAlgorithmAES128, 132 | kCCOptionPKCS7Padding, 133 | [key bytes], // Key 134 | [key length], // kCCKeySizeAES 135 | [iv bytes], // IV 136 | [data bytes], 137 | [data length], 138 | buffer, 139 | bufferSize, 140 | &encryptedSize); 141 | if (cryptStatus == kCCSuccess) { 142 | CocoaSecurityResult *result = [[CocoaSecurityResult alloc] initWithBytes:buffer length:encryptedSize]; 143 | free(buffer); 144 | 145 | return result; 146 | } 147 | else { 148 | free(buffer); 149 | @throw [NSException exceptionWithName:@"Cocoa Security" 150 | reason:@"Decrypt Error!" 151 | userInfo:nil]; 152 | return nil; 153 | } 154 | } 155 | 156 | 157 | #pragma mark - MD5 158 | + (CocoaSecurityResult *)md5:(NSString *)hashString 159 | { 160 | return [self md5WithData:[hashString dataUsingEncoding:NSUTF8StringEncoding]]; 161 | } 162 | + (CocoaSecurityResult *)md5WithData:(NSData *)hashData 163 | { 164 | unsigned char *digest; 165 | digest = malloc(CC_MD5_DIGEST_LENGTH); 166 | 167 | CC_MD5([hashData bytes], (CC_LONG)[hashData length], digest); 168 | CocoaSecurityResult *result = [[CocoaSecurityResult alloc] initWithBytes:digest length:CC_MD5_DIGEST_LENGTH]; 169 | free(digest); 170 | 171 | return result; 172 | } 173 | #pragma mark - HMAC-MD5 174 | + (CocoaSecurityResult *)hmacMd5:(NSString *)hashString hmacKey:(NSString *)key 175 | { 176 | return [self hmacMd5WithData:[hashString dataUsingEncoding:NSUTF8StringEncoding] hmacKey:key]; 177 | } 178 | + (CocoaSecurityResult *)hmacMd5WithData:(NSData *)hashData hmacKey:(NSString *)key 179 | { 180 | unsigned char *digest; 181 | digest = malloc(CC_MD5_DIGEST_LENGTH); 182 | const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding]; 183 | 184 | CCHmac(kCCHmacAlgMD5, cKey, strlen(cKey), [hashData bytes], [hashData length], digest); 185 | CocoaSecurityResult *result = [[CocoaSecurityResult alloc] initWithBytes:digest length:CC_MD5_DIGEST_LENGTH]; 186 | free(digest); 187 | cKey = nil; 188 | 189 | return result; 190 | } 191 | 192 | 193 | #pragma mark - SHA1 194 | + (CocoaSecurityResult *)sha1:(NSString *)hashString 195 | { 196 | return [self sha1WithData:[hashString dataUsingEncoding:NSUTF8StringEncoding]]; 197 | } 198 | + (CocoaSecurityResult *)sha1WithData:(NSData *)hashData 199 | { 200 | unsigned char *digest; 201 | digest = malloc(CC_SHA1_DIGEST_LENGTH); 202 | 203 | CC_SHA1([hashData bytes], (CC_LONG)[hashData length], digest); 204 | CocoaSecurityResult *result = [[CocoaSecurityResult alloc] initWithBytes:digest length:CC_SHA1_DIGEST_LENGTH]; 205 | free(digest); 206 | 207 | return result; 208 | } 209 | #pragma mark SHA224 210 | + (CocoaSecurityResult *)sha224:(NSString *)hashString 211 | { 212 | return [self sha224WithData:[hashString dataUsingEncoding:NSUTF8StringEncoding]]; 213 | } 214 | + (CocoaSecurityResult *)sha224WithData:(NSData *)hashData 215 | { 216 | unsigned char *digest; 217 | digest = malloc(CC_SHA224_DIGEST_LENGTH); 218 | 219 | CC_SHA224([hashData bytes], (CC_LONG)[hashData length], digest); 220 | CocoaSecurityResult *result = [[CocoaSecurityResult alloc] initWithBytes:digest length:CC_SHA224_DIGEST_LENGTH]; 221 | free(digest); 222 | 223 | return result; 224 | } 225 | #pragma mark SHA256 226 | + (CocoaSecurityResult *)sha256:(NSString *)hashString 227 | { 228 | return [self sha256WithData:[hashString dataUsingEncoding:NSUTF8StringEncoding]]; 229 | } 230 | + (CocoaSecurityResult *)sha256WithData:(NSData *)hashData 231 | { 232 | unsigned char *digest; 233 | digest = malloc(CC_SHA256_DIGEST_LENGTH); 234 | 235 | CC_SHA256([hashData bytes], (CC_LONG)[hashData length], digest); 236 | CocoaSecurityResult *result = [[CocoaSecurityResult alloc] initWithBytes:digest length:CC_SHA256_DIGEST_LENGTH]; 237 | free(digest); 238 | 239 | return result; 240 | } 241 | #pragma mark SHA384 242 | + (CocoaSecurityResult *)sha384:(NSString *)hashString 243 | { 244 | return [self sha384WithData:[hashString dataUsingEncoding:NSUTF8StringEncoding]]; 245 | } 246 | + (CocoaSecurityResult *)sha384WithData:(NSData *)hashData 247 | { 248 | unsigned char *digest; 249 | digest = malloc(CC_SHA384_DIGEST_LENGTH); 250 | 251 | CC_SHA384([hashData bytes], (CC_LONG)[hashData length], digest); 252 | CocoaSecurityResult *result = [[CocoaSecurityResult alloc] initWithBytes:digest length:CC_SHA384_DIGEST_LENGTH]; 253 | free(digest); 254 | 255 | return result; 256 | } 257 | #pragma mark SHA512 258 | + (CocoaSecurityResult *)sha512:(NSString *)hashString 259 | { 260 | return [self sha512WithData:[hashString dataUsingEncoding:NSUTF8StringEncoding]]; 261 | } 262 | + (CocoaSecurityResult *)sha512WithData:(NSData *)hashData 263 | { 264 | unsigned char *digest; 265 | digest = malloc(CC_SHA512_DIGEST_LENGTH); 266 | 267 | CC_SHA512([hashData bytes], (CC_LONG)[hashData length], digest); 268 | CocoaSecurityResult *result = [[CocoaSecurityResult alloc] initWithBytes:digest length:CC_SHA512_DIGEST_LENGTH]; 269 | free(digest); 270 | 271 | return result; 272 | } 273 | 274 | 275 | #pragma mark - HMAC-SHA1 276 | + (CocoaSecurityResult *)hmacSha1:(NSString *)hashString hmacKey:(NSString *)key 277 | { 278 | return [self hmacSha1WithData:[hashString dataUsingEncoding:NSUTF8StringEncoding] hmacKey:key]; 279 | } 280 | + (CocoaSecurityResult *)hmacSha1WithData:(NSData *)hashData hmacKey:(NSString *)key 281 | { 282 | unsigned char *digest; 283 | digest = malloc(CC_SHA1_DIGEST_LENGTH); 284 | const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding]; 285 | 286 | CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), [hashData bytes], [hashData length], digest); 287 | CocoaSecurityResult *result = [[CocoaSecurityResult alloc] initWithBytes:digest length:CC_SHA1_DIGEST_LENGTH]; 288 | free(digest); 289 | cKey = nil; 290 | 291 | return result; 292 | } 293 | #pragma mark HMAC-SHA224 294 | + (CocoaSecurityResult *)hmacSha224:(NSString *)hashString hmacKey:(NSString *)key 295 | { 296 | return [self hmacSha224WithData:[hashString dataUsingEncoding:NSUTF8StringEncoding] hmacKey:key]; 297 | } 298 | + (CocoaSecurityResult *)hmacSha224WithData:(NSData *)hashData hmacKey:(NSString *)key 299 | { 300 | unsigned char *digest; 301 | digest = malloc(CC_SHA224_DIGEST_LENGTH); 302 | const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding]; 303 | 304 | CCHmac(kCCHmacAlgSHA224, cKey, strlen(cKey), [hashData bytes], [hashData length], digest); 305 | CocoaSecurityResult *result = [[CocoaSecurityResult alloc] initWithBytes:digest length:CC_SHA224_DIGEST_LENGTH]; 306 | free(digest); 307 | cKey = nil; 308 | 309 | return result; 310 | } 311 | #pragma mark HMAC-SHA256 312 | + (CocoaSecurityResult *)hmacSha256:(NSString *)hashString hmacKey:(NSString *)key 313 | { 314 | return [self hmacSha256WithData:[hashString dataUsingEncoding:NSUTF8StringEncoding] hmacKey:key]; 315 | } 316 | + (CocoaSecurityResult *)hmacSha256WithData:(NSData *)hashData hmacKey:(NSString *)key 317 | { 318 | unsigned char *digest; 319 | digest = malloc(CC_SHA256_DIGEST_LENGTH); 320 | const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding]; 321 | 322 | CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), [hashData bytes], [hashData length], digest); 323 | CocoaSecurityResult *result = [[CocoaSecurityResult alloc] initWithBytes:digest length:CC_SHA256_DIGEST_LENGTH]; 324 | free(digest); 325 | cKey = nil; 326 | 327 | return result; 328 | } 329 | #pragma mark HMAC-SHA384 330 | + (CocoaSecurityResult *)hmacSha384:(NSString *)hashString hmacKey:(NSString *)key 331 | { 332 | return [self hmacSha384WithData:[hashString dataUsingEncoding:NSUTF8StringEncoding] hmacKey:key]; 333 | } 334 | + (CocoaSecurityResult *)hmacSha384WithData:(NSData *)hashData hmacKey:(NSString *)key 335 | { 336 | unsigned char *digest; 337 | digest = malloc(CC_SHA384_DIGEST_LENGTH); 338 | const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding]; 339 | 340 | CCHmac(kCCHmacAlgSHA384, cKey, strlen(cKey), [hashData bytes], [hashData length], digest); 341 | CocoaSecurityResult *result = [[CocoaSecurityResult alloc] initWithBytes:digest length:CC_SHA384_DIGEST_LENGTH]; 342 | free(digest); 343 | cKey = nil; 344 | 345 | return result; 346 | } 347 | #pragma mark HMAC-SHA512 348 | + (CocoaSecurityResult *)hmacSha512:(NSString *)hashString hmacKey:(NSString *)key 349 | { 350 | return [self hmacSha512WithData:[hashString dataUsingEncoding:NSUTF8StringEncoding] hmacKey:key]; 351 | } 352 | + (CocoaSecurityResult *)hmacSha512WithData:(NSData *)hashData hmacKey:(NSString *)key 353 | { 354 | unsigned char *digest; 355 | digest = malloc(CC_SHA512_DIGEST_LENGTH); 356 | const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding]; 357 | 358 | CCHmac(kCCHmacAlgSHA512, cKey, strlen(cKey), [hashData bytes], [hashData length], digest); 359 | CocoaSecurityResult *result = [[CocoaSecurityResult alloc] initWithBytes:digest length:CC_SHA512_DIGEST_LENGTH]; 360 | free(digest); 361 | cKey = nil; 362 | 363 | return result; 364 | } 365 | 366 | @end 367 | 368 | 369 | 370 | #pragma mark - CocoaSecurityResult 371 | @implementation CocoaSecurityResult 372 | 373 | @synthesize data = _data; 374 | 375 | #pragma mark - Init 376 | - (id)initWithBytes:(unsigned char[])initData length:(NSUInteger)length 377 | { 378 | self = [super init]; 379 | if (self) { 380 | _data = [NSData dataWithBytes:initData length:length]; 381 | } 382 | return self; 383 | } 384 | 385 | #pragma mark UTF8 String 386 | // convert CocoaSecurityResult to UTF8 string 387 | - (NSString *)utf8String 388 | { 389 | NSString *result = [[NSString alloc] initWithData:_data encoding:NSUTF8StringEncoding]; 390 | return result; 391 | } 392 | 393 | #pragma mark HEX 394 | // convert CocoaSecurityResult to HEX string 395 | - (NSString *)hex 396 | { 397 | CocoaSecurityEncoder *encoder = [CocoaSecurityEncoder new]; 398 | return [encoder hex:_data useLower:false]; 399 | } 400 | - (NSString *)hexLower 401 | { 402 | CocoaSecurityEncoder *encoder = [CocoaSecurityEncoder new]; 403 | return [encoder hex:_data useLower:true]; 404 | } 405 | 406 | #pragma mark Base64 407 | // convert CocoaSecurityResult to Base64 string 408 | - (NSString *)base64 409 | { 410 | CocoaSecurityEncoder *encoder = [CocoaSecurityEncoder new]; 411 | return [encoder base64:_data]; 412 | } 413 | 414 | @end 415 | 416 | 417 | #pragma mark - CocoaSecurityEncoder 418 | @implementation CocoaSecurityEncoder 419 | 420 | // convert NSData to Base64 421 | - (NSString *)base64:(NSData *)data 422 | { 423 | return [data base64EncodedString]; 424 | } 425 | 426 | // convert NSData to hex string 427 | - (NSString *)hex:(NSData *)data useLower:(BOOL)isOutputLower 428 | { 429 | if (data.length == 0) { return nil; } 430 | 431 | static const char HexEncodeCharsLower[] = "0123456789abcdef"; 432 | static const char HexEncodeChars[] = "0123456789ABCDEF"; 433 | char *resultData; 434 | // malloc result data 435 | resultData = malloc([data length] * 2 +1); 436 | // convert imgData(NSData) to char[] 437 | unsigned char *sourceData = ((unsigned char *)[data bytes]); 438 | NSUInteger length = [data length]; 439 | 440 | if (isOutputLower) { 441 | for (NSUInteger index = 0; index < length; index++) { 442 | // set result data 443 | resultData[index * 2] = HexEncodeCharsLower[(sourceData[index] >> 4)]; 444 | resultData[index * 2 + 1] = HexEncodeCharsLower[(sourceData[index] % 0x10)]; 445 | } 446 | } 447 | else { 448 | for (NSUInteger index = 0; index < length; index++) { 449 | // set result data 450 | resultData[index * 2] = HexEncodeChars[(sourceData[index] >> 4)]; 451 | resultData[index * 2 + 1] = HexEncodeChars[(sourceData[index] % 0x10)]; 452 | } 453 | } 454 | resultData[[data length] * 2] = 0; 455 | 456 | // convert result(char[]) to NSString 457 | NSString *result = [NSString stringWithCString:resultData encoding:NSASCIIStringEncoding]; 458 | sourceData = nil; 459 | free(resultData); 460 | 461 | return result; 462 | } 463 | 464 | @end 465 | 466 | #pragma mark - CocoaSecurityDecoder 467 | @implementation CocoaSecurityDecoder 468 | - (NSData *)base64:(NSString *)string 469 | { 470 | return [NSData dataWithBase64EncodedString:string]; 471 | } 472 | - (NSData *)hex:(NSString *)data 473 | { 474 | if (data.length == 0) { return nil; } 475 | 476 | static const unsigned char HexDecodeChars[] = 477 | { 478 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 479 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 480 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 481 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 482 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, //49 483 | 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, //59 484 | 0, 0, 0, 0, 0, 10, 11, 12, 13, 14, 485 | 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, //79 486 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 487 | 0, 0, 0, 0, 0, 0, 0, 10, 11, 12, //99 488 | 13, 14, 15 489 | }; 490 | 491 | // convert data(NSString) to CString 492 | const char *source = [data cStringUsingEncoding:NSUTF8StringEncoding]; 493 | // malloc buffer 494 | unsigned char *buffer; 495 | NSUInteger length = strlen(source) / 2; 496 | buffer = malloc(length); 497 | for (NSUInteger index = 0; index < length; index++) { 498 | buffer[index] = (HexDecodeChars[source[index * 2]] << 4) + (HexDecodeChars[source[index * 2 + 1]]); 499 | } 500 | // init result NSData 501 | NSData *result = [NSData dataWithBytes:buffer length:length]; 502 | free(buffer); 503 | source = nil; 504 | 505 | return result; 506 | } 507 | 508 | @end --------------------------------------------------------------------------------