0

有一个第三方应用程序使用RNCryptor使用 AES256 加密文件,我正在尝试在我的 C# 应用程序中解密这些文件。我得到的只是密钥大小(256)和密码字符串。

以下是文件在发送给我之前的加密方式:

    NSData *data = [@"Data" dataUsingEncoding:NSUTF8StringEncoding];
    NSError *error;
    NSData *encryptedData = [RNEncryptor encryptData:data
                                      withSettings:kRNCryptorAES256Settings
                                      password:aPassword
                                         error:&error];

我仍在学习如何加密/解密,所以我不确定如何处理这个问题。我在这里看到的所有解密示例似乎都需要 IV 和 salt(有时甚至需要密码迭代),但正如您从上面的代码中看到的那样,当文件被加密时,没有提到任何这些事情。

这是我到目前为止所得到的:

    public static string DecryptString(byte[] encryptedString, byte[] encryptionKey)
    {
        using (var provider = new AesCryptoServiceProvider())
        {
            provider.Key = encryptionKey;
            provider.Mode = CipherMode.CBC;
            provider.Padding = PaddingMode.PKCS7;
            using (var ms = new MemoryStream(encryptedString))
            {
                byte[] buffer = null;
                ms.Read(buffer, 0, 16);
                provider.IV = buffer;
                using (var decryptor = provider.CreateDecryptor(provider.Key, provider.IV))
                {
                    using (var cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
                    {
                        byte[] decrypted = new byte[encryptedString.Length];
                        var byteCount = cs.Read(decrypted, 0, encryptedString.Length);
                        return Encoding.UTF8.GetString(decrypted, 0, byteCount);
                    }
                }
            }
        }

所以我发现我可以从前 16 个字节中获取 IV,但这仍然存在加密密钥的问题,我无法在没有盐值的情况下将其转换为字节。

我感到失落。我在这里做什么?

4

2 回答 2

1

RNCryptor 的文档在这里有我需要的信息:https ://github.com/RNCryptor/RNCryptor-Spec/blob/master/RNCryptor-Spec-v3.md

Byte:     |    0    |    1    |      2-9       |  10-17   | 18-33 | <-      ...     -> | n-32 - n |
Contents: | version | options | encryptionSalt | HMACSalt |  IV   | ... ciphertext ... |   HMAC   |
  • 版本(1 字节):数据格式版本。目前3。
  • 选项(1 个字节):位 0 - 使用密码
  • encryptionSalt(8 字节):iff 选项包括“使用密码”
  • HMACSalt(8 字节):如果选项包括“使用密码”
  • IV (16 字节)
  • ciphertext (variable) -- 以 CBC 模式加密
  • HMAC(32 字节)
于 2018-04-20T17:39:30.703 回答
0

RNCryptor 格式已以各种语言实现。C# 是https://github.com/RNCryptor/RNCryptor-cs

请注意,C# 实现并不是一个特别强大的实现,因为它处理字节与字符串的方式不同。欢迎 PR。虽然我通常不支持 C# 实现,但如果它对您很重要,请联系我们,我很乐意讨论短期合同。

于 2018-04-21T12:51:42.913 回答