J'utilise l'API Web Crypto (https://www.w3.org/TR/WebCryptoAPI/) avec succès sur Chrome (depuis le premier support Web Crypto), Firefox (depuis le premier support Web Crypto) et même sur Safari TP (10.2) avec le support d'un WebCrypto Liner un pollyfill pour API WebCrypto (https://github.com/PeculiarVentures/webcrypto-liner).API Web Crypto utilisant Microsoft Edge (38.14393.0.0)
Maintenant, je veux tester notre code en utilisant Microsoft Edge. Mais chiffrer et déchiffrer un exemple ArrayBuffer échoue déjà. Voici le code:
var crypto = window.crypto;
if (crypto.subtle) {
var aesGcmKey = null;
// always create a new, random iv in production systems!!!
var tempIv = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]);
// needed for edge, if additional data missing decrypting is failing
var tempAdditionalData = new Uint8Array(0);
var dataToEncrypt = new Uint8Array([1, 2, 3, 4, 5]);
// 1.) generate key
var generateKeyPromise = crypto.subtle.generateKey(
{name: "AES-GCM", length: 256}, true, ["encrypt", "decrypt"]
);
generateKeyPromise.then(function (tempKey) {
aesGcmKey = tempKey;
// 2.) start encryption with this key
var encryptedDataPromise = crypto.subtle.encrypt(
{name: "AES-GCM", iv: tempIv, additionalData: tempAdditionalData, tagLength: 128},
aesGcmKey,
dataToEncrypt
);
encryptedDataPromise.then(function (encryptedData) {
// 3.) decrypt using same key
var decryptedDataPromise = crypto.subtle.decrypt(
{name: "AES-GCM", iv: tempIv, additionalData: tempAdditionalData, tagLength: 128},
aesGcmKey,
encryptedData
);
decryptedDataPromise.then(function (decryptedData) {
// 4.) compare decrypted array buffer and inital data
console.log('data decrypted!');
console.log(decryptedData);
});
decryptedDataPromise.catch(function (error) {
console.log('decrypting sample data failed');
console.log(error);
});
});
// if 2.) is failing
encryptedDataPromise.catch(function (error) {
console.log('encrypting sample data failed');
console.log(error);
});
});
// if 1.) is failing
generateKeyPromise.catch(function (error) {
console.log('creating aec gcm key failed');
console.log(error);
});
}
Ce code échoue dans la phase de décryptage (étape 3 dans le code) sur le bord, tandis que son travail bien sur Chrome, Firefox et Safari même. La partie filaire il que le decryptedDataPromise est rejeté avec une exception, mais les données renvoyées ne ressemble pas à une exception du tout:
[object Object] {additionalData: Uint8Array {...}, iv: Uint8Array {...}, name: "AES-GCM", tagLength: 128}
Est-ce que quelqu'un a une idée de pourquoi cela ne fonctionne pas sur Microsoft Edge?
cet exemple live https://diafygi.github.io/webcrypto-examples/ montre qu'AES-GCM fonctionne dans Edge. Donc, cela sera dû à une petite différence dans les paramètres. Pourriez-vous essayer avec un IV de taille 12 au lieu de 16? – pedrofb
suite au commentaire ci-dessus, il semble que vous ayez besoin de 'var tempAdditionalData = new Uint8Array (1);' note: 1 pas 0 –