首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获取BouncyCastle加密报文的报文认证码

如何获取BouncyCastle加密报文的报文认证码
EN

Stack Overflow用户
提问于 2011-01-19 04:04:41
回答 3查看 1.9K关注 0票数 2

我加密了一些文本,如下所示:

代码语言:javascript
复制
Cipher in = Cipher.getInstance("AES/CCM/NoPadding", "BC");
in.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(_nonce));
encoded = in.doFinal(payload);

效果很好。我想获得MAC,所以我尝试这样做:

代码语言:javascript
复制
byte[] K = Hex.decode(bek.getBytes());
Key key = new SecretKeySpec(K, "AES");
Mac mac = Mac.getInstance("AES/CCM/NoPadding", "BC");

但是得到一个“没有这样的算法:AES/CCM/”。

那么,使用什么算法从AES/CCM加密消息中提取MAC?谢谢!

EN

回答 3

Stack Overflow用户

发布于 2011-01-19 05:18:08

CCM模式意味着使用AES的CBC块密码MAC,所以这是你应该使用的算法,但我自己没有写过使用它的代码。我知道BouncyCastle使用CBCBlockCipherMac类实现了这一点,但我不能100%确定正确的算法名称,但查看源代码,它似乎是"AESMac“(默认情况下使用CBC模式和补零)。

票数 1
EN

Stack Overflow用户

发布于 2016-07-11 11:42:15

是的,密码文本中存在身份验证标签(Mac)。如果在处理过程中使用了n位的mac,那么密码文本中的最后n位就是mac。

你也可以通过代码找到它

代码语言:javascript
复制
 CCMBlockCipher cipher = new CCMBlockCipher(engine);
    cipher.init(true, params);
    byte[] outputText = new byte[cipher.getOutputSize(inputData.length)];
    int outputLen = cipher.processBytes(inputData, 0, inputData.length,
            inputData, 0);
    cipher.doFinal(outputText, outputLen);
//this is your mac
cipher.getMac();
票数 1
EN

Stack Overflow用户

发布于 2011-01-20 12:12:34

您不能使用JCE来提取MAC,它根本不受支持。您必须直接使用Bouncycastle加密API。类CCMBlockCipher有一个getMac方法来检索Mac字节。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4728472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档