В настоящее время я работаю над функцией, которая шифрует / дешифрует определенный файл с секретным ключом. Я написал три класса, один из которых генерирует ключ, один для шифрования файла с помощью ключа и один для дешифрования.
Генерация ключа и шифрование файла работают нормально, но когда я пытаюсь расшифровать файл, возникает исключение. выброшено в строке: c.init (Cipher.DECRYPT_MODE, keySpec);
:
java.security.InvalidKeyException: Параметры отсутствуют
Я так понимаю, я сделал что-то не так при потоковой передаче секретного ключа на мой байт []
или что-то не так при дешифровании файла.
Краткое объяснение трех классов: KeyHandler создает ключ AES и сохраняет его на жестком диске. Имя ключа / открытого текста / зашифрованных / дешифрованных файлов в настоящее время жестко закодировано для целей тестирования.
EncryptionHandler
передает файл .txt на диске в байты, шифрует файл с помощью секретного ключа и затем записывает зашифрованные байты на диск с помощью CipherOutputStream
.
DecryptionHandler
, конечно, действует противоположно EncryptionHandler
.
Вот код:
public class KeyHandler {
Scanner scan = new Scanner(System.in);
public KeyHandler(){
try {
startMenu();
} catch (Exception e) {
System.out.println("fel någonstanns :)");
}
}
public void startMenu() throws Exception{
System.out.println("Hej. Med detta program kan du generera en hemlig nyckel"+"\n"+"Vill du:"+"\n"+ "1. Generera en nyckel"+"\n"+"2. Avsluta");
int val=Integer.parseInt(scan.nextLine());
do{
switch (val){
case 1: generateKey(); break;
case 2: System.exit(1);
default: System.out.println("Du måste välja val 1 eller 2");
}
}
while (val!=3);
}
public void generateKey() throws Exception{
try {
KeyGenerator gen = KeyGenerator.getInstance("AES");
gen.init(128);
SecretKey key=gen.generateKey();
byte[] keyBytes = key.getEncoded();
System.out.print("Ge nyckeln ett filnamn: ");
String filename = scan.next();
System.out.println("Genererar nyckeln...");
FileOutputStream fileOut = new FileOutputStream(filename);
fileOut.write(keyBytes);
fileOut.close();
System.out.println("Nyckeln är genererad med filnamnet: "+filename+"...");
System.exit(1);
} catch (NoSuchAlgorithmException e) {
}
}
public static void main(String[] args){
new KeyHandler();
}
}
public class EncryptHandler {
private String encryptedDataString;
private Cipher ecipher;
AlgorithmParameterSpec paramSpec;
byte[] iv;
public EncryptHandler(String dataString, String secretKey, String encryptedDataString){
this.encryptedDataString=encryptedDataString;
try {
encryptFile(dataString, secretKey);
} catch (Exception e) {
}
}
public void encryptFile(String dataString, String secretKey) throws Exception{
FileInputStream fis = new FileInputStream(secretKey);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int theByte = 0;
while ((theByte = fis.read()) != -1)
{
baos.write(theByte);
}
fis.close();
byte[] keyBytes = baos.toByteArray();
baos.close();
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
try
{
ecipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
ecipher.init(Cipher.ENCRYPT_MODE, keySpec);
}
catch (Exception e)
{
e.printStackTrace();
}
System.out.println("Encrypting file...");
try
{
encryptStream(new FileInputStream(dataString),new FileOutputStream(encryptedDataString));
}
catch(Exception e){
e.printStackTrace();
}
}
public void encryptStream(InputStream in, OutputStream out){
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
try {
out = new CipherOutputStream(out, ecipher);
// read the cleartext and write it to out
int numRead = 0;
while ((numRead = in.read(buf)) >= 0) {
out.write(buf, 0, numRead);
}
bOut.writeTo(out);
out.close();
bOut.reset();
}
catch (java.io.IOException e)
{
}
}
public static void main(String[] args){
String data = "test.txt";
String keyFileName="a";
String encryptedFile="krypterad.txt";
//String encryptedFile =args[2];
new EncryptHandler(data, keyFileName, encryptedFile);
}
}
public class DecryptHandler {
public DecryptHandler(){
try {
decryptFile();
} catch (Exception e) {
System.out.println("något gick fel :) ");
}
}
public void decryptFile()throws Exception{
byte[] buf = new byte[1024];
String keyFilename = "hemlig";
FileInputStream fis = new FileInputStream(keyFilename);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int theByte = 0;
while ((theByte = fis.read()) != -1)
{
baos.write(theByte);
}
fis.close();
byte[] keyBytes = baos.toByteArray();
baos.close();
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
System.out.println("här");
c.init(Cipher.DECRYPT_MODE, keySpec);
System.out.println("Decrypting file...");
try{
decryptStream(new FileInputStream("krypterad.txt"),new FileOutputStream("Dekryperad.txt"), c, buf);
}
catch (java.io.IOException e){
}
System.out.println("File decrypted!");
}
public void decryptStream(InputStream in, OutputStream out, Cipher dcipher, byte[] buf){
try
{
in = new CipherInputStream(in, dcipher);
// Read in the decrypted bytes and write the cleartext to out
int numRead = 0;
while ((numRead = in.read(buf)) >= 0)
{
out.write(buf, 0, numRead);
}
out.close();
}
catch (java.io.IOException e){
}
}
public static void main(String[]args){
new DecryptHandler();
}
}