2015-09-10 2 views
0

В моем project я написал скрипт электронной таблицы Google для расшифровки зашифрованного содержимого ячейки с помощью sjcl. Но я потерпел неудачу.JSON.parse() - SyntaxError: Ожидаемый конец потока на char 2

function encryptCell() { 
    var masterKey = Browser.inputBox('Enter masterKey'); 
    var spreadSheet = SpreadsheetApp.getActiveSpreadsheet(); 
    var cell = spreadSheet.getActiveSheet().getActiveCell(); 
    var input = cell.getValue(); 

    var encJson = sjcl.encrypt(masterKey, input); 
/* 
{"iv":"4psT+LTIh/aT7WWv7Ye7qw==","v":1,"iter":1000,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"PjSOiia9TCM=","ct":"3hwmBbwQ7y/fsjk="} 
*/ 
    var encStr = JSON.stringify(encJson); 
/* 
"{\"iv\":\"4psT+LTIh/aT7WWv7Ye7qw==\",\"v\":1,\"iter\":1000,\"ks\":128,\"ts\":64,\"mode\":\"ccm\",\"adata\":\"\",\"cipher\":\"aes\",\"salt\":\"PjSOiia9TCM=\",\"ct\":\"3hwmBbwQ7y/fsjk=\"}" 
*/ 
    var encB64 = Utilities.base64Encode(encStr); 
    Browser.msgBox(encB64); 

    var rencStr = Utilities.base64Decode(encB64); 
/* 
34,123,92,34,105,118,92,34,58,92,34,52,112,115,84,43,76,84,73,104,47,97,84,55,87,87,118,55,89,101,55,113,119,61,61,92,34,44,92,34,118,92,34,58,49,44,92,34,105,116,101,114,92,34,58,49,48,48,48,44,92,34,107,115,92,34,58,49,50,56,44,92,34,116,115,92,34,58,54,52,44,92,34,109,111,100,101,92,34,58,92,34,99,99,109,92,34,44,92,34,97,100,97,116,97,92,34,58,92,34,92,34,44,92,34,99,105,112,104,101,114,92,34,58,92,34,97,101,115,92,34,44,92,34,115,97,108,116,92,34,58,92,34,80,106,83,79,105,105,97,57,84,67,77,61,92,34,44,92,34,99,116,92,34,58,92,34,51,104,119,109,66,98,119,81,55,121,47,102,115,106,107,61,92,34,125,34 
*/ 
    var rencJson = JSON.parse(rencStr); 
    var rinput = sjcl.decrypt(masterKey, rencJson); 
    Browser.msgBox(rinput); 
} 

Шифрование в порядке, которое я могу расшифровать, используя this tool. Что-то не так с JSON.parse().

+2

Распечатайте JSON, как он выглядит? – Corvusoft

+0

забыл упомянуть, я включил содержимое _sjcl.min.js_ в скрипт google. – Nilesh

+0

Спасибо @Corvusoft. решение [здесь] (http://stackoverflow.com/a/20210010/4417818) – Nilesh

ответ

0
var rencStr = Utilities.base64Decode(encB64); 
/* 
34,123,92,34,105,118,92,34,58,92,34,52,112,115,84,43,76,84,73,104,47,97,84,55,87,87,118,55,89,101,55,113,119,61,61,92,34,44,92,34,118,92,34,58,49,44,92,34,105,116,101,114,92,34,58,49,48,48,48,44,92,34,107,115,92,34,58,49,50,56,44,92,34,116,115,92,34,58,54,52,44,92,34,109,111,100,101,92,34,58,92,34,99,99,109,92,34,44,92,34,97,100,97,116,97,92,34,58,92,34,92,34,44,92,34,99,105,112,104,101,114,92,34,58,92,34,97,101,115,92,34,44,92,34,115,97,108,116,92,34,58,92,34,80,106,83,79,105,105,97,57,84,67,77,61,92,34,44,92,34,99,116,92,34,58,92,34,51,104,119,109,66,98,119,81,55,121,47,102,115,106,107,61,92,34,125,34 
*/ 

Если вы посмотрите, это не JSON. возможно, вы пропустили шаг JSON.stringify(); для этого?

Вы не можете разобрать его, если это не JSON.

+0

Проблема с 'Utilities.base64Decode (encB64);' – Nilesh

1

При декодировании с помощью Utilities.base64Decode() у вас есть один дополнительный шаг, чтобы следовать, если вы хотите вернуть строку. Если вы посмотрите на Google Scripts reference, он говорит, что base64Decode возвращает массив байтов, а не строку. Глядя на ваш код, ваше декодирование возвращает

var rencStr = Utilities.base64Decode(encB64); 
/*34,123,92,34,105,118,92,34,58,92,34,52,112,115,84,43,76,84,73,104,47,97,84...*/ 

который представляет собой числовое представление вашей строки в Юникоде. Если вы запустите свое возвращаемое значение через Utilities.newBlob(rencStr).getDataAsString(), как рекомендует рекомендация, у вас будет ваш JSON, который вы сможете проанализировать обратно в свою зашифрованную строку.

Смежные вопросы