有一个第三方应用程序使用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值的字节。
我感到迷茫。我该怎么办?
答案 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 :(得分:0)
RNCryptor格式已经用各种语言实现。 C#one是https://github.com/RNCryptor/RNCryptor-cs。
请注意,C#实现并不是特别强大,因为它处理字节与字符串的关系。欢迎PR。虽然我一般不支持C#实现,但如果它对您至关重要,请与我联系,我很乐意讨论短期合同。