【问题标题】:Java cipher update vs IOS CommonCrypto updateJava 密码更新与 IOS CommonCrypto 更新
【发布时间】:2016-10-20 02:32:39
【问题描述】:

我正在开发适用于 Android 和 IOS 的应用程序

对于 android,我使用“AES/CBC/NoPadding”密码,而对于 IOS,我使用具有与 Android 相同算法/模式/填充的 CommonCrypto

我正在使用公共密钥初始化密码,以便在两个平台上获得相同的结果

在 Android 中,我使用 cipher.update(inpBuf, inpOffset, inpLen, outBuf, outOffset) 进行加密/解密,就像我想在 IOS 中那样。

我在IOS中试过CCCryptorUpdate,结果数组是[0,0,0......0]

请指导我,哪里出错了?

【问题讨论】:

  • 除非您要加密的数据总是是块大小(AES 为 16 字节)的倍数,否则您需要添加填充。这可以手动完成(不建议)或使用提供的填充选项,例如 PKCS#7(née PKCS#5)。

标签: java objective-c swift encryption commoncrypto


【解决方案1】:

AES 是一种以 16 字节为单位对数据进行加密的分组密码。调用update() 时,所有16 字节的块都将被加密,任何多余的字节都将等待下一次update() 调用。当没有更多数据需要加密时,您使用 doFinal() 完成加密,该 doFinal() 刷新最后一个块 + 并应用所需的任何填充。你为什么使用 NoPadding?您是否确保自己的数据与 AES 的块大小匹配?

在 IOS 中解密时,您使用对应的 CCCryptorUpdate()CCCryptorFinal()。只有在CCCryptorFinal() 之后,您才能获得完整的解密消息。 CCCryptorUpdate() 可能会或可能不会返回数据,具体取决于缓冲区中滞留的数量等。

【讨论】:

  • 还有one-shot CCCrypt函数可以用来代替CCCryptorCreateCCCryptorUpdate()CCCryptorFinal()CCCryptorRelease调用。
猜你喜欢
  • 2018-08-06
  • 2023-03-31
  • 2016-03-13
  • 2020-04-27
  • 2021-02-09
  • 2019-11-30
  • 2014-07-26
  • 1970-01-01
  • 2013-10-11
相关资源
最近更新 更多