//调用如下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");
}求高人指点,谢谢。

解决方案 »

  1.   

    中的参数PBEWITHSHA256AND128BITAES-CBC-BC不是秘密密钥算法的标准名称。标准名称可以查看jdk帮助文档。
      

  2.   

    for (Object obj : java.security.Security.getAlgorithms("Cipher")) {
      System.out.println(obj);
    }
    //用上面的代码打印系统算法时显示包含了上面的算法。
      

  3.   


    这段程序的执行结果是
    BLOWFISH
    ARCFOUR
    PBEWITHMD5ANDDES
    RC2
    RSA
    PBEWITHMD5ANDTRIPLEDES
    PBEWITHSHA1ANDDESEDE
    DESEDE
    AESWRAP
    AES
    DES
    DESEDEWRAP
    RSA/ECB/PKCS1PADDING
    PBEWITHSHA1ANDRC2_40没有PBEWITHSHA256AND128BITAES-CBC-BC
      

  4.   

    你看方便帮我试验一下其他算法看可以成功运行不?
    我这里显示有的。
    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
      

  5.   

    你把
    SecretKeyFactory skf = SecretKeyFactory.getInstance("PBEWITHSHA256AND128BITAES-CBC-BC");
    改成
    SecretKeyFactory skf = SecretKeyFactory.getInstance("PBEWITHSHA256AND128BITAES-CBC-BC", "BC");再试试看
      

  6.   

    你的算法列表中有输出“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,不过我不推荐使用这种,这里就不说了。
      

  7.   

    改成
    SecretKeyFactory skf = SecretKeyFactory.getInstance("PBEWITHSHA256AND128BITAES-CBC-BC", "BC");
    后报错如下:JCE cannot authenticate the provider BC