Objective-C中的字符串加密在C#中解密

本文关键字:解密 字符串 Objective-C 加密 | 更新日期: 2023-09-27 18:26:49

我正在构建一个使用c#web服务的iPhone应用程序。我的iPhone应用程序接收一些数据并对其进行加密,然后将其传递给网络服务。如何解密C#中的数据?

我的iPhone应用程序包含以下代码:

NSString *pString = @"Some string to be encoded";
NSString *key = @"My encryption key";
NSData *pData = [pString dataUsingEncoding:NSUTF8StringEncoding];
pData = [pData AES256EncryptWithKey:key];
NSString *pID = [pData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];

编辑:数据已经存储在web服务中,所以我无法轻易更改加密方法。C#应用程序不在服务器上,因此不可能泄露密钥。

我已经尝试了以下C#代码来解密数据:

    static string DecryptString(string encryptedText, string key)
    {
        byte[] encryptedString = Convert.FromBase64String(encryptedText);
        byte[] encryptionKey = Encoding.UTF8.GetBytes(key.Substring(0, 32));
        using (var provider = new AesCryptoServiceProvider())
        {
            provider.Mode = CipherMode.CBC;
            provider.Padding = PaddingMode.PKCS7;
            provider.Key = encryptionKey;
            using (var ms = new MemoryStream(encryptedString))
            {
                // Read the first 16 bytes which is the IV.
                byte[] iv = new byte[16];
                ms.Read(iv, 0, 16);
                provider.IV = iv;
                using (var decryptor = provider.CreateDecryptor())
                {
                    using (var cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
                    {
                        using (var sr = new StreamReader(cs))
                        {
                            return sr.ReadToEnd();
                        }
                    }
                }
            }
        }
    }

然而,我得到了以下例外:

System.Security.Cryptography.CryptographicException未得到处理
HResult=-2146232396消息=填充无效,不能已删除。

DecryptString接收到的encryptedText的长度为80字节。

Objective-C中的字符串加密在C#中解密

示例ObjC代码默认使用CBC调制解调器、PKCS#7填充和16个0x00字节的默认iv。

C#还使用CBC模式和PKCS#7填充。解密代码期望一个16字节的iv预挂在加密数据上,但这并不存在。

byte[] iv = new byte[16];
ms.Read(iv, 0, 16);
provider.IV = iv;

这需要更改,以便iv被设置为16个0x00字节的数组,并且ms.Read(iv, 0, 16)语句需要删除,以便解密函数获得所有加密数据。

注:

  1. 在加密中使用devault任何东西都是个坏主意,总是提供正确的长度数据。

  2. 应该添加对加密数据的验证,以便确定是否存在不正确的密钥或数据已被篡改。

  3. 确实应该有一个版本号和一个随机IV,并在加密之前使用,所以你真的应该考虑纠正这一点。这说明了为什么通常需要提供和使用版本号。

RNCryptor涵盖了上述问题。

加密密钥的处理也需要考虑,以便尽可能安全。

您需要首先将base-64编码的字符串解码为字节[]-请参阅Convert.FromBase64String()。然后您需要使用Aes类对其进行解密-文档页面上有一个示例。