{"id":149620,"date":"2020-08-30T15:58:07","date_gmt":"2020-08-30T07:58:07","guid":{"rendered":"http:\/\/4563.org\/?p=149620"},"modified":"2020-08-30T15:58:07","modified_gmt":"2020-08-30T07:58:07","slug":"%e4%b8%80%e6%ae%b5-object-c-%e4%bb%a3%e7%a0%81%e6%83%b3%e8%bd%ac-swift-%ef%bc%8c%e6%9c%89%e4%bb%80%e4%b9%88%e6%96%b9%e6%b3%95%e5%90%97%ef%bc%9f","status":"publish","type":"post","link":"http:\/\/4563.org\/?p=149620","title":{"rendered":"\u4e00\u6bb5 object c \u4ee3\u7801\u60f3\u8f6c Swift \uff0c\u6709\u4ec0\u4e48\u65b9\u6cd5\u5417\uff1f"},"content":{"rendered":"<div>\n<div>\n<div>\n<h1>                  \u4e00\u6bb5 object c \u4ee3\u7801\u60f3\u8f6c Swift \uff0c\u6709\u4ec0\u4e48\u65b9\u6cd5\u5417\uff1f               <\/h1>\n<p> <\/p>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : chillwind <\/span>  <span><i><\/i> 12<\/span> <\/div>\n<div> <\/div>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div isfirst=\"1\"> <\/p>\n<pre><code>- (NSData *)AES256EncryptWithKey:(NSString *)key {     NSUInteger dataLength = [self length];     size_t bufferSize = dataLength + kCCBlockSizeAES128;     void *buffer = malloc(bufferSize);     NSMutableData *data = [[NSData randomDataWithLength:AES_256_IV_SIZE] mutableCopy];  \/\/IV          size_t numBytesEncrypted = 0;     CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,                                           kCCAlgorithmAES128,                                           kCCOptionPKCS7Padding,                                           [key cStringUsingEncoding:NSUTF8StringEncoding],                                           [key length],                                           [data bytes],                                           [self bytes],                                           dataLength,                                           buffer,                                           bufferSize,                                           &amp;numBytesEncrypted);               if (cryptStatus == kCCSuccess) {         NSData *message = [NSData dataWithBytes:buffer                                          length:numBytesEncrypted]; \/\/Message         \/* Do HMac *\/         NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];         NSData *hmac = [message doHmacWithKeyData:keyData];          \/* IV+Message+HMac *\/         [data appendData:message];         [data appendData:hmac];          free(buffer);         return data;     }     free(buffer);     return nil; }  - (NSData *)doHmacWithKeyData:(NSData *)salt {     NSMutableData *macOut = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH];     CCHmac(kCCHmacAlgSHA256,            salt.bytes,            salt.length,            self.bytes,            self.length,            macOut.mutableBytes);          return macOut; } <\/code><\/pre>\n<\/p><\/div>\n<div> <b>\u5927\u4f6c\u6709\u8a71\u8aaa<\/b> (<span>5<\/span>)        <\/div>\n<div> <\/div>\n<\/p><\/div>\n<\/p><\/div>\n<ul>\n<li data-pid=\"3143702\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : finab <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>          <\/span> <\/div>\n<\/p><\/div>\n<div>                                                             https:\/\/swiftify.com\/converter\/code\/<br \/>\u8fd9\u4e2a\u53ef\u4ee5\u5c06 Objc \u4ee3\u7801\u8f6c\u6210 Swift\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u9519\u8bef\uff0c\u9700\u8981\u4fee\u6539\u3002                                                            <\/div>\n<\/p><\/div>\n<\/li>\n<li data-pid=\"3143703\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : CommandZi <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>          <\/span> <\/div>\n<\/p><\/div>\n<div>                                                             https:\/\/github.com\/onmyway133\/Arcane\/blob\/master\/Sources\/Arcane\/AES.swift                                                            <\/div>\n<\/p><\/div>\n<\/li>\n<li data-pid=\"3143704\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : chiaf <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>          <\/span> <\/div>\n<\/p><\/div>\n<div>                                                             @finab \u8fd9\u4e2a\u4e0d\u9519\uff0c\u9700\u8981\u6ce8\u610f\u7684\u5730\u65b9\uff0c\u975e\u767b\u5f55\u60c5\u51b5\u4e0b\uff0c\u652f\u6301 1K \u4ee5\u4e0b\u7684\u4ee3\u7801                                                            <\/div>\n<\/p><\/div>\n<\/li>\n<li data-pid=\"3143705\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u4e3b<\/span> <span>\u8cc7\u6df1\u5927\u4f6c : chillwind <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>          <\/span> <\/div>\n<\/p><\/div>\n<div>                                                             \u770b\u4e86\u534a\u5929 swift\uff0c\u81ea\u5df1\u4eba\u8089\u8f6c\u4e86\u4e00\u4e2a\u3002\u7528\u7684\u4e0d\u5bf9\u7684\u5730\u65b9\uff0c\u8fd8\u8bf7\u5404\u4f4d\u6307\u6b63<br \/>&#8220;`<br \/>import Foundation<br \/>import CommonCrypto<\/p>\n<p>struct AES {<\/p>\n<p> \/\/ MARK: &#8211; Value<br \/> \/\/ MARK: Private<br \/> private let key: Data<br \/> \/\/ MARK: &#8211; Initialzier<br \/> init?(key: String) {<br \/> guard key.count == kCCKeySizeAES128 || key.count == kCCKeySizeAES256, let keyData = key.data(using: .utf8) else {<br \/> debugPrint(&#8220;Error: Failed to set a key.&#8221;)<br \/> return nil<br \/> }<\/p>\n<p> self.key = keyData<\/p>\n<p> }<\/p>\n<p> \/\/ MARK: &#8211; Function<br \/> \/\/ MARK: Public<br \/> func encrypt(string: String) -&gt; Data? {<\/p>\n<p> let iv = randomGenerateBytes(count: 16)!<\/p>\n<p> let cryptData = crypt(data: string.data(using: .utf8), iv: iv, option: CCOperation(kCCEncrypt))!<\/p>\n<p> var hmac = Data(count: 32)<br \/> cryptData.withUnsafeBytes { v in<br \/> hmac.withUnsafeMutableBytes { res in<br \/> key.withUnsafeBytes { k in<br \/> CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA256), k.baseAddress!, key.count, v.baseAddress!, cryptData.count, res.baseAddress!)<br \/> }<br \/> }<br \/> }<\/p>\n<p> let messageData = NSMutableData()<br \/> messageData.append(iv)<br \/> messageData.append(cryptData)<br \/> messageData.append(hmac)<\/p>\n<p> return messageData as Data<br \/> }<\/p>\n<p> func decrypt(data: Data) -&gt; String? {<br \/> \/\/\u9a8c\u8bc1\u6570\u636e<br \/> let ivByteData = data.subdata(in: 0..&lt;16)<\/p>\n<p> let contentByteData = data.subdata(in: 16..&lt;(data.count &#8211; 32))<\/p>\n<p> let serverHmacData = data.subdata(in: (data.count &#8211; 32)..&lt;data.count)<br \/> print(data.count)<\/p>\n<p> var hmac = Data(count: 32)<br \/> contentByteData.withUnsafeBytes { v in<br \/> hmac.withUnsafeMutableBytes { res in<br \/> key.withUnsafeBytes { k in<br \/> CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA256), k.baseAddress!, key.count, v.baseAddress!, contentByteData.count, res.baseAddress!)<br \/> }<br \/> }<br \/> }<\/p>\n<p> if (serverHmacData == hmac) {<br \/> let decryptedData = crypt(data: contentByteData, iv: ivByteData, option: CCOperation(kCCDecrypt))<br \/> return String(bytes: decryptedData!, encoding: .utf8)<br \/> } else {<br \/> print(&#8220;HMac \u4e0d\u4e00\u81f4&#8221;)<br \/> return nil;<br \/> }<\/p>\n<p> }<\/p>\n<p> func crypt(data: Data?, iv: Data, option: CCOperation) -&gt; Data? {<br \/> guard let data = data else { return nil }<\/p>\n<p> let cryptLength = data.count + kCCBlockSizeAES128*2<br \/> var cryptData = Data(count: cryptLength)<\/p>\n<p> let keyLength = key.count<br \/> let options = CCOptions(kCCOptionPKCS7Padding)<\/p>\n<p> var bytesLength = Int(0)<\/p>\n<p> let status = cryptData.withUnsafeMutableBytes { cryptBytes in<br \/> data.withUnsafeBytes { dataBytes in<br \/> iv.withUnsafeBytes { ivBytes in<br \/> key.withUnsafeBytes { keyBytes in<br \/> CCCrypt(option, CCAlgorithm(kCCAlgorithmAES128), options, keyBytes.baseAddress, keyLength, ivBytes.baseAddress, dataBytes.baseAddress, data.count, cryptBytes.baseAddress, cryptLength, &amp;bytesLength)<br \/> }<br \/> }<br \/> }<br \/> }<\/p>\n<p> guard UInt32(status) == UInt32(kCCSuccess) else {<br \/> debugPrint(&#8220;Error: Failed to crypt data. Status (status)&#8221;)<br \/> return nil<br \/> }<\/p>\n<p> cryptData.removeSubrange(bytesLength..&lt;cryptData.count)<\/p>\n<p> return cryptData<br \/> }<\/p>\n<p> func randomGenerateBytes(count: Int) -&gt; Data? {<br \/> let bytes = UnsafeMutableRawPointer.allocate(byteCount: count, alignment: 1)<br \/> defer { bytes.deallocate() }<br \/> let status = CCRandomGenerateBytes(bytes, count)<br \/> guard status == kCCSuccess else { return nil }<br \/> return Data(bytes: bytes, count: count)<br \/> }<br \/>}<\/p>\n<p>&#8220;`                                                            <\/p><\/div>\n<\/p><\/div>\n<\/li>\n<li data-pid=\"3143706\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : zyc199847 <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>          <\/span> <\/div>\n<\/p><\/div>\n<div>                                                             swift \u7684\u8bdd\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u539f\u751f\u7684 CryptoSwift \u3002https:\/\/github.com\/krzyzanowskim\/CryptoSwift                                                            <\/div>\n<\/p><\/div>\n<\/li>\n<li>\n","protected":false},"excerpt":{"rendered":"<p>\u4e00\u6bb5 object c \u4ee3\u7801\u60f3\u8f6c &hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[],"tags":[],"_links":{"self":[{"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/posts\/149620"}],"collection":[{"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=149620"}],"version-history":[{"count":0,"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/posts\/149620\/revisions"}],"wp:attachment":[{"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=149620"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=149620"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=149620"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}