فهرست منبع

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)