java.security.NoSuchAlgorithmException: SecretKeyFactory PBEWithMD5AndTripleDES not found

在Java项目中遇到加密错误'java.security.NoSuchAlgorithmException: SecretKeyFactoryPBEWithMD5AndTripleDESimplementation not found'。通过检查可用加密算法发现缺少所需算法。解决方案是引入sunjce_provider.jar到项目,并在代码中添加SunJCE提供者,从而成功使用PBEWithMD5AndTripleDES算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java.security.NoSuchAlgorithmException: SecretKeyFactory PBEWithMD5AndTripleDES implementation not found

最近项目中在进行加密是遇到个问题

SecretKeyFactory skf = SecretKeyFactory.getInstance
                    ("PBEWithMD5AndTripleDES");

执行以上代码时,报错:
org.jasypt.exceptions.EncryptionInitializationException: java.security.NoSuchAlgorithmException: SecretKeyFactory PBEWithMD5AndTripleDES implementation not found

执行查看遍历加密算法:

for(Object obj:java.security.Security.getAlgorithms("Cipher")){
        Log.e("加密",obj.toString());
 }

//打印结果
PBEWITHSHAAND192BITAES-CBC-BC
AES/CBC/PKCS5Padding
PBEWITHSHAAND40BITRC4
AES/CFB/NoPadding
DESEDE/CBC/NoPadding
PBEWITHSHAAND128BITRC2-CBC
PBEWITHSHA256AND256BITAES-CBC-BC
RSA/ECB/NoPadding
PBEWITHSHAAND128BITAES-CBC-BC
DESEDE/ECB/NoPadding
PBEWITHSHAAND40BITRC2-CBC
AES/ECB/PKCS5Padding
AES/OFB/PKCS5Padding
PBEWITHSHA1ANDDES
AESWRAP
AES/CBC/NoPadding
DES
AES
DESEDEWRAP
DESEDE/CFB/NoPadding
PBEWITHSHAAND256BITAES-CBC-BC
PBEWITHSHA256AND192BITAES-CBC-BC
PBEWITHMD5AND128BITAES-CBC-OPENSSL
AES/ECB/NoPadding
PBEWITHMD5AND256BITAES-CBC-OPENSSL
BLOWFISH
DESEDE/OFB/PKCS5Padding
DESEDE/OFB/NoPadding
PBEWITHSHA1ANDRC2
PBEWITHSHAAND2-KEYTRIPLEDES-CBC
PBEWITHMD5AND192BITAES-CBC-OPENSSL
ARC4
DESEDE/ECB/PKCS5Padding
DESEDE/CBC/PKCS5Padding
AES/CTR/NoPadding
PBEWITHMD5ANDDES
DESEDE/CFB/PKCS5Padding
RSA
PBEWITHSHA256AND128BITAES-CBC-BC
PBEWITHSHAAND3-KEYTRIPLEDES-CBC
DESEDE
PBEWITHSHAANDTWOFISH-CBC
PBEWITHSHAAND128BITRC4
RSA/ECB/PKCS1Padding
AES/OFB/NoPadding
AES/CFB/PKCS5Padding
PBEWITHMD5ANDRC2
AES/CTR/PKCS5Padding

打印发现没有PBEWithMD5AndTripleDES这个算法

经过一阵百度,最终终于解决了问题
在自己jdk目录下 (jdk1.8.0_73\jre\lib\ext\sunjce_provider.jar) 找到sunjce_provider.jar,将这个jar包放入自己项目libs,并添加依赖,并在代码中修改成以下代码

Class cryptoClass = Class.forName("com.sun.crypto.provider.SunJCE");

            Provider SunCrypto = (Provider) cryptoClass.newInstance();

            Security.insertProviderAt(SunCrypto, 1);

            SecretKeyFactory skf = SecretKeyFactory.getInstance
                    ("PBEWithMD5AndTripleDES", "SunJCE");

遍历加密算法结果会发现多了 PBEWithMD5AndTripleDES这个算法

......
 PBEWITHMD5ANDDES
 AES_192/OFB/NoPadding
 PBEWithHmacSHA256AndAES_256
 PBEWithMD5AndTripleDES
 PBEWithHmacSHA512AndAES_256
 AES_256/ECB/NoPadding
 PBEWITHSHAAND128BITRC4
 PBEWithMD5AndDES
 AES_192/CBC/NoPadding
 AES/CFB/PKCS5Padding
 PBEWITHMD5ANDRC2
 PBEWithSHA1AndRC4_40

再编译就大功告成了

