2016-11-14 6 views
0

CryptoSwiftでAES暗号化を使用して実装しようとしています。誰かがcryptoswiftの方が一般的な暗号よりも500〜1000倍遅いことをお勧めします。私のプロジェクトにcommonCryptoを統合するための助けてください。ステップバイステップで説明しますか?swift 2.3とXcode8.1の共通暗号

あなたがRNCryptorを使用し、容易ではなく統合し、完全な安全なソリューションを探しているなら、私はXCode8.1とアドバンス

+0

'[迅速] commoncrypto'用SO上> 100件のヒットがあります。あなたが試したこととあなたがどこにいるのかを示してください。それが立てば、あなたの質問ははるかに広いです。 –

+0

私は統合しようとしましたが、何らかのエラーが表示されています。私はそれを作ることができません – iPhone25

+0

CryptoSwiftの使用を避けるのが最善です。これは、Common Cryptoベースの実装よりも500〜1000倍遅いということです。アップルのCommon CryptoはFIPS認証を取得しており、CryptoSwiftを使用して正当性とセキュリティを確保しています。 – zaph

答えて

1

におけるSWIFT 2.3

おかげで使用しています。

あなたが部分的解決策を探しているなら、それは、この例の実装時にパスワードの導出や認証一見なしでちょうどAES暗号化である:

例sunsettedドキュメントのセクションから:

AES暗号CBCモードのとランダムIV(スウィフト3+)

IVは

aesCBC128EncryptはRANDOを作成し、暗号化データの先頭にm IVで始まり、暗号化されたコードの前に置かれます。 aesCBC128Decryptは、復号化中に接頭辞付きIVを使用します。

入力はデータであり、キーはデータオブジェクトです。必要に応じてBase64などのエンコードされたフォームが、呼び出し元のメソッドに変換および/または変換する場合。

キーは正確に128ビット(16バイト)である必要があります。その他のキーサイズについては、Swift 3.0の例を参照してください。

PKCS#7のパディングは、デフォルトで設定されています。

この例では、プロジェクトへの橋渡しヘッダーを持つことが必要である、共通のCrypto が必要です。

輸入

は、プロジェクトにSecurity.frameworkを追加します。

メモのSwift 3の例を参照してください。

これは実動コードではなく、例です。

func aesCBC128Encrypt(data data:[UInt8], keyData:[UInt8]) -> [UInt8]? { 
    let keyLength = size_t(kCCKeySizeAES128) 
    let ivLength = size_t(kCCBlockSizeAES128) 
    let cryptDataLength = size_t(data.count + kCCBlockSizeAES128) 
    var cryptData = [UInt8](count:ivLength + cryptDataLength, repeatedValue:0) 

    let status = SecRandomCopyBytes(kSecRandomDefault, Int(ivLength), UnsafeMutablePointer<UInt8>(cryptData)); 
    if (status != 0) { 
     print("IV Error, errno: \(status)") 
     return nil 
    } 

    var numBytesEncrypted :size_t = 0 
    let cryptStatus = CCCrypt(CCOperation(kCCEncrypt), 
           CCAlgorithm(kCCAlgorithmAES128), 
           CCOptions(kCCOptionPKCS7Padding), 
           keyData, keyLength, 
           cryptData, 
           data, data.count, 
           &cryptData + ivLength, cryptDataLength, 
           &numBytesEncrypted) 

    if UInt32(cryptStatus) == UInt32(kCCSuccess) { 
     cryptData.removeRange(numBytesEncrypted+ivLength..<cryptData.count) 
    } 
    else { 
     print("Error: \(cryptStatus)") 
     return nil; 
    } 

    return cryptData; 
} 

func aesCBC128Decrypt(data data:[UInt8], keyData:[UInt8]) -> [UInt8]? { 
    let clearLength = size_t(data.count) 
    var clearData = [UInt8](count:clearLength, repeatedValue:0) 

    let keyLength = size_t(kCCKeySizeAES128) 
    let ivLength = size_t(kCCBlockSizeAES128) 

    var numBytesDecrypted :size_t = 0 
    let cryptStatus = CCCrypt(CCOperation(kCCDecrypt), 
           CCAlgorithm(kCCAlgorithmAES128), 
           CCOptions(kCCOptionPKCS7Padding), 
           keyData, keyLength, 
           data, 
           UnsafePointer<UInt8>(data) + ivLength, data.count - ivLength, 
           &clearData, clearLength, 
           &numBytesDecrypted) 

    if UInt32(cryptStatus) == UInt32(kCCSuccess) { 
     clearData.removeRange(numBytesDecrypted..<clearLength) 

    } else { 
     print("Error: \(cryptStatus)") 
     return nil; 
    } 

    return clearData; 
} 

使用例:

let clearData = toData("clearData") 
let keyData = toData("keyData89") 

print("clearData: \(toHex(clearData))") 
print("keyData:  \(toHex(keyData))") 
let cryptData = aesCBC128Encrypt(data:clearData, keyData:keyData)! 
print("cryptData: \(toHex(cryptData))") 
let decryptData = aesCBC128Decrypt(data:cryptData, keyData:keyData)! 
print("decryptData: \(toHex(decryptData))") 

出力例:

clearData: <636c6561 72446174 61303132 33343536> 
keyData:  <6b657944 61746138 39303132 33343536> 
cryptData: <9fce4323 830e3734 93dd93bf e464f72a a653a3a5 2c40d5ea e90c1017 958750a7 ff094c53 6a81b458 b1fbd6d4 1f583298> 
decryptData: <636c6561 72446174 61303132 33343536> 
関連する問題