使用C#在Objective-C中解密字符串

威尔逊

我正在构建一个使用ac#Web服务的iPhone应用程序。我的iPhone应用程序接收一些数据并将其加密,然后将其传递到Web服务。如何在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 = -2146233296消息=填充无效,无法删除。

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

扎夫

默认情况下,示例ObjC代码使用CBC调制解调器,PKCS#7填充和160x00字节的默认iv

C#还使用CBC模式和PKCS#7填充。解密代码期望在加密数据之前添加一个16字节的iv,并且该密码不存在。

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

需要对此进行更改,以便将iv其设置为160x00个字节的数组,并且ms.Read(iv, 0, 16)需要删除语句,以便解密函数获取所有加密数据。

笔记:

  1. 在加密中使用任何东西都是不好的主意,请始终提供正确的长度数据。

  2. 应该添加对加密数据需求的身份验证,以便可以确定是否存在错误的密钥或数据是否被篡改。

  3. 确实应该有一个版本号和一个随机IV,该IV放在加密之前,因此您应该真正考虑对此进行更正。这说明了为什么通常需要提供和使用版本号。

RNCryptor涵盖了以上问题。

还需要考虑加密密钥的处理,以确保其安全性。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章