• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-13 12:19:36 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在构建一个使用 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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap