ArrayBuffer和字符串中日文字符之间的JavaScript转换

时间:2018-07-03 12:22:55

标签: javascript string character-encoding arraybuffer

我正在使用Web Crypto API。我正在从加密/解密ArrayBuffer中获取信息。

要存储ArrayBuffer,我需要对其进行字符串化。我找到了this工作的示例:

function ab2str(buf) {
  return String.fromCharCode.apply(null, new Uint16Array(buf));
}
function str2ab(str) {
  var buf = new ArrayBuffer(str.length*2); // 2 bytes for each char
  var bufView = new Uint16Array(buf);
  for (var i=0, strLen=str.length; i < strLen; i++) {
    bufView[i] = str.charCodeAt(i);
  }
  return buf;
}

但是我得到的不是原始字符串。抽象示例工作流程:

var encryptedArrayBuffer = webcryapto.encrypt("someLongString");
var encryptedString = ab2str(encryptedArrayBuffer);

现在我得到了一个包含中文或日语字符的字符串。

var decryptedArrayBuffer = webcryapto.decrypt(someKey);
var decryptedString = ab2str(encryptedString);

转换后,解密后的字符串与原始字符串不同。在我的数据数组中,某些值已正确解密。其他则包含中文/日语字符,例如加密值。

有什么好的方法来避免出现意外字符?

更新

我正在使用上述网络加密示例的“ AES-CBC”。

工作价值

plain = "{"Key":"Outbuildings#58dc9e89-cbf6-4b06-ae9d-3380803ae995","Value":"Sonstiges Nebengebäude"}"

encryptedAB = webcrypto.encrypt(plain)

encrypted = ab2str(encryptedAB)

encrypted => "鷨捍⩆ኅ읲☹많ᦞ㙝⵱芾⟷㾌㴵꾂큹锩凉㚣䬶⁐薈Ⴞ舢ử揼߱泏넸붛蚔缍꠿䌩턂煮铈氁覞⺛鱂髽ؠ읰픡忧㣑鎜ㆅ鍏ᾪ莍庉떹Ẋ昭婚篥.矧ㇴ⒕ࡹ텾᧫ᲈﺍ⮣䋅"

decryptedArrayBuffer = webcrypto.decrypt(encrypted) 

decrypted = ab2str(decryptedArrayBuffer)

decrypted = > "{"Key":"Outbuildings#58dc9e89-cbf6-4b06-ae9d-3380803ae995","Value":"Sonstiges Nebengebäude"}"

解密后,我明白了。

无效值

plainString = "{"Key": "Outbuildings#d24857bc-5dee-4236-835d-8e3b91567a91", "Value": "Werkstatt"}"

encryptedArrayBuffer = webcrypto.encrypt(plainString)

encrypted => ab2str(encryptedArrayBuffer )

encrypted = "鷨捍⩆ኅ읲☹많ᦞ㙝⵱芾⟷㾌㴵꾂큹곙㤴njǃ⻲︽㙙郬쵸납餵逳䣊ᯗ퇟姛쏱阵巍旿柀⤏뙡뷇劺泴姲娯趱ៜ쪉轮댼롲ᾕ鱁ᬩ㩋䄅ᖯ苊脭䚛뮖ꡞಅ₨ፂ쑱眈盼갚⊙媌콠ᕥ䲵뺜঳왶輄繆緸䜁ꓳ镉⎇繆催ᥤ՘ⴸ㗻"

decryptedAB = webcrypto.decrypt(encrypted)

decrypted = ab2st(decryptedAB)

decrypted => "{"Key":"Outbuildings#d24∲姅�㉍猨씁�熢ᅍ攄稲짷业鯌㰸35d-иe3ꑢ專䫚︙绬ோᲬ㎂1","V偡lue":"Werkstatt"}"

在此示例中,在ab2str(decryptedArrayBuffer)之后,GUID和单词“ Value”被破坏。但是,并非所有值都具有相同的损坏字符。值的一部分可以,其他值可以用不同的字符破坏。

0 个答案:

没有答案