Chrome(最初のWeb暗号化サポート以来)、Firefox(最初のWeb暗号化サポート以来)、さらにはSafari TP(10.2)でもWeb暗号化API WebCrypto API(https://github.com/PeculiarVentures/webcrypto-liner)用のポリールフィルであるWebCrypto Linerをサポートしています。Microsoft Edge(38.14393.0.0)を使用したWeb Crypto API
今、Microsoft Edgeを使用してコードをテストしたいと思います。しかし、サンプルのArrayBufferの暗号化と復号化はすでに失敗しています。ここでは、コードは:そのはクロム、FirefoxとさえSafariで正常に動作している間
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);
});
}
このコードは、エッジ上の解読相(コードのステップ3)で失敗しています。
[object Object] {additionalData: Uint8Array {...}, iv: Uint8Array {...}, name: "AES-GCM", tagLength: 128}
これは、マイクロソフトのエッジに失敗した理由を誰もが手掛かりを持っています:decryptedDataPromiseは例外で拒否されたが、返されたデータがまったく例外のように見えるdoesntのこと、有線部分、それ?コメントで示唆したように
このライブサンプルhttps://diafygi.github.io/webcrypto-examples/では、EdgeでAES-GCMが動作することを示しています。したがって、パラメータのわずかな違いが原因です。 16の代わりに12のサイズのIVで試してみませんか? – pedrofb
さらに上記のコメントには、 'var tempAdditionalData = new Uint8Array(1);' note:1 not 0 –