文件解密 [Java]

如何完成对加密后文件的解密操作

  • 我们上面是使用了给读入的数据进行一个^5运算之后然后写出的方式对文件进行了加密操作,这个时候如果我们要使用加密后文件的解密, 这个时候我们就要给加密后的文件的数据再进行一个^5的运算 ,然后再将数据写出,然后就完成了解密
这里我们来理一理流程:
  • 首先是加密
  1. 读入一个未加密文件
  2. 对读入文件数据进行^5 (也就是进行加密)
  3. 然后写出数据
  • 然后是解密
  1. 读入一个加密后的文件

  2. 对读入的文件数据进行^5(也就是进行解密)

    • 为什么这个时候对加密后文件数据进行^5又是进行了解密?

      因为我们之前在只使用两个变量完成变量数据内容交换时学过,如果一个x异或y之后再异或一个y就是x,如果一个x异或y之后再异或一个x就是y,这个时候我们给原本的数据进行一次异或5之后就是进行了加密,然后再进行一次^5之后就是完成了解码

  3. 然后写出数据

这里我们给出加密程序:

  • 这里我们对文件的加密的思想就是对文件中每个字节的数据进行编码之后^(异或)5,然后就完成了对文件的一个简单加密
package IO流.fileinputstream;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo6 {
    public static void main(String[] args) throws IOException{
        /*
        创建结点流对象 ,指明源文件和加密后文件的存储地址
         */
        FileInputStream fis = new FileInputStream("abc.png");
        FileOutputStream fos = new FileOutputStream("abcSecret.png");

        /*
        创建一个缓冲byte[]
         */
        byte [] bytes = new byte[20];

        /*
        创建一个临时变量用来接收read()方法的返回值
         */
        int len = 0;
        
        /*
        
        数据的读入和写出操作,每次读入数据之后,写出数据之前,我们要将数据编码进行一个^5,进行数据加密
       
         */
        while((len =  fis.read(bytes)) != -1){
            for (int i = 0; i < len ; i++){
                bytes[i] = (byte)(bytes[8] ^ 5);
            }
            
            fos.write(bytes,0,len);
        }

        /*
        流资源的关闭
         */
        fos.close();
        fis.close();
    }
}
  • 上面的abc.png是一个本项目之下的图片
  • 这个时候我们运行这个程序之后就会在本项目之下产生一个加密后的文件,这个文件名为abcSecret.png的加密文件
    • 这个加密文件和我们的原文件的大小是完全相同的,但是我们的加密文件是不可以打开的

这里我们给出解密的程序:

package IO流.fileinputstream;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo7 {
    public static void main(String[] args) throws IOException{
        /*
        创建结点流对象 ,指明源文件和加密后文件的存储地址
         */
        FileInputStream fis = new FileInputStream("abcSecret.png");
        FileOutputStream fos = new FileOutputStream("abc5.png");

        /*
        创建一个缓冲byte[]
         */
        byte [] bytes = new byte[20];

        /*
        创建一个临时变量用来接收read()方法的返回值
         */
        int len = 0;

        /*

        数据的读入和写出操作,每次读入数据之后,写出数据之前,我们要将数据编码进行一个^5,进行数据加密

         */
        while((len =  fis.read(bytes)) != -1){
            for (int i = 0; i < len ; i++){
                bytes[i] = (byte)(bytes[i] ^ 5);
            }

            fos.write(bytes,0,len);
        }

        /*
        流资源的关闭
         */
        fos.close();
        fis.close();
    }
}
  • 这个时候我们运行一次程序之后将我们的加密后的文件作为输入,然后得到一个输出文件,这个时候我们就可以发现这个输出文件是正常文件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
国密(SM2/SM3/SM4)是中国自主研发的密码算法标准,其目的是保护国家信息安全。SM2为椭圆曲线公钥密码算法,用于数字签名与密钥交换;SM3为杂凑算法,用于生成消息摘要;SM4为分组密码算法,用于数据加密与解密。 要在Java解密国密加密的文件,首先需要导入相关的国密算法库。可以使用BouncyCastle库,该库包含了对SM2/SM3/SM4算法的支持。 通过使用BouncyCastle库,我们可以通过以下步骤来解密国密加密的文件: 1. 导入BouncyCastle库: ```java import org.bouncycastle.jce.provider.BouncyCastleProvider; import java.security.Security; Security.addProvider(new BouncyCastleProvider()); ``` 2. 使用SM4算法初始化解密器: ```java import org.bouncycastle.crypto.BufferedBlockCipher; import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.modes.CBCBlockCipher; import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.crypto.params.ParametersWithIV; byte[] key = // 密钥 byte[] iv = // 初始化向量 SM4Engine sm4Engine = new SM4Engine(); BufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(sm4Engine)); cipher.init(false, new ParametersWithIV(new KeyParameter(key), iv)); ``` 3. 执行解密操作: ```java byte[] encryptedData = // 加密的数据 byte[] decryptedData = new byte[cipher.getOutputSize(encryptedData.length)]; int decryptedLength = cipher.processBytes(encryptedData, 0, encryptedData.length, decryptedData, 0); cipher.doFinal(decryptedData, decryptedLength); ``` 解密后的数据将保存在`decryptedData`中。 需要注意的是,解密操作需要正确的密钥和初始化向量才能成功解密。同时,解密后的数据格式可能是二进制格式,根据需求可能需要进行进一步处理。 以上是使用Java解密国密加密文件的基本步骤,具体实现可能需要根据具体情况进行适当的调整。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值