以下是我们的关注/需求/问题列表:
>
填充:我们需要html" target="_blank">加密的数据并不总是128位的倍数,因此AES实现/模式应该添加填充,但仅在必要时添加。我以为普通的AES实现(如javax.crypto.cipher
提供的)不会做到这一点,但最初的测试表明它做到了。所以我猜填充需求本身并不是诉诸GCM而不是“普通”AES的理由。那是正确的吗?
身份验证:我们需要一种万无一失的方法来检测是否发生了数据损坏。但是,理想情况下,我们还希望检测何时尝试使用不正确的密钥进行解密。因此,我们希望能够区分这两种情况。我首先考虑GCM的原因是这个Stackoverflow问题,其中一个响应者似乎暗示可以使用AES-GCM进行这种区分,尽管他没有提供详细的解释(更不用说代码了)。
编辑:delnan有益地指出,没有“普通的AES”这回事。为了澄清,我的意思是使用Java内置的AES支持。
类似:cipher localCipher=cipher.getinstance(“AES”);
在2012年,答案是使用GCM,除非你有严重的兼容性问题。
GCM是一种经过身份验证的加密模式。它一次性地为您提供了机密性(加密)、完整性和身份验证(MAC)。
到目前为止,正常的操作模式是ECB(这是Java的默认模式)、CBC、CTR、OFB和其他一些模式。它们都只提供加密。然而,如果没有完整性,保密本身很少有用;我们必须以一种特殊的方式将这些经典模式与完整性检查结合起来。由于密码学很难正确,通常这种组合是不安全的,比必要的速度慢,甚至两者兼而有之。
认证:AES-GCM只接受一个AES密钥作为输入,而不是密码。它会告诉你AES密钥是否错误或有效载荷是否被篡改,但这些情况被视为一个。相反,您应该考虑使用适当的密钥派生算法,如PBKDF2或bcrypt,从密码派生AES密钥。我不认为总是可以判断密码是不正确的还是有效载荷被修改了,因为验证前者所必需的数据总是可能被破坏。您可以加密一个小的已知字符串(使用ECB AES),发送它,并使用它来验证密码是否正确。
最小化开销:在一天结束时,如果您想要身份验证,所有模式都会导致相同的开销(大约10-20字节)。除非您正在使用非常小的有效载荷,否则这一点可以忽略不计。
性能:GCM非常好,因为它是一个在线模式(不需要缓冲整个有效负载,所以内存更少),它是可并行的,每个明文块需要一个AES操作和一个Galois乘法。像欧洲央行这样的经典模式更快(每个块只有一个AES操作),但是--同样--你还必须考虑完整性逻辑,这可能最终比GMAC慢。
null 解密: 错误日志:
我已经使用OpenSSL AES-256-GCM加密了一个文件。由于aes-256-gcm不受命令行支持,我已经安装了LibreSSL,我可以使用下面的命令加密文件的数据。 openssl ENC-AES-256-GCM-K 616161616161616161616161616161616161616161616161616161616161616161-IV 768A5C31A97D5FE9-
我正在编写一个Java程序来解密TLS1.2会话,它使用密码。我使用Wireshark录制了一个测试会话。主秘已知。 这里我只需要客户机密钥,因为我想解密一个客户机->服务器包。我按照RFC扩展了服务器和客户端密钥以及IVs。 即兴: 我从salt创建AES-GCM nonce(=客户端写IV)和显式nonce(=加密数据的前8字节)。 代码: 现在我把所有东西都输入到BouncyCastle中:
来加密Android(Java)应用程序中的数据。SonarQube的文件指出: 高级加密标准(AES)加密算法可用于各种模式。没有填充的伽罗瓦/计数器模式(GCM)应优先于以下不安全的组合: 电子码本(ECB)模式:在给定的密钥下,任何给定的明文块总是被加密到相同的密文块。因此,它不能很好地隐藏数据模式。在某些意义上,它不能提供严重的消息保密性,因此根本不建议在密码协议中使用它。 带有PKCS#
我正在尝试加密服务器上发送的语音文件。我使用以下过程: 将语音记录到文件>将文件转换为字节数组>用生成的密钥加密字节数组>将密钥保存到字符串>上载字节数组>从服务器加载文件>将其转换为字节数组>用生成的密钥解密<--这里,我得到一个错误
我使用AES方法对从txt文件调用的sentance进行加密。我使用了GCM模式并创建了一个特定的密钥。一切都在工作(代码如下)。 我尝试实现解密过程,也就是说,我只有密钥(HexMyKeyvalue)和加密消息(HexEncryptedOriginalMessage value)并且我想对其进行解密。但问题是我错过了一些东西... 我写了下面的代码,但我有错误消息。 TypeError:decr