<think>嗯,用户现在遇到了Java中的Ed25519 KeyFactory不可用的问题,也就是抛出`java.security.NoSuchAlgorithmException: Ed25519 KeyFactory not available`异常。根据用户提供的引用,他们之前可能已经尝试过类似问题的解决方案,比如添加Bouncy Castle库或者调整安全提供者配置。不过现在的问题具体是关于Ed25519算法的,所以需要结合之前的经验和当前问题来分析。 首先,用户的问题引用了两个之前的例子,一个是关于RSA签名不可用,另一个是PBEWithMD5AndDES的SecretKeyFactory不可用,这两个问题都是通过添加Bouncy Castle的jar包解决的。因此,用户可能已经尝试过添加Bouncy Castle,但可能版本不对或者配置有误。需要确认用户是否正确地添加了最新的Bouncy Castle依赖,并且正确注册了Provider。 接下来,用户提到在Linux环境下出现问题,而Windows下正常,这可能涉及到环境差异,比如JDK版本的不同,或者安全策略文件的配置不同。需要检查用户在不同环境下的JDK版本,是否都满足Ed25519的要求。Ed25519在JDK15及以上版本原生支持,如果用户使用的是较旧的JDK,可能需要强制使用Bouncy Castle的实现。 另外,用户可能没有正确指定Provider。比如在调用`KeyFactory.getInstance("Ed25519", "BC")`时,是否确实传入了"BC"作为Provider参数。如果Provider没有正确注册,或者名称拼写错误,也会导致找不到算法的情况。此外,用户可能未在`java.security`配置文件中添加Bouncy Castle作为安全提供者,或者添加的位置不正确,导致Provider加载顺序有问题。 还可能存在依赖冲突,比如项目中引入了多个不同版本的Bouncy Castle库,导致旧版本覆盖了新版本,从而缺少Ed25519的支持。需要检查依赖树,排除旧版本,确保使用支持Ed25519的最新版本,比如bcprov-jdk18on-1.77。 另外,模块化系统(JDK9+)的问题也可能导致Provider无法加载。用户可能在`module-info.java`中没有正确声明对Bouncy Castle模块的依赖,需要添加`requires org.bouncycastle.provider;`来确保模块系统能够访问到相关类。 总结下来,解决方案应包括以下几个步骤:验证JDK版本,添加正确的Bouncy Castle依赖,注册Provider,检查算法名称,配置安全策略文件,处理模块化系统,以及验证代码。同时,需要针对用户提到的Linux环境问题,特别检查环境变量和文件路径是否正确,确保Bouncy Castle的jar包被正确加载。</think>### Java中Ed25519 KeyFactory不可用问题的解决方案(含Bouncy Castle配置) #### 一、核心原因定位 当出现`java.security.NoSuchAlgorithmException: Ed25519 KeyFactory not available provider BC`时,表示**Bouncy Castle(BC)未正确提供Ed25519实现**。常见原因包括: 1. **BC版本过旧**:低于1.60的版本不支持Ed25519[^1] 2. **Provider未注册**:未通过`Security.addProvider()`动态添加或`java.security`静态配置 3. **模块依赖缺失**:JDK9+未声明模块依赖 4. **算法名称冲突**:未使用BC专属命名规范 #### 二、分步解决方案(针对BC提供者) ##### 1. 确认BC版本 必须使用**bcprov-jdk15on及以上版本**(推荐1.77): ```xml <!-- Maven示例 --> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk18on</artifactId> <version>1.77</version> </dependency> ``` ##### 2. 动态注册Provider ```java import org.bouncycastle.jce.provider.BouncyCastleProvider; // 在初始化代码中优先注册 static { if (Security.getProvider("BC") == null) { Security.insertProviderAt(new BouncyCastleProvider(), 1); // 设置为最高优先级 } } ``` ##### 3. 显式指定Provider名称 ```java // 必须明确指定BC作为提供者 KeyFactory kf = KeyFactory.getInstance("Ed25519", "BC"); KeyPairGenerator kpg = KeyPairGenerator.getInstance("Ed25519", "BC"); ``` ##### 4. 静态配置(适用于服务端) 修改`$JAVA_HOME/conf/security/java.security`文件: ```properties # 添加BC到安全提供者列表(数字表示优先级顺序) security.provider.1=org.bouncycastle.jce.provider.BouncyCastleProvider ``` ##### 5. 模块系统处理(JDK9+) 在`module-info.java`中添加: ```java requires org.bouncycastle.provider; ``` #### 三、验证代码模板 ```java public class Ed25519BCValidation { public static void main(String[] args) throws Exception { // 强制使用BC实现 KeyPairGenerator kpg = KeyPairGenerator.getInstance("Ed25519", "BC"); KeyPair kp = kpg.generateKeyPair(); Signature sig = Signature.getInstance("Ed25519", "BC"); sig.initSign(kp.getPrivate()); sig.update("test".getBytes()); byte[] signature = sig.sign(); System.out.println("Ed25519 with BC works! Signature length: " + signature.length); } } ``` #### 四、Linux环境特殊处理 若出现**Windows正常而Linux失败**的情况: 1. 检查JVM参数`-Djava.security.debug=provider` 2. 确认依赖路径权限: ```bash chmod 755 /path/to/bcprov-jdk18on-1.77.jar ``` 3. 使用`-cp`明确指定类路径: ```bash java -cp "libs/*:config" MainClass ``` #### 五、错误排查表 | 现象 | 解决方案 | |-------|---------| | `NoSuchProviderException: BC` | 检查JAR是否在classpath | | `AlgorithmParameters not found` | 升级BC至1.60+ | | `invalid key format` | 确认使用`X.509`编码格式 | --相关问题-- 1. 如何验证Bouncy Castle是否成功加载Ed25519算法? 2. Ed25519在TLS/SSL协议中的应用场景是什么? 3. 为什么在JDK15+中仍需要手动配置Bouncy Castle?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值