解密使用RNCryptor加密的字节

时间:2018-04-20 15:30:28

标签: c# encryption rncryptor

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

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

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

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

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

    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,但是仍然存在加密密钥的问题,我无法将其转换为没有salt值的字节。

我感到迷茫。我该怎么办?

2 个答案:

答案 0 :(得分: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选项包含&#34;使用密码&#34;
  • HMACSalt(8字节):iff选项包括&#34;使用密码&#34;
  • IV(16字节)
  • 密文(变量) - 以CBC模式加密
  • HMAC(32字节)

答案 1 :(得分:0)

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

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