如何从webcrypto AES-GCM加密中获取标记

时间:2017-05-08 11:31:51

标签: javascript php encryption

我正在尝试使用webcrypto加密并使用php中的openssl进行解密。要在php中解密,我需要一个身份验证标记。有没有一种方法可以从密文中提取它,或者我能掌握它的任何其他方式? webcrypto中的加密是:

var stringToArrayBuffer=function(str){
  var bytes = new Uint8Array(str.length);
  for (var iii = 0; iii < str.length; iii++){
    bytes[iii] = str.charCodeAt(iii);
  }
  return bytes;
}
var arrayBufferToString=function(buffer){
  var str = "";
  for (var iii = 0; iii < buffer.byteLength; iii++){
    str += String.fromCharCode(buffer[iii]);
  }
  return str;
}
var vector=window.crypto.getRandomValues(new Uint8Array(12)),sendData={},key;
sendData.iv=btoa(arrayBufferToString(new Uint8Array(vector));

crypto.subtle.generateKey({name: "AES-GCM",length: 256,},false,["encrypt", "decrypt"]).then(function(oKey){
    console.log(oKey);
    key=oKey;
    sendData.key=btoa(arrayBufferToString(new Uint8Array(key));
}).catch(function(err){console.error("generateKey:",err);});

crypto.subtle.encrypt({name: "AES-GCM", iv: vector,tagLength: 128,},key,stringToArrayBuffer(input)).then(
  function(result){
    console.log('encrypted',new Uint8Array(result))
    encryptedDataString=arrayBufferToString(new Uint8Array(result));
    sendData.dataString=btoa(arrayBufferToString(new Uint8Array(result)));
  }
).catch(function(err){console.error("encryptData error:",err);});

1 个答案:

答案 0 :(得分:1)

您需要从加密数据末尾切换tagLength个字节

/**
 * Gets tag from encrypted data
 * 
 * @param {ArrayBuffer} encrypted Encrypted data
 * @param {number} tagLength Tag length in bits. Default 128 bits
 * @returns {ArrayBuffer}
 */
function GetTag(encrypted, tagLength) {
    if (tagLength === void 0) tagLength = 128;
    return encrypted.slice(encrypted.byteLength - ((tagLength + 7) >> 3))
}