Eclipse中Cannot find any provider supporting DES解决之道

本文详细介绍了在Eclipse环境中遇到无法使用DES加密算法的异常问题,并提供了通过调整安装的JRE设置来解决该问题的步骤。包括通过窗口->首选项->Java->已安装的JREs菜单找到并修改默认JRE,以确保项目运行所需的加密支持。

原文出处:http://blog.youkuaiyun.com/darwinchina/article/details/12037999

异常:

Caused by: java.security.NoSuchAlgorithmException: Cannot find any provider supporting DES
	at javax.crypto.Cipher.getInstance(Cipher.java:524)

问题重现:

在Eclipse中运行下面的代码。(该异常会在IDE Eclipse运行中出现,但不会在控制台运行中出现)

public static void main(String[] args) throws Exception
{
	Cipher.getInstance("DES");
}


发生原因:

未知


解决方法:

Window-->Preferences-->Java-->Installed JREs

当前项目使用的JRE设置为是default JRE




解决方法来源:

https://bugs.eclipse.org/bugs/show_bug.cgi?id=89935

Java中遇到`Cannot find any provider supporting DESede/CBC/ZeroBytePadding`错误,通常是因为Java的安全提供者不支持该特定的加密转换。可以尝试以下几种解决方法: #### 添加Bouncy Castle安全提供者 Bouncy Castle是一个流行的Java加密库,支持多种加密算法和填充模式。可以通过以下步骤添加Bouncy Castle提供者: 1. **添加依赖**:如果使用Maven项目,可以在`pom.xml`文件中添加以下依赖: ```xml <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.70</version> </dependency> ``` 2. **在代码中注册提供者**:在使用加密算法之前,需要在代码中注册Bouncy Castle提供者: ```java import org.bouncycastle.jce.provider.BouncyCastleProvider; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESedeKeySpec; import javax.crypto.spec.IvParameterSpec; import java.nio.charset.StandardCharsets; import java.security.Security; import java.util.Base64; public class TripleDESCBCZeroBytePaddingExample { static { Security.addProvider(new BouncyCastleProvider()); } public static String encrypt(String plainText, String key, String iv) throws Exception { DESedeKeySpec desKeySpec = new DESedeKeySpec(key.getBytes(StandardCharsets.UTF_8)); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede"); SecretKey secretKey = keyFactory.generateSecret(desKeySpec); IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8)); Cipher cipher = Cipher.getInstance("DESede/CBC/ZeroBytePadding", "BC"); cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec); byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8)); return Base64.getEncoder().encodeToString(encryptedBytes); } public static String decrypt(String encryptedText, String key, String iv) throws Exception { DESedeKeySpec desKeySpec = new DESedeKeySpec(key.getBytes(StandardCharsets.UTF_8)); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede"); SecretKey secretKey = keyFactory.generateSecret(desKeySpec); IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8)); Cipher cipher = Cipher.getInstance("DESede/CBC/ZeroBytePadding", "BC"); cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec); byte[] decodedBytes = Base64.getDecoder().decode(encryptedText); byte[] decryptedBytes = cipher.doFinal(decodedBytes); return new String(decryptedBytes, StandardCharsets.UTF_8); } public static void main(String[] args) { try { String plainText = "Hello, 3DES CBC ZeroBytePadding!"; String key = "0123456789abcdef01234567"; String iv = "abcdefgh"; String encryptedText = encrypt(plainText, key, iv); System.out.println("Encrypted Text: " + encryptedText); String decryptedText = decrypt(encryptedText, key, iv); System.out.println("Decrypted Text: " + decryptedText); } catch (Exception e) { e.printStackTrace(); } } } ``` #### 修改`java.security`文件 可以通过修改`java.security`文件来添加Bouncy Castle提供者。找到Java安装目录下的`jre/lib/security/java.security`文件,添加或修改以下行: ```plaintext security.provider.7=org.bouncycastle.jce.provider.BouncyCastleProvider ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值