可能是转义的时候出的问题
因为我
public static void bcHmacMD5() {
HMac hmac = new HMac(new MD5Digest());
hmac.init(new KeyParameter(org.bouncycastle.util.encoders.Hex.decode("")));
hmac.update(src.getBytes(), 0, src.getBytes().length);
// 执行摘要
byte[] hmacMD5Bytes = new byte[hmac.getMacSize()];
hmac.doFinal(hmacMD5Bytes, 0);
System.out.println(" bc hmacMD5:" + org.bouncycastle.util.encoders.Hex.toHexString(hmacMD5Bytes));
}
得到的结果: bc hmacMD5:b87f98c51d1df76cfb5348c5619ad14f
与一样
另外在测试这个页面的时候发现"aaaaaaaaaaaa"也可以作为密钥
可能是为了防止报错,那个页面的算法为了解析密钥的时候还将密钥中的元素全部进行转义了一遍
老师只是提供了你一种学习的思路,但是实际运用过程中,很多知识还是要自己去总结的
一个byte是八比特,new String时按照byte的值到字符表中找对应的字符来生成字符串。Hex.byteArrayToString是把一个byte变成两个十六进制的英文与数字组合,内容当然就不会一样。
不一定是10个,key的元素个数是偶数就行。
以下是CC的Hex.decodeHex()方法的文档注释:
BC报这个异常的原因应该类似。
还原密钥的说法是不是不准确啊?我觉得是这样的:
在使用Secretkey是,可以用系统生成的密钥:
KeyGenerator keyGen = KeyGenerator.getInstance("HmacMD5");//指定生成密钥所使用的算法
SecretKey key = keyGen.generateKey();//生成一个密钥,这里生成的密钥是符合算法的标准规范的密钥。如果不想麻烦也可以把字符串当作的密钥,就像老师代码中的十个a。有了这个key就可以保证以下代码生成的密钥是准确无误的了。
SecretKey mainKey = new SecretKeySpec(key.getEncoded(),"HmacMD5");//之前的key是生成mainKey的准备条件,而只有标准规范的key而不是指定的字符串可以更好生成符合标准要求的mainKey。
有了这个mainKey,那么这就可以完成其它步骤了。
KeyGenerator是生成指定算法密钥的密钥生成器,首先需要获取一个KeyGenerator实例,然后使用器generateKey()方法生成一个SecretKey实例,该实例是为了获取密钥,为了作为还原密钥操作时的参数.
这两种方法都可以创建key,第一种是jdk初始化一个密钥对象.第二个是通过还原密钥操作,生成一个符合HmacMD5规则的密钥对象.而第一种方法生成的密钥是作为生成第二种密钥时的参数.