如何使用 Rijndael 在 iOS 中加密 C# 中的解密字符串

2024-03-08

我正在尝试使用 Objective C 和 C# 加密和解密字符串。两者在本机代码中都工作正常,但是当我尝试解密 C# 中的字符串时,它在 iOS 中被加密。我收到一些错误。

这是我在目标c中使用的代码

- (NSData *)AES256EncryptWithKey:(NSString *)key  Data: (NSData *) data
{
    char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)

    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)

    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [data length];

    NSData *iv =  [@"abcdefghijklmnopqrstuvwxyz123456" dataUsingEncoding:NSUTF8StringEncoding];

    size_t bufferSize = dataLength + kCCBlockSizeAES128;

    void *buffer = malloc(bufferSize);

    size_t numBytesEncrypted = 0;

    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                          keyPtr, kCCKeySizeAES256,
                                          [iv bytes] /* initialization vector (optional) */,
                                          [data bytes], dataLength, /* input */
                                          buffer, bufferSize, /* output */
                                          &numBytesEncrypted);

    if (cryptStatus == kCCSuccess)
    {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
    }

    free(buffer); //free the buffer;

    return nil;
}

在想知道如何在 C# 中解密时,我给出的块大小为 256,ivsize 为 32 并使用“RijndaelManaged()”。我没有使用盐和密码。 错误:类似于“填充无效且无法删除”。 我也尝试将填充设置为 PKCS7、无、零,但没有任何帮助解密。

有人可以帮忙吗?

编辑: 我的 C# 代码在这里

public string DecryptString(string encrypted)
{
    string result = null;
    _encoder = new UTF8Encoding();
    if (!string.IsNullOrWhiteSpace(encrypted) && (encrypted.Length >= 32))
    {
        var messageBytes = Convert.FromBase64String(encrypted);
        using (var rm = new RijndaelManaged())
        { 
            rm.BlockSize = _blockSize;
            rm.Key = _encoder.GetBytes("mykey_here");
            rm.IV = _encoder.GetBytes("abcdefghijklmnopqrstuvwxyz123456"); ;
            rm.Padding = PaddingMode.Zeros;
            var decryptor = rm.CreateDecryptor(rm.Key, messageBytes.Take(_ivSize).ToArray());
            result = _encoder.GetString(Transform(messageBytes.Skip(_ivSize).ToArray(), decryptor));
        }
    }

    return result;
}

protected byte[] Transform(byte[] buffer, ICryptoTransform transform)
{
    byte[] result;
    using (var stream = new MemoryStream())
    using (var cs = new CryptoStream(stream, transform, CryptoStreamMode.Write))
    {
        cs.Write(buffer, 0, buffer.Length);
        cs.FlushFinalBlock();
        result = stream.ToArray();
    }

    return result;
}

iOS(Common Crypto)显式指定所有加密参数,C# 代码隐式确定许多参数。这些隐式参数虽然简化了使用,但在尝试实现互操作性时却存在问题。

C# 类RijndaelManaged允许显式指定参数,更改您的代码以使用这些参数,特别是BlockSize (128), KeySize (128), Mode (CipherMode.CBC) and Padding (PaddingMode.PKCS7)。默认为mode and Padding都可以。看Rijndael管理文档 https://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndaelmanaged(v=vs.110).aspx

AES 和 Rijndael 不同,特别是 AES 仅使用 128 位(16 字节)的块大小,而 Rijndael 允许多种块大小。因此需要为 Rijndael 指定 128 位的块大小。因此 iv 也是 128 位(16 字节)。 两者都支持 128、192 和 256 字节的加密密钥。

你可能会更好地使用AESManaged类比RijndaelManaged班级。看Aes托管文档 https://msdn.microsoft.com/en-us/library/system.security.cryptography.aesmanaged(v=vs.110).aspx

C# 端期望数据进行 Base64 编码,iOS 端不显示该编码操作,请确保该操作在 iOS 端完成。

由于您使用的是 iv,请确保两侧都使用 CBC 模式。在 Common Crypto 中,CBC 模式是默认模式,请确保 C# 端使用 CBC 模式。

确保 C# 端使用 PKCS#7 或 PKCS#5 填充,它们是等效的。看来 PKCS#7 是 C# 端的默认值,所以这应该没问题。

最好使用与指定大小完全相同的键,而不是依赖默认填充。在 Common Crypto 中,如果提供的密钥太短,则显式指定密钥大小并用 null 填充。 C# 看起来像是通过提供的密钥来确定密钥大小,在本例中,密钥为 10 字节,因此解密密钥可能默认为 128 位,并且密钥在内部用空值填充。在 iOS 上,您明确指定 256 位的密钥大小。这是一个需要修复的不匹配。提供与 iOS 端指定的确切大小的密钥。

最后是 iv,C# 代码希望将 iv 添加到加密数据的前面,但 iOS 代码没有提供这一点。解决方案是更改 iOS 代码,将 iv 添加到加密代码的前面。将 iv 更改为 16 字节,即 AES 块大小。

最后,如果您需要更多帮助,请在加密调用之前和之后提供测试数据输入、数据输出、iv 和密钥的十六进制转储。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Rijndael 在 iOS 中加密 C# 中的解密字符串 的相关文章

  • 在 C# 中调用 C++ 库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有很多用 C 编写的库 我想从 C 调用这些库 但是 我遇到了很多问题 我想知道是否有书籍或指南告诉我如何做到这一点 Dll导入 htt
  • Gwan C#,如何获取HTTP标头?

    我需要它来重写 url 以了解我正在处理哪个友好的 url 用于用户代理和其他东西 EDIT public class Gwan MethodImplAttribute MethodImplOptions InternalCall exte
  • 如何制作可启动程序?

    所以 这个问题可能看起来很奇怪 但假设我编译了 int main void int x 3 int y 4 int z x y 是否可以让CPU这样运行 如何 例如 这允许我写入监视器吗 如果我没记错的话 内存中有些地方可以写入要显示的内容
  • 计算另一个表达式中的 C# 表达式

    我想在另一个表达式中使用一个表达式 Expression
  • 如何确定 UINavigationController 中工具栏的高度?

    我有一个带有由 UINavigationController 呈现的工具栏的视图 当我处理 UIKeyboardWillShowNotification 时 我将整个屏幕向上滚动键盘的高度 问题是当显示键盘时 底部工具栏不显示 所以我只需将
  • 为什么'enable_if'不能用于禁用这里声明

    include
  • 将表(行)与 OpenXML SDK 2.5 保持在一起

    我想在 Word 文档中生成多个表 每行 2 行 但我想将这两行保留在一起 如果可能的话 new KeepNext 第一行不起作用 new KeepNext 第一行的最后一段不起作用 new CantSplit 放在桌子上不起作用 在所有情
  • MFC:如何设置CEdit框的焦点?

    我正在开发我的第一个简单的 MFC 项目 但我正在努力解决一个问题 想要设置所有的焦点CEdit其中一个对话框中的框 我的想法是 当打开对话框时 焦点位于第一个编辑框上 然后使用 选项卡 在它们之间交换 我看到了方法SetFocus 但我无
  • 根据对象变量搜索对象列表

    我有一个对象列表 这些对象具有三个变量 ID 名称和值 这个列表中可能有很多对象 我需要根据ID或Name找到一个对象 并更改值 例子 class objec public string Name public int UID public
  • UI 函数在快速事件完成之前触发

    我有一个停靠在 Silverlight 应用程序中的 Web 浏览器框架 有时会在其上弹出全窗口 XAML Silverlight UI 元素 我已经或多或少修复了一个老问题 即 Web 框架的内容似乎与 Silverlight 内容不能很
  • 在 asp.net MVC 中使用活动目录进行身份验证

    我想使用活动目录对我的 asp net mvc 项目中的用户进行身份验证 在网上冲浪了几个小时后 我没有找到任何对我有用的东西 我已经看到了所有结果 但什么也没有 我尝试按照许多帖子的建议编辑我的 web config 如果有人可以帮助我提
  • 如何使用 NPOI 按地址(A1、A2)获取 Excel 单元格值

    我有一个 Excel 单元格地址 例如 A1 A2 如何使用 C 中的 NPOI 框架以编程方式访问此单元格 我找到的一些 Java POI 示例代码 CellReference cr new CellReference A1 row my
  • Linux mremap 不释放旧映射?

    我需要一种方法将页面从一个虚拟地址范围复制到另一个虚拟地址范围 而无需实际复制数据 范围很大 延迟很重要 mremap 可以做到这一点 但问题是它也会删除旧的映射 由于我需要在多线程环境中执行此操作 因此我需要旧映射能够同时使用 因此稍后当
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • 后台模式下的 AVSpeechSynthesizer

    我无法获取 iOS 7AVSpeechSynthesizer当我的 iOS 应用程序处于后台模式时工作 我添加了 应用程序播放音频 应用程序支持的后台模式的关键 但我仍然无法让它工作 我还研究了创建一个AVMutableCompositio
  • 逆向工程 ASP.NET Web 应用程序

    我有一个 ASP NET Web 应用程序 我没有源代码 该 bin 包含 10 个程序集和一个 compiled 文件 我在 App Code dll 上使用 Reflector 它向我显示了类和命名空间之类的东西 但它太混乱了 有没有什
  • 如何调试 .NET 运行时中的内部错误?

    我正在尝试调试一些处理大文件的工作 代码本身works 但 NET 运行时本身会报告零星错误 对于上下文 这里的处理是一个 1 5GB 文件 仅加载到内存中一次 在循环中处理和释放 故意尝试重现此否则不可预测的错误 我的测试片段基本上是 t
  • 来自 3rd 方库的链接器错误 LNK2019

    我正在将旧的 vc 6 0 应用程序移植到 vs2005 我收到以下链接器错误 我花了几天时间试图找到解决方案 错误LNK2019 无法解析的外部符号 imp 创建AwnService 52 在函数 public int thiscall
  • iOS SWIFT - WebRTC 从前置摄像头更改为后置摄像头

    WebRTC 视频默认使用前置摄像头 效果很好 但是 我需要将其切换到后置摄像头 但我无法找到任何代码来执行此操作 我需要编辑哪一部分 是 localView 或 localVideoTrack 还是捕获器 斯威夫特3 0 对等连接只能有一
  • 如何使用placement new重新初始化该字段?

    我的课程包含字段 private OrderUpdate curOrderUpdate 我一遍又一遍地使用它 经常需要重新初始化 for int i 0 i lt entries size i auto entry entries i ne

随机推荐

  • 复制 QMimeData 对象的正确方法

    我正在开发一个 Qt 应用程序来存储剪贴板中的所有内容 以便稍后可以恢复它 我的方法是检索QMime数据 http qt project org doc qt 4 8 qmimedata html来自QApplication clipboa
  • Mozilla firefox 不支持预加载

    我在预加载方面遇到问题 我厌倦了使用 html 中的预加载来预加载 css 表 谷歌浏览器支持 但火狐浏览器不支持
  • 如何检查 MongoDB 中是否存在密钥

    我正在尝试检查 MongoDB 集合中是否存在某个键 基本上 我需要将字符串数组映射到特定的键 如果该键存在 我想通过添加新值来更新列表 否则创建一个具有初始值的新键 如果添加新键 则最初只会添加 1 个值 我在网上找到了一些例子 尽管我无
  • Pandas 系列到字典的矢量化查找

    问题陈述 pandas 数据框列系列 same group需要根据两个现有列的值从布尔值创建 row and col 如果行中的两个单元格在字典中具有相似的值 相交值 则该行需要显示 Truememberships 否则为 False 无相
  • Prolog 中的否定作为失败是一种程序行为吗?

    我有一个关于否定即失败在 Prolog 语言中 这是一个理论性多于实践性的问题 因为我清楚这个例子是如何工作的 所以我有以下 Prolog 程序 Fatti che specificano quali esseri sono degli a
  • NFCISO15693Tag 自定义命令“缺少所需的权利”

    在iOS13测试版中 当我尝试使用 NFCISO15693Tag api 时customCommandWithRequestFlag customCommandCode customRequestParameters completionH
  • 如何在 Angular Material 中固定垫选择面板的位置

    我有一个使用 Angular Material 组件的项目 我想自定义 mat select 我想实现选择输入 其中 mat select panel 看起来像本机 html 选择中的下拉菜单 我仅使用 CSS 样式就取得了很好的效果 但有
  • Bootbox.confirm可以同步工作吗?

    在aspx页面中 有一个像这样的asp linkbutton
  • 是否可以编写一个 Rust 宏“has_trait!(,|)”?

    我想匹配 例如一个ident的类型来实现某种特征 我该怎么做 这是 不完整 代码的基本思想 macro rules has trait t ty x ident gt fn trait test let a vec 1 2 3 let b
  • 如何从Python中的请求模块中完全删除任何日志记录

    如何从 Python 中的 requests 模块中完全删除任何日志记录 我什至不需要设置 临界 级别 像这样 import logging requests log logging getLogger requests requests
  • 如何使用一个查询获取包含子列表的列表?

    我想打印数据库表中的项目列表 并与每个项目一起打印一个相关子项目的小列表 最多 10 个项目 例如 我有这两个表 ITEMS id integer name string SUBITEMS id integer name string it
  • 如何输出带双引号的字符串?

    我需要输出一个字符串 它基本上是一个java代码 我有这样的事情 web if url contains mp4 我需要单引号 将是双引号 而不是在 html 代码中 有可能做到吗 new str str replace web 您可以选择
  • 防止其他人强制推送到我的 Git 存储库

    有没有办法阻止除了我之外的任何人强制推送到我的 Git 存储库之一 特别是在 Github 中 据我了解 受保护的分支可以完全防止强制推送 但只要我是这样做的人就可以了 每当 GitHub 存储库出现保护问题时 最可靠的强制执行方法就是拥有
  • 如果 CDN 失败,jquery-tools 会回退

    如果 Google 的 CDN 失败 我将使用 来回退并在本地提供 jquery 如下这个线程 https stackoverflow com questions 1014203 best way to use googles hosted
  • 基于容器元素在 AngularJS 指令内自动调整 SVG 大小

    我将一个角度指令放置在动态大小的元素内 该指令本身由一个基于元素大小计算的 SVG 组成 我正在尝试使 SVG 根据容器的大小自动调整大小和重绘 我最初尝试过这样的事情 我的指令 js angular module myModule dir
  • “foreach”是否会导致 Linq 重复执行?

    我第一次使用 NET 中的实体框架 并且一直在编写 LINQ 查询以便从我的模型中获取信息 我想从一开始就养成良好的编程习惯 因此我一直在研究编写这些查询并获取结果的最佳方法 不幸的是 在浏览 Stack Exchange 时 我似乎遇到了
  • 从 Geany 运行 Node.js 服务器

    一个简单的问题 是否可以配置 Geany IDE 以便可以使用 运行 按钮直接从 Geany 运行 Node js 服务器 当在 JS 文件中时 转到Build gt Set Build Commands 应该有一个章节标题Execute
  • KnockoutJS:如何将一个 observableArray 添加到另一个 observableArray?

    我想将选择元素中的选定选项添加到绑定表中 视图模型具有 addItem 函数 该函数使用 ko utils arrayPushAll 将 selectedItems 数组添加到 linkedItems 数组中 但是当我单击 添加 按钮 调用
  • 按字母顺序对对象数组进行排序

    我正在尝试按字母顺序对对象数组进行排序 为了使事情简单 我使用下面的示例 在我的打字稿中 我通过拼接来插入和删除数组对象中的项目 Array cars id 1 items name car1 description this is car
  • 如何使用 Rijndael 在 iOS 中加密 C# 中的解密字符串

    我正在尝试使用 Objective C 和 C 加密和解密字符串 两者在本机代码中都工作正常 但是当我尝试解密 C 中的字符串时 它在 iOS 中被加密 我收到一些错误 这是我在目标c中使用的代码 NSData AES256EncryptW