OGeek|极客世界-中国程序员成长平台

标题: c# - Objective-C 中的字符串加密在 C# 中解密 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 12:19
标题: c# - Objective-C 中的字符串加密在 C# 中解密

我正在构建一个使用 c# 网络服务的 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];

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

我尝试了以下 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 was unhandled
HResult=-2146233296 Message=Padding is invalid and cannot be removed.

DecryptString接收到的加密文本长度为80字节。



Best Answer-推荐答案


示例 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. 在加密中使用 default 任何东西都是一个坏主意,始终提供正确长度的数据。

  2. 需要增加对加密数据的鉴权,以判断 key 是否错误或数据是否被篡改。

  3. 确实应该使用一个版本号和一个随机 IV,并将其添加到加密的前面,因此您真的应该考虑更正它。这说明了为什么通常需要提供和使用版本号。

RNCryptor 涵盖了上述问题。

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

关于c# - Objective-C 中的字符串加密在 C# 中解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34259933/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://sqlite.in/) Powered by Discuz! X3.4