问题标签 [aes-gcm]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 在 AEAD GCM 模式下篡改 AES 加密缓冲区时不会抛出 AEADBadTagException
Java:甲骨文 jre1.8.0_45
提供者:BC,BouncyCastle v1.52
密码:AES 256 位密钥(已安装安全策略)
AEAD 模式:GCM
算法:AES/GCM/NoPadding
我使用上面显示的参数进行了完美的 AES 加密/解密。然后在我的调试过程中,我通过在解密前更改加密缓冲区中的数据添加了一个简单的篡改模拟。我预计会抛出 AEADBadTagException,但它没有发生。我还没有使用任何 upedateAAD(),我们谈论的是纯加密数据有效负载。
我像这样简单地进行篡改,在它已经包含加密数据和身份验证标签的 16 个额外字节之后,我覆盖了 byte[] 的第一个字节。
当我更改在模拟篡改时分配的值时,生成的解密文本在第一个字符处发生更改。它以非线性方式变化。0x65 产生一个“c”,而 0x67 产生一个“?” 等等。普通消息的其余部分保持正确,只有解密输出的第一个字符似乎受到影响。
我从 Cipher 类的标准 Java 8 文档中了解到,在 AEAD GCM 模式下,身份验证标签是在加密时创建的(这是因为我在最后附加的加密输出字节 [] 中看到它)并在解密时验证(并且我提供了完整的加密输出,包括 16 字节标签作为解密输入),如果标签不会验证该数据(包括我现在不使用但会使用的 AAD 数据),它将抛出 AEADBadTagException。在我的代码中它没有这样做。
我用 16 字节的倍数的数据以及不是的数据尝试了这个。两者的结果是相同的。如果使用相同的篡改 (0x67) 值,则纯文本输出中的第一个字母会在消息变长时发生变化,但这是有道理的。如果我在消息中添加一些字节使其不是 16 的倍数,则上述错误的第一个字符“c”变为“6”。在使用的 AES/GCM/NoPadding 中,长度无论如何都不能是 16 的倍数。
这是对文档的误解吗,是否需要调用其他方法来“启用”这种抛出行为(我可以找到任何方法),或者 BounceyCastle 没有抛出它(我知道提供者需要实现加密类 ISP 使得一切行为都如 Java 8 Docs Cipher 类中所述。
我无法与 SunJCE 提供程序进行比较,因为它不支持 AES/GCM/NoPadding。
有没有人有一些额外的信息。TIA
8 月 29 日更新:添加代码以显示相同的代码与 SunJCE 而不是与 BC 提供程序一起引发,作为评论中讨论的一部分。
上面的代码可以使用 SunJCE 或 BouncyCastle 运行,方法是在顶部取消标记所需的行。在 BC 中,这些代码运行并执行预期的操作。如果 SunJCE 提供者未加注释,则会引发错误:
类 java.security.InvalidAlgorithmParameterException:不支持的参数:javax.crypto.spec.IvParameterSpec@4fccd51b com.sun.crypto.provider.CipherCore.init (CipherCore.java:509) com.sun.crypto.provider.AESCipher.engineInit (AESCipher .java:339) javax.crypto.Cipher.init (Cipher.java:1394) javax.crypto.Cipher.init (Cipher.java:1327)
java - xws-security(webservices-rt)中的GCM加解密
我已经使用 JDK8 在 xws-security (EncryptionProcessor.java) 中成功实现了对 GCM 加密的支持,并针对其他系统进行了测试。但是我有解密问题。第一个问题如下java.security.InvalidAlgorithmParameterException: Unsupported parameter: javax.crypto.spec.IvParameterSpec。我通过将初始化向量 (iv) 从 IvParameterSpec() 更改为 GCMParameterSpec() 解决了这个问题,如下所示(来自 DecryptionProcessor.java 的代码片段)
我现在在调用 doFinal() 时出现以下错误
对此的任何建议/建议将不胜感激
ssl - openssl中的AES GCM非EVP实现?
openssl 是否有一个“原始”(非 EVP)接口来进行 AES GCM 加密和解密?我正在寻找与 AES_cbc_encrypt() 或 DES_ede3_cbc_encrypt() 相当的东西,但适用于 AES GCM。我找到了适用于 AES GCM 的 openssl EVP 接口,但我找不到关于任何非 EVP 接口的任何信息。
我知道 EVP 接口对于通用用途有很多优点,但我正在做一些测试,非 EVP 接口更容易使用。
java - 将密码套件 TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 添加到 Java 7
我想在 Java 7中使用TLSv1.2
with 。TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
我已经添加-Ddeployment.security.TLSv1.2=true
到 VM 参数中,我想知道如何添加上面提到的密码套件。
node.js - node.js 加密是否在 GCM 模式下使用固定标签大小?
我正在 node.js 中以 GCM 模式实施密码方案。
我必须将 GCM 标记附加/添加到密文以检查完整性。但是,我不确定标签会有多大!
在crypto++ wiki上,我读到大小可能会有所不同,它实际上是 GCM 模式的参数。引用维基,强调我的:
双方必须提供和使用的参数有:
- 密钥和密钥大小
- iv 和 iv 大小
- 标签尺寸
但是,在节点文档中,没有关于标签大小的内容。只是标签存在。从文档中引用:
cipher.getAuthTag()
对于经过身份验证的加密模式(当前支持:GCM),此方法返回一个 Buffer,表示已根据给定数据计算的身份验证标签。应该在使用 final 方法完成加密后调用!
我是否应该期望标签大小会有所不同并将标签大小与密文一起保存?或者我可以假设标签大小总是小于 128 位并在左边用零填充?
android - Android:在 android 中使用 GCM 模式进行 AES 加密和解密?
我正在尝试使用 AES 算法和 GCM 模式加密和解密字符串。
我的代码能够加密字符串,但我无法解密编码数据。
遵循的步骤:
- 创建密钥()
- 加密(字符串)
- 解密(encded_data);
我的代码:
创建密钥
加密:
解密:
错误日志:
java - 使用 AES 对称密钥生成令牌
我正在加密和解密身份验证令牌。我对安全性非常陌生。
我有几个问题谁能帮我
看起来在密钥库中我需要一个字符串(密码+盐)和其他属性,如别名、存储类型、密钥密码、存储密码。但是如果我只是创建一个(密码+盐)它会给我同样的安全级别
java - 如何使用 BouncyCastle 轻量级 API 在 GCM 密码中使用 AAD
在加密期间,为 MACing 添加 AAD 似乎只是使用AEADParameters
. 但我不清楚我以后在哪里可以得到这块 AAD。
我认为processAADBytes
这很可能是我正在寻找的东西。processAADBytes
说
如果实现支持它,这将是一个在线操作并且不会保留相关数据。
我对此感到困惑。我对这种方法有两种可能的解释:
- 这是加密时传入 AAD 的另一种方式(除了
AEADParameters
),AAD 不会与密文一起存储。 - 这是一种在解密期间验证 AAD 的方法。AAD(来自其他地方)需要在这里输入以进行 MAC 验证。
我曾期望找到像getAAD()
. 所以我猜这个密码根本不存储AAD和密文,只是对我们声称是AAD的数据提供MAC验证?
android - Android 中 AES 实现中可能出现的错误
我正在尝试在 Android 中实现 AES 加密,它使用密码短语来生成SecretKey
. 在使用 PBKDF2生成时,我将与byte[]
初始化向量相同的值传递给密码和盐值。SecretKey
每次需要加密/解密时,用户都会提供密码。
到目前为止,我只需要在我的数据库中加密一个值(如果这有什么不同的话)。
问题:
- 我想知道是否使用与
byte[]
IV 相同的盐和盐会削弱加密? - 除了 GCM 提供的数据完整性功能之外,是否有理由从 CBC 切换到 GCM?
- 我读过关于 CBC 容易受到 BEAST 攻击的信息,每条消息都使用新的随机 IV,如下所示,可以减轻 BEAST 攻击吗?
当前源代码:
java - Java 9 之前支持硬件加速的 AES GCM
我的用例涉及在 Java 中使用 AES 和 GCM 对 PB 级的大量敏感数据进行加密,我需要高吞吐量才能在合理的时间内完成该任务。
正如之前在这里询问和回答的那样,AES/GCM 在最新的 JDK 8 中仍然严重受损(在我的硬件上约为17MB/s )。我很高兴知道JEP 246为 GCM 添加了重要的硬件加速使其成为 Java 9 的路线图,但是在我撰写本文时,下一个主要 Java 版本的通用可用性已经推迟了一年多。
到目前为止,我发现最快的实现是 Bouncy Castle Provider,没有硬件加速和170MB/s 的吞吐量。我知道我的硬件通过运行原生库GnuTLS ( gnutls-cli --benchmark-ciphers ) 和OpenSSL ( openssl speed -evp aes-128-gcm ) 的基准来支持加速,对于 AES/两者的时钟速度都超过2GB/s GCM。不幸的是,我找不到围绕其中任何一个的当前 Java 包装器。我遇到的最接近的是Apache JuiCE,它建立在 OpenSSL 之上,但它在 8 年前就被废弃了。
有没有人遇到过支持 AES/GCM 硬件加速的 JCE 提供程序,我可以在短期内使用它,无论是商业的还是开源的?