获得org.bouncycastle.jcajce.provider.symmetric.util.baseblockcipher$1:nonce在解密字节时必须具有7到13个八位字节的长度

vtwuwzda  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(693)

下面是我解密一些base64编码字符串(或者是字节数组)的代码:

IvParameterSpec ivParameterSpec = new IvParameterSpec("randombigrandom".getBytes("UTF-8"));
        bytes = key.getBytes("UTF-8");
        keySpec = new SecretKeySpec(bytes, "AES");
        cipher = Cipher.getInstance("AES/CCM/NOPADDING", new BouncyCastleProvider());
        cipher.init(Cipher.DECRYPT_MODE, keySpec, ivParameterSpec);
        ret = ByteBuffer.wrap(cipher.doFinal(Base64Utils.decode(requestBody.getEncryptedData().getBytes())));

我使用aes/ccm,因为我们使用默认使用aes/ccm的ble(bluetooth low energy)设备。我有个例外:

org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher$1: nonce must have length from 7 to 13 octets
at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineInit(Unknown Source)

你知道怎么设置那个临时标志吗?

egmofgnx

egmofgnx1#

根据ietf rfc 3610——带cbc mac(ccm)的计数器,nonce n的长度必须为15-l个八位字节,其中l的范围为2-8个八位字节。l的建议值为8,因为消息长度l(m)受0<=l(m)<2^(8l)的限制,所以当l=8时,最大消息长度为2^64-1。
您为您的客户提供的价值 IvParameterSpecrandombigrandom ,即15字节。根据为消息选择的长度,此值必须介于7(15-8)和13(15-2)个八位字节之间。
当您从外部源接收加密数据时,nonce应该伴随着每个加密消息(不需要对nonce进行加密或保密,每个消息只有唯一的和不可预测的)。您应该填充 IvParameterSpec 在收到消息时使用提供的nonce(请阅读设备的规范以了解它是如何序列化消息的——它可能是请求正文中的一个单独字段,或者您可能需要按字节边界拆分加密的数据字段)。
应该明确指出,对于使用相同密钥加密的每条消息,必须使用唯一的nonce值。否则会破坏此模式的安全属性(作者的话)。使用不带计数器的静态nonce可以保证您发送的任何消息都会被破坏。

相关问题