Я хочу общаться между java и машинописью с зашифрованными данными AES-GCM (PBKDF2 га sh используется для пароля).
Я использовал случайные байты для pbkdf2:
randomBytes(Base64): wqzowTahVBaxuxcN8vKAEUBEo0wOfcg4e6u4M9tPDFk=
Это my java PBKDF2 Код:
private String salt = "1234";
private static final String KEY_ALGORITHM = "AES";
private Key generateKey(byte[] randomBytes) throws Exception {
var randomPassword = new String(randomBytes);
KeySpec keySpec = new PBEKeySpec(randomPassword.toCharArray(), salt.getBytes(), 10000, 256);
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
var kdf2SecurePassword = secretKeyFactory.generateSecret(keySpec).getEncoded();
return new SecretKeySpec(kdf2SecurePassword, KEY_ALGORITHM);
}
и это код машинописного текста:
private static importKey(randomBytes: ArrayBuffer) {
return crypto.subtle.importKey(
'raw',
randomBytes,
{name: 'PBKDF2', length: 256},
true,
['deriveKey']
);
}
private generateAESKey(baseKey, salt) {
const encSalt = new TextEncoder().encode(salt);
const algorithm = {
name: 'PBKDF2',
hash: 'SHA-256',
iterations: 10000,
salt: encSalt
};
return crypto.subtle.deriveKey(
algorithm,
baseKey,
{name: 'AES-GCM', length: 256},
true,
['encrypt', 'decrypt']
);
}
Результат java и машинопись:
Java Key : hrG2Hw/bec9JoI+EcemfUxR/5lGw718kYOcCWRRbulk=
typescript Key : EGPcTUQUmYpNHoCDuD7rkIVaHkPSqEZYan4HnWfhFSc=
Почему я есть разница в результате?
Какая часть кода имеет ошибки?
ОБНОВЛЕНИЕ
Интересно, я пытаюсь сгенерировать ключ pbkdf2 с помощью команды linux nettle-pbkdf2
, результат точно совпадает с выводом javascript:
USERNAME@HOSTNAME:~$ echo -n "wqzowTahVBaxuxcN8vKAEUBEo0wOfcg4e6u4M9tPDFk=" | base64 -d | nettle-pbkdf2 -i 10000 -l 32 --raw "1234" | base64
EGPcTUQUmYpNHoCDuD7rkIVaHkPSqEZYan4HnWfhFSc=