iOS和Android之间的加密数据传输(ByteArray或Base64EncodedString兼容性问题)

时间:2018-03-05 08:00:10

标签: android ios encryption cryptography

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

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

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

  3. 此问题here中描述了几乎类似的情况。所以我想知道以下内容。

    1. 为什么某些数据(在iOS等特定平台上进行base64编码)在另一个平台(如Android)中进行解码时会有所不同。
    2. 为什么iOS无法在Android操作系统创建的ByteArray中成功读取。还是我弄错了?如果是这样,请指导我。
    3. 如何在iOS和Android之间成功传输数据,就像在这种情况下一样?我熟悉正常的数据传输,如图像或文件,但它只是在我的加密数据的情况下工作。我知道ProtoBuff,为了可行性,我更喜欢json或同样的。
    4. 添加一些可能有帮助的细节。

      1. iOS上生成的公钥
      2. The publickey generated at 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之间的符号差异。

          感谢任何帮助。 谢谢

        2. 编辑:在android上添加异常屏幕截图。 ScrrenShot

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

1 个答案:

答案 0 :(得分:0)

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

另外,后来的另一个项目,我在 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
    }
}