2017-10-28 13 views
2

私はしかし私の結果の暗号文が長すぎる、CryptoSwiftライブラリとスウィフトでAES-128-CTRを使用します。スウィフト - AES 128 CTR、暗号文が長すぎる

マイIVが16バイト、塩32バイトであり、AES平文も32バイトであり、なぜ別の16バイトのパディング従って、得られた暗号文の48バイトでありますか?

let salt: [UInt8] = Array("tkmlidnonknkqgvapjrpdcductebsozn".utf8) 
let derivedKey = try PKCS5.PBKDF2(password: password, salt: salt, iterations: numberOfIterations, variant: .sha256).calculate() 
let iv: [UInt8] = Array("abcdefgthksdfghj".utf8) 
let aesKey: [UInt8] = Array(derivedKey[..<16]) 
let aes = try AES(key: aesKey, blockMode: .CTR(iv: iv)) 
let ciphertext = try aes.encrypt(password) 

ここで、パスワードは32バイトの平文です。

さらに、ランダムな塩を生成する方法はありますか?私はそれを発見しました

let iv: [UInt8] = AES.randomIV(AES.blockSize) 

ランダムなIVを生成しますが、どのようにそのような塩を得るのですか?

+2

CryptoSwiftの使用を避けるためには、Common Cryptoベースの実装よりも500〜1000倍も遅い他のものを検討してください。アップルのCommon CryptoはFIPS認証を取得しており、CryptoSwiftを使用して正当性とセキュリティを確保しています。 – zaph

答えて

2

CryptoSwift documentationによると、それはデフォルトでPKCS7パディングを使用しています。 CTRモードでは埋め込みが必要ないため、padding: .noPaddingAES()コンストラクタ呼び出しに追加することで無効にすることができます。

PBKDF2ソルトには特別なフォーマット要件はありません(文字通り任意のランダムな文字列にすることができます)。AES.randomIV()(またはその他のランダムバイトのソース)を使用して生成する必要があります。

Internally、CryptoSwift AES.randomIV()コードがRandomBytesSequenceを使用しているようだが、残念ながらCryptoSwitfの一部が文書化されていないように見える。私は見つけることができる唯一の使用例、randomIV()ソースコード自体のほか、this test caseですが。どの、ところで、実際には悪い単体テストのように見える—それはテストされているようだが、AnyIterator<UInt8>が実際にはUInt8の値を返すということだ。イテレータが実際に要求されたバイト数を返すかどうかチェックしていない。何らかの理由で失敗しました)

+2

また、上記のzaphのコメントに同意します:正式に認定された暗号ライブラリを使用するオプションがある場合、おそらくそうでしょう。コードが安全であることを保証するものではありませんが、セキュリティホールがあなた自身の責任であることを保証します。 ;) –

+0

あなたの答えを教えてくれてありがとう、問題を解決しました。私は認可されたライブラリに切り替えることをお勧めします。 – phoebus

+1

CTRモードでは ''に設定するよりはるかに少ない種類のパディングを設定する必要があることが奇妙です。 noPadding'は、CTRモードのデフォルトにする必要があります。 AppleがCommon Cryptoを更新していないか、またはCryptoとSwiftグループの間の争点はもちろんのこと、欠落しているSHA-3、Argon2、AES GCMモードを置き換えると、奇妙なことが分かります。 – zaph

関連する問題