2017-05-08 1 views
0

webcrypto를 사용하여 암호화하고 PHP에서 openssl을 사용하여 해독하려고합니다. PHP에서 해독하려면 인증 태그가 필요합니다. 암호문에서 추출하는 방법이 있습니까? 아니면 다른 방법으로 그것을 잡을 수 있습니까? webcrypto의 암호화는 다음과 같습니다webcrypto AES-GCM 암호화에서 태그를 얻는 방법

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

끝에서 슬라이스를 해제의 끝에서 tagLength 바이트 슬라이스해야합니까? –

+0

어떻게 var "결과"에서 슬라이스합니까? – gerteb

+0

PHP에서 태그는 길이가 16 인 utf-8 문자열입니다. 자바 스크립트에서 길이가 10 인 문자열을 암호화하면 길이가 26 인 암호화 된 utf-8 문자열이 생깁니다. 마지막으로 16 문자 만 잘라내어 사용하십시오 PHP에서 태그로 그들을? – gerteb

답변

1

당신은 암호화 된 데이터

/** 
* 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)) 
} 
관련 문제