Получение секрета из мастер-ключа с использованием JCE / JCA - PullRequest
5 голосов
/ 22 декабря 2010

Может ли кто-нибудь направить меня в правильном направлении?

Я бы хотел использовать JCE / JCA для получения нового ключа из главного секретного ключа. Как мне этого добиться?

Привет.

1 Ответ

5 голосов
/ 26 декабря 2010

JCA предоставляет стандартные функции получения ключей на основе пароля, такие как PBKDF2, определенные в PKCS # 5 v2.0 и RFC 2898 . Этот алгоритм создает некоторый случайный материал из главного секрета (пароля), чтобы сгенерировать ключ, подходящий для данного шифра.

public byte[] deriveKey(String password, byte[] salt, int keyLen) {
    SecretKeyFactory kf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
    KeySpec specs = new PBEKeySpec(password.toCharArray(), salt, 1024, keyLen);
    SecretKey key = kf.generateSecret(specs);
    return key.getEncoded();
}

public byte[] encrypt(String password, byte[] plaintext) {
    byte[] salt = new byte[64];
    Random rnd = new Random();
    rnd.nextByte(salt);
    byte[] data = deriveKey(password, salt, 192);
    SecretKey desKey = SecretKeyFactory.getInstance("DESede").generateSecret(new DESedeKeySpec(data));
    Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, desKey);
    return cipher.doFinal(plaintext);
}
...