|
|
@@ -58,90 +58,111 @@ By default project is setup for iOS. You need to switch to OSX SDK manually [see
|
|
|
|
|
|
You can use [CocoaPods](http://cocoapods.org/?q=cryptoSwift). You need version 0.36 or newer to use Swift framework.
|
|
|
|
|
|
- pod 'CryptoSwift'
|
|
|
+```ruby
|
|
|
+pod 'CryptoSwift'
|
|
|
+```
|
|
|
|
|
|
##Usage
|
|
|
|
|
|
- import CryptoSwift
|
|
|
+```swift
|
|
|
+import CryptoSwift
|
|
|
+```
|
|
|
|
|
|
Generally you should use `CryptoSwift.Hash`,`CryptoSwift.Cipher` enums or convenience extensions
|
|
|
|
|
|
Hash enum usage
|
|
|
-
|
|
|
- /* Hash enum usage */
|
|
|
- var data:NSData = NSData(bytes: [49, 50, 51] as [Byte], length: 3)
|
|
|
- if let data = CryptoSwift.Hash.md5(data).calculate() {
|
|
|
- println(data.hexString)
|
|
|
- }
|
|
|
+```swift
|
|
|
+/* Hash enum usage */
|
|
|
+var data:NSData = NSData(bytes: [49, 50, 51] as [Byte], length: 3)
|
|
|
+if let data = CryptoSwift.Hash.md5(data).calculate() {
|
|
|
+ println(data.hexString)
|
|
|
+}
|
|
|
+```
|
|
|
|
|
|
Hashing a data
|
|
|
+
|
|
|
+```swift
|
|
|
+let hash = data.md5()
|
|
|
+let hash = data.sha1()
|
|
|
+let hash = data.sha224()
|
|
|
+let hash = data.sha256()
|
|
|
+let hash = data.sha384()
|
|
|
+let hash = data.sha512()
|
|
|
|
|
|
- let hash = data.md5()
|
|
|
- let hash = data.sha1()
|
|
|
- let hash = data.sha224()
|
|
|
- let hash = data.sha256()
|
|
|
- let hash = data.sha384()
|
|
|
- let hash = data.sha512()
|
|
|
-
|
|
|
- let crc = data.crc32()
|
|
|
-
|
|
|
- println(hash.hexString)
|
|
|
+let crc = data.crc32()
|
|
|
+
|
|
|
+println(hash.hexString)
|
|
|
+```
|
|
|
|
|
|
Hashing a String and printing result
|
|
|
|
|
|
- if let hash = "123".md5() {
|
|
|
- println(hash)
|
|
|
- }
|
|
|
+```swift
|
|
|
+if let hash = "123".md5() {
|
|
|
+ println(hash)
|
|
|
+}
|
|
|
+```
|
|
|
|
|
|
Some content-encryption algorithms assume the input length is a multiple of k octets, where k is greater than one. For such algorithms, the input shall be padded
|
|
|
|
|
|
- let paddedData = PKCS7(data: dataToEncrypt).addPadding(AES.blockSizeBytes())
|
|
|
-
|
|
|
+```swift
|
|
|
+let paddedData = PKCS7(data: dataToEncrypt).addPadding(AES.blockSizeBytes())
|
|
|
+```
|
|
|
+
|
|
|
Working with Ciphers
|
|
|
|
|
|
ChaCha20
|
|
|
|
|
|
- let chacha20Encrypted = Cipher.ChaCha20(key: keyData, iv: ivData).encrypt(dataToEncrypt)
|
|
|
- let decryptedChaCha20 = Cipher.ChaCha20(key: keyData, iv: ivData).decrypt(encryptedData)
|
|
|
+```swift
|
|
|
+let chacha20Encrypted = Cipher.ChaCha20(key: keyData, iv: ivData).encrypt(dataToEncrypt)
|
|
|
+let decryptedChaCha20 = Cipher.ChaCha20(key: keyData, iv: ivData).decrypt(encryptedData)
|
|
|
+```
|
|
|
|
|
|
AES
|
|
|
|
|
|
Notice regarding padding: *Manual padding of data is optional and CryptoSwift by default always will add PKCS7 padding before encryption, and remove after decryption when __Cipher__ enum is used. If you need manually disable/enable padding, you can do this by setting parameter for encrypt()/decrypt() on class __AES__.*
|
|
|
|
|
|
- // 1. Add padding (Optional)
|
|
|
- let plaintextData = PKCS7(data: plaintextData).addPadding(AES.blockSizeBytes())
|
|
|
-
|
|
|
- // 2. Encrypt with key and random IV
|
|
|
- let keyData = NSData.withBytes([0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00])
|
|
|
- let ivData:NSData = Cipher.randomIV(keyData)
|
|
|
+```swift
|
|
|
+// 1. Add padding (Optional)
|
|
|
+let plaintextData = PKCS7(data: plaintextData).addPadding(AES.blockSizeBytes())
|
|
|
+
|
|
|
+// 2. Encrypt with key and random IV
|
|
|
+let keyData = NSData.withBytes([0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00])
|
|
|
+let ivData:NSData = Cipher.randomIV(keyData)
|
|
|
+
|
|
|
+let encryptedData = Cipher.AES(key: keyData, iv: ivData, blockMode: .CBC).encrypt(plaintextData)
|
|
|
|
|
|
- let encryptedData = Cipher.AES(key: keyData, iv: ivData, blockMode: .CBC).encrypt(plaintextData)
|
|
|
-
|
|
|
- // 3. decrypt with key and IV
|
|
|
- let decryptedData = Cipher.AES(key: keyData, iv: ivData, blockMode: .CBC).decrypt(encryptedData)
|
|
|
+// 3. decrypt with key and IV
|
|
|
+let decryptedData = Cipher.AES(key: keyData, iv: ivData, blockMode: .CBC).decrypt(encryptedData)
|
|
|
|
|
|
- // 4. remove padding ONLY IF applied earlier (Optional)
|
|
|
- let plaintextData = PKCS7(data: decryptedData).removePadding()
|
|
|
+// 4. remove padding ONLY IF applied earlier (Optional)
|
|
|
+let plaintextData = PKCS7(data: decryptedData).removePadding()
|
|
|
+```
|
|
|
|
|
|
AES without data padding
|
|
|
|
|
|
- let aes = AES(key: keyData, iv: ivData, blockMode: .CBC) // CBC is default
|
|
|
- let encryptedData = aes?.encrypt(plaintextData, addPadding: false)
|
|
|
- let decryptedData = aes?.decrypt(encryptedData, removePadding: false)
|
|
|
+```swift
|
|
|
+let aes = AES(key: keyData, iv: ivData, blockMode: .CBC) // CBC is default
|
|
|
+let encryptedData = aes?.encrypt(plaintextData, addPadding: false)
|
|
|
+let decryptedData = aes?.decrypt(encryptedData, removePadding: false)
|
|
|
+```
|
|
|
|
|
|
Using extensions
|
|
|
|
|
|
- // convenience setup tuple
|
|
|
- let setup = (key: keyData, iv: ivData)
|
|
|
+```swift
|
|
|
+// convenience setup tuple
|
|
|
+let setup = (key: keyData, iv: ivData)
|
|
|
|
|
|
- let encrypted = dataToEncrypt.encrypt(Cipher.ChaCha20(setup))
|
|
|
- let decrypted = encrypted.decrypt(Cipher.ChaCha20(setup))
|
|
|
+let encrypted = dataToEncrypt.encrypt(Cipher.ChaCha20(setup))
|
|
|
+let decrypted = encrypted.decrypt(Cipher.ChaCha20(setup))
|
|
|
+```
|
|
|
|
|
|
Message authenticators
|
|
|
|
|
|
- // Calculate Message Authentication Code (MAC) for message
|
|
|
- let mac = Authenticator.Poly1305(key: key).authenticate(message)
|
|
|
-
|
|
|
+```swift
|
|
|
+// Calculate Message Authentication Code (MAC) for message
|
|
|
+let mac = Authenticator.Poly1305(key: key).authenticate(message)
|
|
|
+```
|
|
|
+
|
|
|
##Contact
|
|
|
Marcin Krzyżanowski [@krzyzanowskim](http://twitter.com/krzyzanowskim)
|
|
|
|