SecretKeyFactory.getInstance 出错,求高人指点。

fullisnull 2013-07-03 02:13:39
//调用如下PBEWithMD5AndDES算法正常
try
{
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
}
catch(Exception ex)
{
System.out.printf("\n SecretKeyFactory.getInstance" + ex.getMessage().toString() + "\n");
}

//但是调用如下一些算法则都会失败
try
{
//PBEWITHSHAAND192BITAES-CBC-BC PBEWITHSHAAND40BITRC4
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBEWITHSHA256AND128BITAES-CBC-BC");
}
catch(Exception ex)
{
System.out.printf("\n SecretKeyFactory.getInstance" + ex.getMessage().toString() + "\n");
}

求高人指点,谢谢。
...全文
693 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
fullisnull 2013-07-07
  • 打赏
  • 举报
回复
改成 SecretKeyFactory skf = SecretKeyFactory.getInstance("PBEWITHSHA256AND128BITAES-CBC-BC", "BC"); 后报错如下: JCE cannot authenticate the provider BC
  • 打赏
  • 举报
回复
你的算法列表中有输出“PBEWITHSHA256AND128BITAES-CBC-BC”,那表示 JCE 的扩展 BouncyCastle 的类库已经加到 Security Provider 中去了,使用的时候只需要在 SecretKeyFactory.getInstance 的第二个参数中指定 BouncyCastle 的别名“BC”就可以了。 如果算法列表中根本就没有这个算法,那需要把 BouncryCastle 相关的 jar (bcprov-jdk16-1.46.jar)放到 classpath 下,然后某个类的静态块中写上这么一句: Security.addProvider(new BouncyCastleProvider()); 注意,这个最好只加载一次,所以放静态块中。 还有一种方法是直接在 JRE 中配置 JCE 的 Provider,不过我不推荐使用这种,这里就不说了。
  • 打赏
  • 举报
回复
你把 SecretKeyFactory skf = SecretKeyFactory.getInstance("PBEWITHSHA256AND128BITAES-CBC-BC"); 改成 SecretKeyFactory skf = SecretKeyFactory.getInstance("PBEWITHSHA256AND128BITAES-CBC-BC", "BC"); 再试试看
fullisnull 2013-07-03
  • 打赏
  • 举报
回复
你贴出的那些算法我这里也提示错误,不知为何故。
my_panpan 2013-07-03
  • 打赏
  • 举报
回复
除了我贴出的那些,其他的都不行
fullisnull 2013-07-03
  • 打赏
  • 举报
回复
你看方便帮我试验一下其他算法看可以成功运行不? 我这里显示有的。 PBEWITHSHAAND192BITAES-CBC-BC PBEWITHSHAAND40BITRC4 2.16.840.1.101.3.4.1.42 2.16.840.1.101.3.4.1.43 2.16.840.1.101.3.4.1.44 AESRFC3211WRAP NOEKEON ARCFOUR PBEWITHMD5ANDTRIPLEDES ELGAMAL CAST6 CAST5 2.16.840.1.101.3.4.1.41 RSA/RAW PBEWITHMD5AND128BITAES-CBC-OPENSSL PBEWITHMD5AND256BITAES-CBC-OPENSSL RSA/PKCS1 BROKENIES PBEWITHSHA256AND128BITAES-CBC-BC BROKENPBEWITHMD5ANDDES GOST28147 SEEDWRAP 2.16.840.1.101.3.4.1.3 IES 2.16.840.1.101.3.4.1.2 2.16.840.1.101.3.4.1.4 2.16.840.1.101.3.4.1.1 SERPENT 1.2.840.113533.7.66.10 PBEWITHSHAAND128BITRC2-CBC PBEWITHSHAAND128BITAES-CBC-BC BROKENPBEWITHSHAAND2-KEYTRIPLEDES-CBC 1.3.14.3.2.7 1.2.840.113549.1.9.16.3.6 1.2.840.113549.1.9.16.3.7 PBEWITHSHA256AND192BITAES-CBC-BC TEA ELGAMAL/PKCS1 PBEWITHSHAAND2-KEYTRIPLEDES-CBC HC256 RSA/1 RSA/2 OLDPBEWITHSHAANDTWOFISH-CBC 1.2.840.113549.1.1.7 PBEWITHSHA256AND256BITAES-CBC-BC 1.2.840.113549.1.1.1 1.2.392.200011.61.1.1.1.2 RC2 1.2.392.200011.61.1.1.1.4 1.2.392.200011.61.1.1.1.3 RC5 RC6 PBEWITHSHAAND40BITRC2-CBC BROKENPBEWITHSHA1ANDDES DES AES DESEDEWRAP PBEWITHSHAAND256BITAES-CBC-BC GRAINV1 VMPC-KSA3 CAMELLIA BLOWFISH PBEWITHSHA1ANDRC2 ARC4 RSA PBEWITHSHAAND3-KEYTRIPLEDES-CBC DESEDE PBEWITHSHAANDTWOFISH-CBC 1.2.410.200004.1.4 RC2WRAP HC128 GRAIN128 BROKENPBEWITHSHAAND3-KEYTRIPLEDES-CBC RIJNDAEL CAMELLIARFC3211WRAP 2.5.8.1.1 BROKENECIES SALSA20 OLDPBEWITHSHAAND3-KEYTRIPLEDES-CBC PBEWITHSHA1ANDDESEDE SKIPJACK AESWRAP PBEWITHSHA1ANDDES ECIES 1.2.643.2.2.21 SEED DESEDERFC3211WRAP PBEWITHSHA1ANDRC2_40 XTEA RSA/OAEP PBEWITHMD5AND192BITAES-CBC-OPENSSL PBEWITHMD5ANDDES VMPC 1.3.6.1.4.1.3029.1.2 CAMELLIAWRAP PBEWITHSHAAND128BITRC4 RC5-64 1.2.840.113549.3.7 RSA/ECB/PKCS1PADDING RSA/ISO9796-1 2.16.840.1.101.3.4.1.24 TWOFISH 2.16.840.1.101.3.4.1.23 2.16.840.1.101.3.4.1.22 PBEWITHMD5ANDRC2 2.16.840.1.101.3.4.1.21 1.2.840.113549.3.2
my_panpan 2013-07-03
  • 打赏
  • 举报
