【问题标题】:Decrypting a string in Obj-C that was encrypted in C#解密在 C# 中加密的 Obj-C 中的字符串
【发布时间】:2018-08-17 02:29:07
【问题描述】:

我在将 C# 中的 byte[] 转换为 Objective-C 中的某种数据类型时遇到了这个问题。如果是 C# 中的 byte[],那么在 Obj-C 中应该是什么; const char、unsigned char、NSMutableData、NSMutableArray 等......无论它采用何种数组格式,它都需要具有 NSMutableData 所具有的某种 .Length 属性,但在这篇文章中似乎可以找到直接的一对一转换:@987654321 @

在 C# 加密过程中最终有超过 10 种方法可能需要复制以解密通过 SOAP Web 服务 XML 属性发送的密码。这在一般情况下是可能的吗?获取在 C# 中使用 SHA 哈希加密然后通过 Objective-C 解密的密码?

因反对票而编辑

使编辑更加清晰,但是我不会在 SO 上“发布我的加密逻辑”,所以我试图解释这些步骤而不解释这些步骤??

基本上 pw 字符串被 AES128 加密然后这个然后那个,但我的基本问题仍然存在;如果 Obj-C 方法以确切的顺序模仿 C# 方法,其中包括使用密钥和散列的 iv 的解密逻辑,那在 C# 端工作,这在理论上可行吗?还是说这不可能?

试图弄清楚我是否需​​要从 C# dll 将 dyLib 导入我的项目...

【问题讨论】:

  • ...was encrypted in C# using SHA hashing 散列与加密不同。散列是一种方式,不能逆转。
  • @Plutonix 我可以改写为更清楚,并包括在 C# 端完成的一般转换.. 哈希上有 sha512 和 sha256 散列和 aes128 加密.. 你甚至在我得到一个编辑的机会!给我一个改变投票的机会,我们可以找出一些有趣的东西
  • 我引用的那句话3小时后还在帖子里,所以我评论的时间无关紧要。另外,不是我的 DV - 您是在询问如何让两段代码一起工作,而没有显示其中任何一个可能是它们的原因......或者可能是散列与加密相同的概念(不知道)。
  • however I'm not going to "post my encryption logic" on SO 我们无法修复我们看不到的代码。特别是如果它是散列,发布它真的没有任何危险。如果它是一个“密码字符串”,当然应该被散列和加盐(未加密),因此很难撤消它。
  • 关于你所说的拒绝发布加密逻辑,你应该熟悉一下 Kerckhoff 的原则,en.wikipedia.org/wiki/Kerckhoffs%27s_principle

标签: c# ios objective-c encryption


【解决方案1】:

如果它以确切的顺序模仿 C# 方法,其中包括带有密钥和散列的 iv 的解密逻辑,这在 C# 端确实有效,那么这可能永远无法工作吗?

假设您的意思是“可以工作”,那么答案是肯定的,您的 C# 代码几乎没有您无法在 Objective-C 中编写的代码。因此,如果您在 C# 中获得了解密算法,那么在 Objective-C(以及许多其他语言)中实现它应该不会太难。

我在将 C# 中的 byte[] 转换为 Objective-C 中的某种数据类型时遇到了这个问题。如果是 C# 中的 byte[],那么在 Obj-C 中应该是什么; const char、unsigned char、NSMutableData、NSMutableArray 等...

这是您的关键问题,在 Obj-C 中为您的算法选择最佳类型。您的 C# byte[] 是一个 value 数组,Objective-C 具有来自 C 的值数组和对象数组/集合(NSArrayNSData)。

如果您选择一个值数组(比如unsigned char [] 或通过引用unsigned char *),您需要管理内存生命周期和释放 - 在 (Objective-)C 中,值数组不是通过值传递,而是通过引用传递。但是索引操作是直接的。

如果您选择一个 Objective-C 集合(NSArrayNSData 等),则生命周期和释放由 ARC 处理。但是,索引操作需要调用,并且不如您在算法的 C# 实现中使用的灵活。这可能很重要,也可能无关紧要 - 这将取决于算法。

有一个中间点。您可以分配一个 C 样式的字节缓冲区,然后将其包装为 NSMutableData,将内存管理的责任移交给 ARC。然后,您可以将 unsigned char * 恢复到包装的字节并处理掉。

您需要在这些选项之间进行选择,具体取决于字节如何到达您的程序以及您的算法需要如何操作它们。但总的来说,简单的答案是,如果你有一个用 C# 实现的算法,你可以在 Objective-C 中以类似的容易/困难来实现。

HTH

【讨论】:

  • example codeNSData 有一个 dataWithBytes:length: 方法来从字节创建一个 NSData 对象。
  • 感谢 CRD 和 @zaph .. 正是我想要的! Zaph,我已经在使用该代码,但它具有: kCCOptionECBMode|kCCOptionPKCS7Padding ... C# 端是 aes.Mode = CipherMode.CBC;在所有数据类型转换问题之前让我挂断了..感谢您阅读问题并理解关键问题,这可能吗?!这个解释完我会想办法的
  • 去掉kCCOptionECBMode,Common Crypto CCCrypt 默认模式是CBC模式。
【解决方案2】:

正如@Plutonix 所说,散列不是加密。散列的主要目标是不应该反转散列。您可以使用rainbow tables 尝试获取原始值。

Here 是一个彩虹表列表,您可以在其中找到 SHA。

【讨论】:

    猜你喜欢
    • 2016-03-19
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    相关资源
    最近更新 更多