问题是,在处理不同平台时,加密和解密时可以采用的最佳方法是什么。
据我所知,每当有人想要处理这种情况时,他/她就必须考虑某些事情。比如说,
当然,想要使用的加密/解密算法必须在两侧都相同,我想我可以对剩下的三件事说同样的话。
请告诉我在处理以下或类似情况时要遵循的步骤。
答案 0 :(得分:1)
如果您真的对互操作性感兴趣,请尝试并使用容器格式,例如CMS。它部署BER / DER编码的ASN.1,它是消息结构的二进制编码(类似于XML,它是消息的文本编码)。遗憾的是,并非所有平台都包含此类消息格式,但如果支持它们,您可以合理地确定它们可以对消息进行编码/解码。
PHP很棘手,它依赖于openssl包装器或可怕的mcrypt库。
答案 1 :(得分:0)
我会添加字节排序(小端与大端的数字)但是,只要你选择相同的算法(和参数)和数据格式,在一个平台上加密的内容应该可以在另一个平台上解密,反之亦然。例如,SSL就是今天的工作方式。
答案 2 :(得分:0)
良好互操作性的一个非常重要的方面是标准合规性。
良好的加密标准带有测试向量。如果两端实现相同的规范并且相关的测试用例已经过验证,那么他们成功交谈的可能性就会大大提高。
例如,假设您需要从密码派生AES密钥。如果您使用openssl,您可能会尝试使用常见的EVP_BytesToKey
函数。不幸的是,这不是一个标准的派生算法,如果在另一端你也没有openssl,你会发现自己陷入困境。使用像PBKDF2这样的标准会更好,因为大多数图书馆都有一个清晰,众所周知且广泛使用的规范(RFC2898)。
不幸的是,加密标准往往只关注基元,并且通常需要将几个标记移植到一起。 “嫁接”可能被证明是互操作性分崩离析的领域。出于这个原因,我建议使用尽可能广泛的标准化算法,即使是以一些额外的复杂性为代价。
例如,如果您想加密某些内容,最好选择标准的身份验证模式,例如CCM(在RFC3610中定义 - 除其他外)。您可以一次性获得以下功能的互操作性: