繁体   English   中英

使用DES算法以Java加密和解密文件

[英]Encrypt and decrypt a file in Java with DES algorithm

我正在尝试做一个练习,以使用DES算法加密file.txt。 我必须将生成的密钥保存在没有扩展名的文件中。 我认为这部分已经解决。 但是我很难使用相同的密钥解密加密的文件。 我收到错误消息:“给最终块未正确填充”。

练习:1.加密程序:读取一个文本文件,使用DES算法对其加密,然后将结果写入一个新文件,另一个文件存储在用于加密的密钥中。 2.解密程序:读取由加密密钥保存的程序,对由加密程序存储的文本进行解密并将其显示在屏幕上。

注意:使用FileInputStream和FileOutputStream,以8字节为块执行加密,并以16字节为块执行解密。

加密

import java.io.*;
import javax.crypto.*;
import javax.crypto.spec.*;

public class Encrypt {

    public static void main(String[] args) {

        try {
            SecretKey key = KeyGenerator.getInstance("DES").generateKey();

            FileOutputStream fosKey = new FileOutputStream("..\\KEY");
            SecretKeyFactory keyfac = SecretKeyFactory.getInstance("DES");
            DESKeySpec keyspec = (DESKeySpec) keyfac.getKeySpec(key, DESKeySpec.class);
            fosKey.write(keyspec.getKey());
            fosKey.close();

            Cipher crypt = Cipher.getInstance("DES");
            crypt.init(Cipher.ENCRYPT_MODE, key);

            FileInputStream fis = new FileInputStream("..\\File.txt");
            FileOutputStream fos = new FileOutputStream("..\\FileCrypted.txt");
            byte[] arrayBytes = new byte[8];
            int bytesReads;
            while ((bytesReads = fis.read(arrayBytes)) != -1) {
                fos.write(crypt.doFinal(arrayBytes), 0, bytesReads);
            }
            fis.close();
            fos.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

解密

import java.io.*;
import javax.crypto.*;
import javax.crypto.spec.*;

public class Decrypt {

    public static void main(String[] args) {

        try {
            FileInputStream fisKey = new FileInputStream("..\\KEY");
            byte[] arrayKey = new byte[fisKey.available()];
            fisKey.read(arrayKey);
            SecretKey key = new SecretKeySpec(arrayKey, "DES");

            Cipher decrypt = Cipher.getInstance("DES");
            decrypt.init(Cipher.DECRYPT_MODE, key);

            FileInputStream fis = new FileInputStream("..\\FileCrypted.txt");
            byte[] encText = new byte[16];
            int bytesReads;
            while ((bytesReads = fis.read(encText)) != -1) {
                fis.read(decrypt.doFinal(encText), 0, bytesReads);
            }
            fis.close();
            System.out.println(new String(encText));

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

您应该对中间加密调用使用update()方法,并且仅在上一次调用中使用doFinal() 这适用于加密和解密。

DES-在ECB或CBC模式下-始终使用8字节的块大小(包括加密和解密)。 如果填充处于活动状态,则在执行doFinal()时将附加其他数据 (1-8字节)以确保块大小为8。 如果填充在密码上未处于活动状态,则在执行doFinal()时,需要确保以8字节的倍数提供数据。

update()允许您对数据进行加密,而无需与8字节的块大小对齐,因为它只是被缓冲直到有完整块的数据为止。 doFinal()刷新缓冲区中可能用于加密的所有多余字节,并应用可能有效的任何填充。


请注意,DES 不再被认为是安全的 ,因此不应将其用于任何严重的安全性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM