1 回答
TA贡献1776条经验 获得超12个赞
让我们先分解这些东西。
公钥密码学
允许给定对(Kpriv,Kpub)要在密码来加密和解密数据使用。与加密的任何数据Kpriv只能与解密Kpub和与加密的任何数据Kpub只能与解密Kpriv。
公钥密码的一个很好的和众所周知的例子是RSA。
非对称加密需要非常大的密钥才能确保安全,因此执行起来非常慢!您永远不应该使用非对称密钥加密来加密大量数据。不过,您可以在连接开始时使用它来交换对称密钥Ks。
对称密钥密码术
允许在密码上使用Ks来加密和解密数据。
对称密码的一个例子是AES。AES 实际上非常通用,您可以更改许多参数,例如(如您所提到的)Blocksize,它可以是 128、192 或 256 位。AES256是配置为 256 位块大小的 AES 密码。
块大小是针对提供的Ks用于执行实际加密的大小。请注意,您的数据可能大于块大小(该算法仍然有效,它只是重用相同的Ks)。简单地重复使用每个块的密钥称为ECB模式,如果您的数据重复,则可以揭示模式。另一种方法是使用CBC或CTR等模式,这些模式也依赖于使用前一个块数据并与下一个块数据进行异或,以消除此类模式。您应该使用哪种模式取决于您的数据。
请注意,根据您的密码模式,您最终将需要padding。我假设您在问这个问题时已经非常熟悉这些术语。
密码学保证
密码学确实保证加密的数据是机密的,但仅此而已。它不提供任何其他保证,例如数据是否真实或是否已被篡改。
虽然篡改数据很可能会在解密后导致无法理解的文本,但在密码学中,不存在无效明文这样的事情。因此,您需要某种机制来了解您的数据是否有效。
SHA等安全哈希算法可以帮助您了解解密后的数据是否有效。
但是,出于这些目的,您通常不应直接使用 Digest 算法。尝试改用MAC。该 MAC 可以使用SHA256算法,但 MAC 和哈希并不完全相同。
如何在实践中做到
如果您想要的只是机密性和篡改检测,您可以使用密码和摘要(或哈希)算法,如下所示:
E ks ( SHA(data) || data )
其中E是对称密码,ks是共享对称密钥,SHA(data)是使用安全散列算法的数据摘要,|| 意味着连接和数据是一个字节数组。
更安全的方法是: E ks ( MAC mk(data) || data )
其中mk是 MAC 的密钥。
现在只需搜索如何“java symetric cipher”和“java hash byte array”并使用我上面描述的两者。
添加回答
举报