1

我正在尝试解密一些文本加密的客户端并且很难做到这一点。

我在客户端使用 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”才能正确解密?

提前致谢!

海梅

4

0 回答 0