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");
}

求高人指点,谢谢。
...全文
642 9 打赏 收藏 转发到动态 举报
写回复
用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); } }
DES对称分组密码系统 import java.security.spec.*; import javax.crypto.*; import javax.crypto.spec.*; class DES01 { private String strkey; private SecretKey skey=null; private String[] algo= {"DES/ECB/PKCS5Padding","DES/ECB/NoPadding","DES"}; public DES01(String key) { strkey=key; } public void keyGenerating() throws Exception { byte[] bkey=strkey.getBytes(); KeySpec ks = new DESKeySpec(bkey); SecretKeyFactory kf = SecretKeyFactory.getInstance("DES"); skey = kf.generateSecret(ks); } public static void main(String[] a) { DES01 des = new DES01("IAMASTUDENT"); des.test02("STUDENTWANGFENGLIMING"); } public byte[] Encripting(String plaintext,int i) throws Exception { byte[] bpt=plaintext.getBytes(); Cipher cf = Cipher.getInstance(algo[i]); if(skey==null)this.keyGenerating(); cf.init(Cipher.ENCRYPT_MODE,skey); byte[] bct = cf.doFinal(bpt); return bct; } public byte[] decripting(byte[] bct,int i) throws Exception { Cipher cf = Cipher.getInstance(algo[i]); if(skey==null)this.keyGenerating(); cf.init(Cipher.DECRYPT_MODE,skey); byte[] bpt = cf.doFinal(bct); return bpt; } public void test01(String mess) { try{ byte[] ct=this.Encripting(mess,0); byte[] pt=this.Decripting(ct,0); String ptt=new String(pt); System.out.println(ptt); }catch(Exception ex) { return; } } public void test02(String mess) { try{ //Encripting print("Plaintext to be encripted:"); print(mess); byte[] ct=this.Encripting(mess,0); //Exploiting the results print("Byte array of cipher:"); for(int i=0;i
文件加密解密算法(Java源码) java,file,算法,加密解密,java源码 package com.crypto.encrypt; import java.security.SecureRandom; import java.io.*; import javax.crypto.spec.DESKeySpec; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.Cipher; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.spec.InvalidKeySpecException; import javax.crypto.NoSuchPaddingException; import javax.crypto.BadPaddingException; import javax.crypto.IllegalBlockSizeException; import java.lang.reflect.Constructor; import java.security.spec.KeySpec; import java.lang.reflect.InvocationTargetException; public class EncryptData { private String keyfile=null; public EncryptData() { } public EncryptData(String keyfile) { this.keyfile=keyfile; } /** * 加密文件 * @param filename String 源路径 * @param filenamekey String 加密后的路径 */ public void createEncryptData(String filename,String filenamekey) throws IllegalStateException, IllegalBlockSizeException, BadPaddingException, NoSuchPaddingException, InvalidKeySpecException, NoSuchAlgorithmException, InvalidKeyException, IOException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, ClassNotFoundException, IllegalStateException, IllegalBlockSizeException, BadPaddingException, NoSuchPaddingException, InvalidKeySpecException, NoSuchAlgorithmException, InvalidKeyException, IOException { //验证keyfile if(keyfile==null || keyfile.equals("")) { throw new NullPointerException("无效的key文件路径"); } encryptData(filename,filenamekey); } /** * 加密类文件 * @param filename String 原始的类文件 * @param encryptfile String 加密后的类文件 * @throws IOException * @throws InvalidKeyException * @throws NoSuchAlgorithmException * @throws InvalidKeySpecException * @throws NoSuchPaddingException * @throws NoSuchAlgorithmException * @throws BadPaddingException * @throws IllegalBlockSizeException * @throws IllegalStateException */ private void encryptData(String filename,String encryptfile) throws IOException, InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException, IllegalStateException, ClassNotFoundException, SecurityException, NoSuchMethodException, InvocationTargetException, IllegalArgumentException, IllegalAccessException, InstantiationException { byte data[]=Util.readFile(filename); // 执行加密操作 byte encryptedClassData[] = getencryptData(data); // 保存加密后的文件,覆盖原有的类文件。 Util.writeFile(encryptedClassData,encryptfile); } /** * 直接获得加密数据 * @param bytes byte[] * @throws IllegalStateException * @throws IllegalBlockSizeException * @throws BadPaddingException * @throws InvalidKeyException * @throws NoSuchPaddingException * @throws InvalidKeySpecException * @throws NoSuchAlgorithmException * @throws InstantiationException * @throws IllegalAccessException * @throws IllegalArgumentException * @throws InvocationTargetException * @throws NoSuchMethodException * @throws SecurityException * @throws ClassNotFoundException * @throws IOException * @return byte[] */ public byte[] createEncryptData(byte[] bytes) throws IllegalStateException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException, NoSuchPaddingException, InvalidKeySpecException, NoSuchAlgorithmException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, ClassNotFoundException, IOException { bytes=getencryptData(bytes); return bytes; } private byte[] getencryptData(byte[] bytes) throws IOException, ClassNotFoundException, SecurityException, NoSuchMethodException, InvocationTargetException, IllegalArgumentException, IllegalAccessException, InstantiationException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, IllegalStateException { // 产生一个可信任的随机数源 SecureRandom sr = new SecureRandom(); //从密钥文件key Filename中得到密钥数据 byte[] rawKeyData = Util.readFile(keyfile); // 从原始密钥数据创建DESKeySpec对象 Class classkeyspec=Class.forName(Util.getValue("keyspec")); Constructor constructor = classkeyspec.getConstructor(new Class[]{byte[].class}); KeySpec dks = (KeySpec) constructor.newInstance(new Object[]{rawKeyData}); // 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(Util.getAlgorithm()); SecretKey key = keyFactory.generateSecret(dks); // Cipher对象实际完成加密操作 Cipher cipher = Cipher.getInstance(Util.getAlgorithm()); // 用密钥初始化Cipher对象 cipher.init(Cipher.ENCRYPT_MODE, key, sr); // 执行加密操作 bytes = cipher.doFinal(bytes); // 返回字节数组 return bytes; } /** * 设置key文件路径 * @param keyfile String */ public void setKeyFile(String keyfile) { this.keyfile=keyfile; } }

62,614

社区成员

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

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