使用AES 256和SHA-2进行加密

时间:2018-08-01 21:22:07

标签: java encryption

我遇到的情况是,我需要首先使用已经提供的公共密钥和矢量对消息进行加密。另外,根据要求,我还需要使用SHA-2。现在,我假设我需要对加密的消息进行哈希处理然后再发送到服务器。我有两个与此有关的问题 1.哈希加密的消息是否明智?另外,将加密的消息和哈希值发送到服务器是否是一个好主意? 2.我在互联网上做了很多搜索,但是每当我尝试获得一些一起使用AES 256和SHA-2的示例时,我实际上找到了解释两者之间差异的地方。可以帮我一些示例代码吗?

预先感谢!

1 个答案:

答案 0 :(得分:1)

让我们先分解一下东西。


公钥密码学

允许给定对( Kpriv Kpub )用于密码来加密和解密数据。 用 Kpriv 加密的任何数据只能用 Kpub 解密,而用 Kpub 加密的任何数据只能用 Kpriv 解密>。

RSA 是一个很好的众所周知的公钥密码示例。

非对称密码学需要非常大的密钥才能确保安全,因此执行极其会很慢!绝对不要使用非对称密钥加密技术来加密大量数据。不过,您可以在连接开始时使用它来交换对称密钥 Ks


对称密钥密码学

允许在密码中使用 Ks 来加密和解密数据。

对称密码的示例是 AES 。 AES实际上是如此通用,您可以更改许多参数,例如您提到的 Blocksize ,它们可以是128位,192位或256位。 AES256 是配置为256位块大小的AES密码。

块大小是针对提供的 Ks 进行实际加密所使用的大小。请注意,您的数据可以大于块大小(算法仍将起作用,它只是重复使用相同的 Ks )。只要在每个块上简单地重复使用密钥,就称为 ECB 模式,如果您的数据重复,则可以显示模式。另一种选择是使用 CBC CTR 之类的模式,这些模式还依赖于使用先前的块数据并对下一块数据进行XOR运算,以消除此类模式。应该使用哪种模式取决于您的数据。

请注意,根据您的密码模式,最终您将需要填充。我假设当您问这个问题时,您已经对这些术语非常熟悉。


按密码学保证的人

密码学确实可以确保加密数据是机密的,仅此而已。它不提供任何其他保证,例如数据是否真实或是否已被篡改。

尽管即使解密后篡改数据也很可能导致文本难以理解,但在密码学中,没有诸如无效明文之类的东西。因此,您需要某种机制来知道您的数据是否有效。

诸如 SHA 之类的安全哈希算法可以帮助您了解解密的数据是否有效。

但是,出于这些目的,通常不应直接使用Digest算法。尝试改为使用 MAC 。该MAC可以使用 SHA256 算法,但MAC和哈希值并不完全相同。


如何在实践中做到

如果您想要的只是机密性和篡改检测,则可以使用加密和摘要(或哈希)算法,如下所示:

E ks(SHA(data)|| data)

其中 E 是对称密码, ks 是共享对称密钥, SHA(data)是使用安全密码的数据摘要哈希算法, || 表示连接,而 data 是字节数组。

更安全的方法是: E ks(MAC mk(data)|| data)

其中 mk 是MAC的密钥。

现在,只需搜索如何“ java symetric cipher”和“ java hash byte array”,并使用上面所述的两者即可。