这个问题可能是问题here的可能重复,但我需要更多关于这个问题的信息。我的伙伴(android)和我(ios)正在尝试交换一些数据,这是一个身份密钥。该密钥通过信号协议的curve25519包装器生成。密钥由公共密钥和私钥组成。密钥的类型为here as ECKeyPair。现在我想将publicKey作为NSData彼此传输,将iOS读取到Android,反之亦然。所采取的方法和由此产生的问题列在下面。
从iOS,尝试将数据(publicKey)作为base64编码的字符串并使用json序列化传输到Android,但android无法正确解码base64字符串。我觉得它是因为在将密钥转换为base64时,数据大小会以某种方式改变,例如,当我打印数据时,大小总是超过它应该的32个字节。检查数据验证的算法拒绝来自Android实现中的公钥,说明该密钥的有效数据。
尝试通过强制转换为ByteArray将公钥从Android传输到iOS。从Android创建的字节数组由签名整数组成,我无法调用Data(bytes: <Array<UInt8>>)
,因为它适用于无符号整数。当我尝试将其转换为签名的整数时,它会导致类似的有效性检查失败,就像上面提到的那样。
此问题here中描述了几乎类似的情况。所以我想知道以下内容。
添加一些可能有帮助的细节。
答案 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
}
}