我正在尝试解密一些文本加密的客户端并且很难做到这一点。
我在客户端使用 Standford Javascript Crypto Library (sjcl),它生成一个我可以发送到服务器的 json 字符串,像这样......
sjcl.encrypt("my_key", "something, something");
并产生这个 json 字符串......
"{"iv":"tfyF7oMXjauOkRnwaffU3A==","v":1,"iter":10000,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"bq5G63+hk0U=","ct":"KahF3hQ3FZZ2l7APxLB4nRvw03Xt/qD04AChoA=="}"
现在我在服务器端收到这个 json 字符串,并尝试这样做......
dynamic data = JObject.Parse(json);
var key = Encoding.ASCII.GetBytes("my_key");
var iv = Convert.FromBase64String(data.iv.Value);
byte[] cypher = Convert.FromBase64String(data.ct.Value);
string plainText = null;
using (AesCryptoServiceProvider provider = new AesCryptoServiceProvider())
{
provider.Key = key;
provider.IV = iv;
ICryptoTransform decryptor = provider.CreateDecryptor(provider.Key, provider.IV);
using (MemoryStream ms = new MemoryStream(cypher))
{
using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
{
using (StreamReader sr = new StreamReader(cs))
{
plainText = sr.ReadToEnd();
}
}
}
}
return plainText;
上面的服务器端代码崩溃plainText = sr.ReadToEnd;
并抛出“输入数据不是完整的块”。我知道 AES 要求 cypherText 的块大小为 128,并且由于文本大小不同,我如何保证它的块大小为 128 并且不会破坏预期值?是否需要在这里设置填充?
另外,AESCryptoServiceProvider 中“ccm”对应的模式是什么?是否需要“iter”和“salt”才能正确解密?
提前致谢!
海梅