关注不同平台时,加密技术的最佳实践是什么?

时间:2012-09-05 04:34:45

标签: encryption cryptography

问题是,在处理不同平台时,加密和解密时可以采用的最佳方法是什么。

据我所知,每当有人想要处理这种情况时,他/她就必须考虑某些事情。比如说,

  1. 加密/解密算法
  2. 填充图案
  3. 双方字符编码
  4. 密钥和块大小
  5. 当然,想要使用的加密/解密算法必须在两侧都相同,我想我可以对剩下的三件事说同样的话。

    请告诉我在处理以下或类似情况时要遵循的步骤。

    1. 加密c&在java中解密
    2. 加密php&在java中解密

3 个答案:

答案 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中定义 - 除其他外)。您可以一次性获得以下功能的互操作性:

  • 加密
  • 验证
  • 填充
  • 交付IV