Java实现DES/ECB/PKCS7Padding加密算法

DES/ECB/PKCS7Padding加密算法:在Java开发中,用到的DES的ECB加密模式、PKCS7Padding填充方式,Java目前仅支持PKCS5Padding填充模式

问题描述

java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/CBC/PKCS7Padding

问题分析

java默认支持是PKCS5Padding填充方式 。

目前Java要实现PKCS7Padding填充模式的加密,需要借助第三方Jar包才可以实现,就是在初始化的时候 Security.addProvider 增加第三方的提供者,解密的时候还是按照原来的方式。

解决方案

BouncyCastle官网下载组件以支持PKCS7Padding填充。

2、把下载的bcprov-ext-jdk15to18-166.jar分别复制到

${jdk_home}\jre\lib\ext

(eg:D:\Java\jdk1.8.0_221\jre\lib\ext)

${jre_home}\lib\ext

(eg:D:\Java\jre1.8.0_221\lib\ext)

3、修改java.security文件

${jdk_home}\jre\lib\security\java.security

(eg:D:\Java\jdk1.8.0_221\jre\lib\security\java.security)

${jre_home}\lib\security\java.security

(eg:D:\Java\jre1.8.0_221\lib\security\java.security)

4、在3中找到的两个文件中搜索

security.provider.10=sun.security.mscapi.SunMSCAPI

然后在下面添加Java的默认加密提供者,保存,重启工作空间重新build项目;

security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider

在使用AES前,加入下面代码即可,如果显示该class还没导入,那就手动导入到该工程就好;

Security.addProvider(new BouncyCastleProvider());

使用DES/ECB加密,加入下面的静态代码块来添加默认加密提供者即可;

static {
   
        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
        }

如果是Maven项目;

<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on -->
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.60</version>
</dependency>

同样使用下面的静态代码块来添加默认加密提供者即可;

  static {
       
        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
    }

5.以下是一个亲测可用的采用ECB模式的DES加密,padding使用PKCS7的加密工具类

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.Key;
import java.security.Security;

import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

public class DESUtil {
   

    private final static String ALGORITHM_DES = "DES/ECB/PKCS7Padding";

    //设置java支持PKCS7Padding
    static {
   
        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
    }

    //获取加密或解密的Cipher对象:负责完成加密或解密工作
    private static Cipher GetCipher(int opmode, String key) {
   
        try {
   
            //根据传入的秘钥内容生成符合DES加密解密格式的秘钥内容
            DESKeySpec dks = new 
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
NoSuchAlgorithmException: Cannot find any provider supporting SM4/ECB/PKCS5Padding 是一个安全框架异常。根据引用和引用的信息,这个异常通常发生在使用Java加密算法时,找不到对应的算法提供者。具体地说,对于SM4/ECB/PKCS5Padding算法Java安全框架无法找到支持这个算法的提供者。要解决这个问题,可以尝试以下步骤: 1. 确保你的Java运行环境中包含了支持SM4算法的提供者。可以通过检查你的Java安装目录下的lib/security文件夹中的java.security文件来确认。如果没有找到SM4算法的提供者,那么你需要下载并安装支持SM4算法Java加密提供者。 2. 如果你已经安装了支持SM4算法的提供者,但仍然遇到该异常,那么可能是因为你的程序无法加载到提供者的jar包。你可以尝试将提供者的jar包放到类路径中,或者使用-Djava.ext.dirs参数指定jar包的路径。 综上所述,要解决NoSuchAlgorithmException: Cannot find any provider supporting SM4/ECB/PKCS5Padding异常,你可以检查是否安装了支持SM4算法的提供者,并确保程序能够加载到提供者的jar包。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [jce_policy-8.AES加密版本.zip](https://download.csdn.net/download/mrlin6688/16828133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [java.security.NoSuchAlgorithmException: Cannot find any provider supporting DES/CBC/PKCS5Padding](https://blog.csdn.net/dudadudadd/article/details/129182630)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值