Parcourir la source

String.decryptBase64ToString, String.decryptBase64, [UInt8].toBase64()

and tests.
Marcin Krzyżanowski il y a 9 ans
Parent
commit
122a78774e

+ 9 - 2
CryptoSwiftTests/ExtensionsTest.swift

@@ -91,7 +91,14 @@ final class ExtensionsTest: XCTestCase {
     }
 
     func test_String_encrypt_base64() {
-        let encrypted: String = try! "my secret string".encrypt(AES(key: "secret0key000000", iv: "0123456789012345"))
-        XCTAssertEqual(encrypted, "aPf/i9th9iX+vf49eR7PYk2q7S5xmm3jkRLejgzHNJs=")
+        let encryptedBase64 = try! "my secret string".encrypt(AES(key: "secret0key000000", iv: "0123456789012345")).toBase64()
+        XCTAssertEqual(encryptedBase64, "aPf/i9th9iX+vf49eR7PYk2q7S5xmm3jkRLejgzHNJs=")
     }
+
+    func test_String_decrypt_base64() {
+        let encryptedBase64 = "aPf/i9th9iX+vf49eR7PYk2q7S5xmm3jkRLejgzHNJs="
+        let decrypted = try! encryptedBase64.decryptBase64ToString(AES(key: "secret0key000000", iv: "0123456789012345"))
+        XCTAssertEqual(decrypted, "my secret string")
+    }
+
 }

+ 5 - 2
README.md

@@ -207,11 +207,14 @@ let input: [UInt8] = [0,1,2,3,4,5,6,7,8,9]
 input.encrypt(AES(key: "secret0key000000", iv:"0123456789012345", blockMode: .CBC))
 ```
 
-Encrypt String to Base64 string result:
+Encrypt/Decrypt String to Base64 encoded string:
 
 ```swift
 // Encrypt string and get Base64 representation of result
-let base64: String = try! "my secret string".encrypt(AES(key: "secret0key000000", iv: "0123456789012345"))
+let base64String = try! "my secret string".encrypt(AES(key: "secret0key000000", iv: "0123456789012345")).toBase64()
+
+// Decrypt Base64 encrypted message with helper function:
+let decrypted = try! encryptedBase64.decryptBase64ToString(AES(key: "secret0key000000", iv: "0123456789012345"))
 ```
 
 ...under the hood, this is [UInt8] converted to NSData converted to Base64 string representation:

+ 21 - 2
Sources/CryptoSwift/CSArrayType+Extensions.swift

@@ -17,11 +17,30 @@ extension Array: CSArrayType {
 }
 
 public extension CSArrayType where Generator.Element == UInt8 {
-    
     public func toHexString() -> String {
         return self.lazy.reduce("") { $0 + String(format:"%02x", $1) }
     }
-    
+
+    public func toBase64() -> String? {
+        guard let bytesArray = self as? [UInt8] else {
+            return nil
+        }
+
+        return NSData(bytes: bytesArray).base64EncodedStringWithOptions([])
+    }
+
+    public init(base64: String) {
+        self.init()
+
+        guard let decodedData = NSData(base64EncodedString: base64, options: []) else {
+            return
+        }
+
+        self.appendContentsOf(decodedData.arrayOfBytes())
+    }
+}
+
+public extension CSArrayType where Generator.Element == UInt8 {
     public func md5() -> [Generator.Element] {
         return Hash.md5(cs_arrayValue()).calculate()
     }

+ 20 - 7
Sources/CryptoSwift/Foundation/String+FoundationExtension.swift

@@ -10,14 +10,27 @@ import Foundation
 
 extension String {
 
-    /// Return Base64 representation
-    public func encrypt(cipher: Cipher) throws -> String {
-        let encrypted = try self.utf8.lazy.map({ $0 as UInt8 }).encrypt(cipher)
-        return NSData(bytes: encrypted).base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength)
+    /// Return Base64 back to String
+    public func decryptBase64ToString(cipher: Cipher) throws -> String {
+        guard let decodedData = NSData(base64EncodedString: self, options: []) else {
+            throw CipherError.Decrypt
+        }
+
+        let decrypted = try decodedData.decrypt(cipher)
+
+        if let decryptedString = String(data: decrypted, encoding: NSUTF8StringEncoding) {
+            return decryptedString
+        }
+
+        throw CipherError.Decrypt
     }
 
-    public func decrypt(cipher: Cipher) throws -> String {
-        let decrypted = try self.utf8.lazy.map({ $0 as UInt8 }).decrypt(cipher)
-        return NSData(bytes: decrypted).base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength)
+    public func decryptBase64(cipher: Cipher) throws -> [UInt8] {
+        guard let decodedData = NSData(base64EncodedString: self, options: []) else {
+            throw CipherError.Decrypt
+        }
+
+        return try decodedData.decrypt(cipher).arrayOfBytes()
     }
+
 }