【问题标题】:Cryptographic data transfer between iOS and Android (ByteArray or Base64EncodedString Compatibility Issue)iOS 和 Android 之间的加密数据传输(ByteArray 或 Base64EncodedString 兼容性问题)
【发布时间】:2018-03-05 08:00:09
【问题描述】:

这个问题可能与问题here 重复,但我需要有关该主题的更多信息。我的伙伴(android)和我(ios)正在尝试交换一些数据,这是一个身份密钥。该密钥是通过 Signal Protocol 的 curve25519 包装器生成的。密钥由公钥和私钥组成。密钥是定义here as ECKeyPair 的类型。现在我想将 publicKey 作为 NSData 相互传输,将 iOS 读取到 Android,反之亦然。下面列出了所采取的方法和产生的问题。

  1. 在 iOS 中,尝试将 data(publicKey) 设为 base64 编码字符串并使用 json 序列化传输到 Android,但 android 无法正确解码 base64 字符串。我觉得这是因为在将密钥转换为 base64 时,数据大小以某种方式发生了变化,例如,当我打印数据时,大小总是超过它应该的 32 个字节。检查数据验证的算法拒绝来自 Android 实现中的公钥,说该密钥不是有效数据。

  2. 尝试通过转换为 ByteArray 将公钥从 Android 传输到 iOS。从 Android 创建的字节数组由有符号整数组成,我无法调用 Data(bytes: <Array<UInt8>>),因为它适用于无符号整数。当我尝试将其转换为有符号整数时,会导致类似于上述第一点的有效性检查失败。

这个问题here 中描述了一个几乎相似的场景。所以我想知道以下内容。

  1. 为什么某些数据在特定平台(如 iOS)中采用 base64 编码,但在其他平台(如 Android)中解码时会有所不同。
  2. 为什么 iOS 无法成功读取 Android 操作系统创建的 ByteArray。还是我弄错了?如果是这样,请指导我。
  3. 在这种特殊情况下,如何在 iOS 和 Android 之间成功传输数据?我熟悉像图像或文件这样的普通数据传输,但它只是不适用于我的加密数据。我知道 ProtoBuff,为了可行性,我更喜欢 json 或类似的。

添加一些可能有用的细节。

  1. iOS 生成的公钥

  1. Android 生成的公钥。

    [12,-55,99,72,15,-101,99,-13,99,-56,-47,19,-21,90,-17,-39,-119,-33, 44,-87,-18,-24,-53,-29,-100,34,-60,69,-61,24,8,92]。

    请注意 iOS 和 Android 之间的符号差异。

    感谢任何帮助。 谢谢你

编辑:在 android.xml 添加异常屏幕截图。

如您所见,数据被丢弃为 BadKey 类型。我通过 Base64Encoding 将数据从 iOS 传输到 Android 到字符串。

【问题讨论】:

  • 一篇文章有​​很多问题。你为什么不从一个问题开始?例如将字节数组从 Android 传输到 iOs?与加密或密钥无关的东西。
  • 我试图解释我的情况,以便更清楚。我的要求是,如果它将字节数组从 iOS 传输到 android,它还必须通过加密算法的验证。希望我很清楚。
  • 是的,你很清楚。你已经很清楚了。你看我的评论了吗?
  • 实际上,您根本不清楚,因为您没有提供有关问题所在的信息。说“...但是 android 无法正确解码 base64 字符串...”不是有用的信息。如果有错误消息,请将该消息与相关代码一起包含在内。如果出现异常,请包括完整的堆栈跟踪以及相关代码。我不了解 iOS,但 Android 上的 Java 类旨在与使用标准格式的其他平台进行互操作。
  • 我已经编辑了我的帖子,当我尝试调用类的构造函数时,在 Android 上添加了异常。它未能通过数据的验证检查。

标签: android ios encryption cryptography


【解决方案1】:

很长一段时间,但对于那个特定的场景,我使用了十六进制字符串。请注意,视频等大数据的十六进制字符串转换是不切实际的,因为它会冻结设备。

另外,在稍后的另一个项目中,我在 Android 和 iOS 之间实现了一个简单的加密。这些是我使用的。也许这会有所帮助。这些使用 base64 编码。

安卓加解密

val cryptor = AES256JNCryptor();
val password = "6dpC295ei9"
val text = yourString.toByteArray(charset("UTF-8"))
val encrypt =  cryptor.encryptData(text, password.toCharArray())  // your encryption
val encode = Base64.encodeToString(encrypt, Base64.NO_WRAP)  // encryptedtext


val decode = Base64.decode(encode, Base64.NO_WRAP)
val text = String(cryptor.decryptData(decode, password.toCharArray())) // your decryption

iOS加解密

let password = "6dpC295ei9"
extension String {
    var encrypted : String? {
        guard let plainData = data(using: .utf8) else {
            return nil
        }
        return RNCryptor.encrypt(data: plainData, withPassword: password).base64EncodedString(options: .init(rawValue: 0))
    }
    
    var decrypted : String? {
        guard let cipherData = Data.init(base64Encoded: self, options: .init(rawValue: 0)), let plainData = try? RNCryptor.decrypt(data: cipherData, withPassword: password), let plainText = String(bytes: plainData, encoding: .utf8) else {
            return "~ DECRYPTION FAILED ~"
        }
        return plainText
    }
}

【讨论】:

    猜你喜欢
    • 2017-08-10
    • 2011-01-06
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多