Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用DES算法在Java中加密和解密文件_Java_Security_Encryption_Cryptography - Fatal编程技术网

用DES算法在Java中加密和解密文件

用DES算法在Java中加密和解密文件,java,security,encryption,cryptography,Java,Security,Encryption,Cryptography,我正在尝试使用DES算法对file.txt文件进行加密。我必须将生成的密钥保存在一个没有扩展名的文件中。我认为这部分已经很好地解决了。但是我很难用相同的密钥解密加密文件。我得到一个错误:“给定的最后一个块没有正确填充” 练习: 1.加密程序:读取一个文本文件,使用DES算法对其进行加密,结果写入一个新文件,另一个文件存储在用于加密的密钥中。 2.解密程序:读取加密密钥保存的程序,解密加密程序存储的文本并显示在屏幕上 注意:使用FileInputStream和FileOutputStream,以8

我正在尝试使用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();
        }
    }
}
解密

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字节的块大小(加密和解密)。如果padding处于活动状态,则执行
doFinal()
时,将追加附加数据(1-8字节),以确保块大小为8。如果密码上的填充未激活,则在执行
doFinal()
时,需要确保以8字节的倍数提供数据

update()
允许您在不与8字节块大小对齐的情况下将数据处理到加密,因为它只是被缓冲,直到有完整块的数据。
doFinal()



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

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

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

update()
允许您在不与8字节块大小对齐的情况下将数据处理到加密,因为它只是被缓冲,直到有完整块的数据。
doFinal()



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

始终使用完全限定的密码字符串,因为
Cipher.getInstance(“DES”)可能具有不同的默认值,这可能会破坏多个JVM之间的兼容性。它很可能默认为
Cipher.getInstance(“DES/ECB/PKCS5Padding”)从不使用。它是确定性的,因此在语义上不安全。您至少应该使用随机模式,如或。最好是对密文进行身份验证,这样就不可能进行类似的攻击。这可以通过身份验证模式(如GCM或EAX)或方案来完成。始终使用完全限定的密码字符串,因为
Cipher.getInstance(“DES”)可能具有不同的默认值,这可能会破坏多个JVM之间的兼容性。它很可能默认为
Cipher.getInstance(“DES/ECB/PKCS5Padding”)从不使用。它是确定性的,因此在语义上不安全。您至少应该使用随机模式,如或。最好是对密文进行身份验证,这样就不可能进行类似的攻击。这可以通过诸如GCM或EAX之类的经过身份验证的模式来实现,也可以通过一个方案来实现。