瀏覽代碼

If iv is not set for cipher block that supports it, randomly generate one. Update README.

Marcin Krzyżanowski 10 年之前
父節點
當前提交
bb7b527630
共有 2 個文件被更改,包括 34 次插入20 次删除
  1. 16 9
      CryptoSwift/AES.swift
  2. 18 11
      README.md

+ 16 - 9
CryptoSwift/AES.swift

@@ -95,17 +95,20 @@ public class AES {
     
     public init?(key:NSData, iv:NSData? = nil, blockMode:CipherBlockMode = .CBC) {
         self.key = key
-        self.iv = iv
         self.blockMode = blockMode
         
-//        if (blockMode.supportIV() && iv == nil) {
-//            // auto generate IV
-//            var generatedIV:[Byte] = [Byte]();
-//            for (var i = 0; i < key.length; i++) {
-//                generatedIV.append(UInt8(truncatingBitPattern: arc4random_uniform(256)));
-//            }
-//        }
-        
+        var finalIV = iv
+        if (blockMode.supportIV() && iv == nil) {
+            // auto generate IV
+            var generatedIV:[Byte] = [Byte]();
+            for (var i = 0; i < key.length; i++) {
+                generatedIV.append(UInt8(truncatingBitPattern: arc4random_uniform(256)));
+            }
+            finalIV = NSData.withBytes(generatedIV)
+        }
+
+        self.iv = finalIV
+
         switch (key.length * 8) {
         case 128:
             self.variant = .aes128
@@ -125,6 +128,10 @@ public class AES {
     public class func blockSizeBytes() -> Int {
         return 128 / 8 // 16 bytes
     }
+    
+    public class func blockSizeBytes() -> UInt8 {
+        return UInt8(truncatingBitPattern: self.blockSizeBytes())
+    }
 
     // if "iv" is given then CBC mode is used by default
     public func encrypt(message:NSData) -> NSData? {

+ 18 - 11
README.md

@@ -82,29 +82,36 @@ Hashing a String and printing result
         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())
+    
 Working with Ciphers
 
 	// convenience setup tuple
 	let setup = (key: keyData, iv: ivData)
-	
-	// ENCRYPT
-	let aesEncrypted = Cipher.AES(setup).encrypte(dataToEncrypt)
+
+ChaCha20
+
 	let chacha20Encrypted = Cipher.ChaCha20(setup).encrypt(dataToEncrypt)
+	let decryptedChaCha20 = Cipher.ChaCha20(setup).decrypt(encryptedData)
+
+AES
+	
+	// padding
+	let paddedData = PKCS7(data: dataToEncrypt).addPadding(AES.blockSizeBytes())
 	
 	// AES setup with CBC block mode and PKCS#7 data padding
-	let aes = AES(key: keyData, iv: ivData, blockMode: .CBC)
-	let paddedData = PKCS7(data: dataToEncrypt).addPadding(UInt8(AES.blockSizeBytes()))
+	let aesEncrypted = Cipher.AES(setup).encrypt(dataToEncrypt)
+	let aes = AES(key: keyData, iv: ivData, blockMode: .CBC) // CBC is default
+	
 	let aesEncrypted = aes.encrypt(paddedData)
 	
-	// DECRYPT
-	let decryptedChaCha20 = Cipher.ChaCha20(setup).decrypt(encryptedData)
 	let decryptedAES = Cipher.AES(setup).decrypt(encryptedData)
-
-	// remove padding IF applied on encryption
-	let decryptedRaw = PKCS7(data: decryptedAES).removePadding()
+	let decryptedRaw = PKCS7(data: decryptedAES).removePadding() // remove padding IF applied on encryption
 	
 
-using extensions
+Using extensions
 	
 	// convenience setup tuple
 	let setup = (key: keyData, iv: ivData)