SJCL的问题"无法读取属性'替换'未定义"

时间:2015-02-06 11:10:29

标签: javascript encryption aes sjcl

使用Sjcl我尝试编写一个小服务,从我的javascript应用程序发送和接收加密数据。

可悲的是,sjcl documentation缺少有关如何处理其AES加密数据的信息。 他们的encrypt method返回一个包含多个属性的对象,我只能猜出它是什么。

{"iv":"i0t5BttfXwtY6hxuFSZxJg==",
"v":1,
"iter":1000,
"ks":128,
"ts":64,
"mode":"ccm",
"cipher":"aes",
"salt":"MZ8hpbz+5hU=",
"ct":"n5mR5jwawYwsaUV0xbcYXrcCXPWjR5qMG23qU5Spguz4jpjG5QdFMWSf"}

我可以识别iterkstsmodeciphersalt。我的猜测是ct是密文,表示加密数据。但是viv是什么?

我尝试解密我的密文,将ct作为参数,甚至尝试将整个结果作为参数,但它总是只会产生错误:

var result = sjcl.json.encrypt(
  'pw123', 
  '{text: "this should be decrypted"}', 
  parameters, 
  rp
);

var originalText = sjcl.json.decrypt(
  'pw123', 
  result.ct,
  parameters,
  rp);

// Results in:
// Uncaught TypeError: Cannot read property 'replace' of undefined

如何使用decrypt方法解密我的ct? 任何人都有这方面的经验,可以举一个简短的例子吗?

2 个答案:

答案 0 :(得分:1)

加密/解密使用默认参数:

var result = sjcl.json.encrypt(
  'pw123', 
  '{text: "this should be decrypted"}'
);

var originalText = sjcl.json.decrypt(
  'pw123', 
  result);
  

但是viv是什么?

v可能是密文的版本信息,因此更高版本的SJCL可以对其进行解密。它只是设置为1,从未在code中使用。

iv是大多数块密码模式(如CCM)所需的初始化向量。对于AES,它是16字节长或简单的块大小。

答案 1 :(得分:1)

我的示例中的问题是我尝试访问result.ct但结果是stringified JSON,因此访问它的属性ct 显然已返回undefined

在我的另一次尝试中,我通过传递parameters来覆盖参数。解密而不传递其他参数 - 初始参数已在result字符串化JSON中给出。

更新的小提琴在这里:http://jsfiddle.net/e5rqogm3/1/