当前位置:编程学习 > JAVA >>

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

//调用如下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");
}

求高人指点,谢谢。 --------------------编程问答--------------------
引用
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBEWITHSHA256AND128BITAES-CBC-BC");
中的参数PBEWITHSHA256AND128BITAES-CBC-BC不是秘密密钥算法的标准名称。标准名称可以查看jdk帮助文档。 --------------------编程问答-------------------- for (Object obj : java.security.Security.getAlgorithms("Cipher")) {
  System.out.println(obj);
}
//用上面的代码打印系统算法时显示包含了上面的算法。 --------------------编程问答--------------------
引用 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 --------------------编程问答-------------------- 你看方便帮我试验一下其他算法看可以成功运行不?
我这里显示有的。
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
--------------------编程问答-------------------- 除了我贴出的那些,其他的都不行 --------------------编程问答-------------------- 你贴出的那些算法我这里也提示错误,不知为何故。 --------------------编程问答-------------------- 你把
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBEWITHSHA256AND128BITAES-CBC-BC");
改成
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBEWITHSHA256AND128BITAES-CBC-BC", "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", "BC");
后报错如下:

JCE cannot authenticate the provider BC
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,