回复
引用 2 楼 fullisnull 的回复:
for (Object obj : java.security.Security.getAlgorithms("Cipher")) { System.out.println(obj); } //用上面的代码打印系统算法时显示包含了上面的算法。
这段程序的执行结果是 BLOWFISH ARCFOUR PBEWITHMD5ANDDES RC2 RSA PBEWITHMD5ANDTRIPLEDES PBEWITHSHA1ANDDESEDE DESEDE AESWRAP AES DES DESEDEWRAP RSA/ECB/PKCS1PADDING PBEWITHSHA1ANDRC2_40 没有PBEWITHSHA256AND128BITAES-CBC-BC
fullisnull 2013-07-03
  • 打赏
  • 举报
回复
for (Object obj : java.security.Security.getAlgorithms("Cipher")) { System.out.println(obj); } //用上面的代码打印系统算法时显示包含了上面的算法。
my_panpan 2013-07-03
  • 打赏
  • 举报
回复
引用
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBEWITHSHA256AND128BITAES-CBC-BC");
中的参数PBEWITHSHA256AND128BITAES-CBC-BC不是秘密密钥算法的标准名称。标准名称可以查看jdk帮助文档。
本代码是C#方法,通过开源C#BouncyCastle加密组件进行DES加解密。和JAVA DES加解密互通。JAVA方法如下: public static String desEncrypt(String source, String desKey) throws Exception { try { // 从原始密匙数据创建DESKeySpec对象 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); SecretKey securekey = keyFactory.generateSecret(new DESKeySpec(desKey.getBytes())); // Cipher对象实际完成加密操作 Cipher cipher = Cipher.getInstance("DES"); // 用密匙初始化Cipher对象 cipher.init(Cipher.ENCRYPT_MODE, securekey); // 现在,获取数据并加密 byte[] destBytes = cipher.doFinal(source.getBytes()); StringBuilder hexRetSB = new StringBuilder(); for (byte b : destBytes) { String hexString = Integer.toHexString(0x00ff & b); hexRetSB.append(hexString.length() == 1 ? 0 : "").append(hexString); } return hexRetSB.toString(); } catch (Exception e) { throw new Exception("DES加密发生错误", e); } } public static String desDecrypt(String source, String desKey) throws Exception { // 解密数据 byte[] sourceBytes = new byte[source.length() / 2]; for (int i = 0; i < sourceBytes.length; i++) { sourceBytes[i] = (byte) Integer.parseInt(source.substring(i * 2, i * 2 + 2), 16); } try { SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); SecretKey securekey = keyFactory.generateSecret(new DESKeySpec(desKey.getBytes())); Cipher cipher = Cipher.getInstance("DES"); // 用密匙初始化Cipher对象 cipher.init(Cipher.DECRYPT_MODE, securekey); // 现在,获取数据并解密 byte[] destBytes = cipher.doFinal(sourceBytes); return new String(destBytes); } catch (Exception e) { throw new Exception("DES解密发生错误", e); } }

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