Поскольку SHA-3 кажется уже известной функцией (Кекчак как финалист NIST hash соревнование функций) У меня есть несколько вопросов, связанных с этой темой:
- На сайте NIST сообщается, что NIST закрыт из-за прекращения государственного финансирования. Есть ли шанс, что SHA-3 когда-нибудь будет окончательно принят?
- Библиотека BouncyCastle имеет реализацию SHA-3, результаты дайджеста аналогичны примерам, опубликованным в статья в Википедии (это я тестировал). Поскольку окончательный стандарт не утвержден, можно ли этому доверять? Википедия говорит, что это, вероятно, будет изменено, но как это может измениться, поскольку окончательный алгоритм, похоже, не подлежит изменению (иначе это будет другой алгоритм).
- Здесь кто-то заметил, что использование PBKDF2 с SHA -3 для усиления ключа и хеширования паролей следует избегать. Но я не могу понять, почему? (как это может дать злоумышленнику преимущество, если алгоритм небыстрый?)
- Я нигде не смог найти тестовые векторы для проверки моей реализации PBKDF2-HMAC-SHA3 в scala на основе Java API BouncyCastle. Я могу опубликовать свою тестовую спецификацию с некоторыми результатами. Но сначала кто-нибудь может опубликовать какие-либо тестовые векторы / спецификации?
Вот моя реализация в scala:
package my.crypto
import org.bouncycastle.crypto.digests.SHA3Digest
import org.bouncycastle.crypto.generators.PKCS5S2ParametersGenerator
import org.bouncycastle.crypto.PBEParametersGenerator
import org.bouncycastle.crypto.params.KeyParameter
object PBKDF2WithHmacSHA3 {
def apply(password: String, salt: Array[Byte], iterations: Int = 65536, keyLen: Int = 256): Array[Byte] = {
val generator = new PKCS5S2ParametersGenerator(new SHA3Digest(256))
generator.init(
PBEParametersGenerator.PKCS5PasswordToUTF8Bytes(password.toCharArray),
salt,
iterations
)
val key = generator.generateDerivedMacParameters(keyLen).asInstanceOf[KeyParameter]
key.getKey
}
}
Одна сомнительная вещь для меня - это new SHA3Digest(256)
, 256-битная длина в конструкторе, должна ли она быть такой же, как предоставленная длина ключа, или какая-то фиксированная, как у меня? Я решил использовать фиксированную длину, потому что можно использовать только некоторые фиксированные значения, и пользователь объектного API может указать любое значение в качестве параметра длины ключа, но большинство необычных значений приведет к возникновению исключения из конструктора SHA3Digest
. Также значение по умолчанию равно 288 (когда длина ключа не указана), что выглядит странно.
Заранее спасибо!