com.doplgangr.secrecy.filesystem.encryption.AES_ECB_Crypter.java Source code

Java tutorial

Introduction

Here is the source code for com.doplgangr.secrecy.filesystem.encryption.AES_ECB_Crypter.java

Source

/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package com.doplgangr.secrecy.filesystem.encryption;

import com.doplgangr.secrecy.Config;
import com.doplgangr.secrecy.exceptions.SecrecyCipherStreamException;
import com.doplgangr.secrecy.filesystem.Base64Coder;
import com.doplgangr.secrecy.filesystem.files.EncryptedFile;

import org.apache.commons.io.FilenameUtils;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

import javax.crypto.Cipher;
import javax.crypto.CipherOutputStream;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;

@Deprecated
class AES_ECB_Crypter implements Crypter {

    private final String mode = "AES/ECB/PKCS5Padding";
    private final String vaultPath;
    private SecretKeySpec aesKey;

    public AES_ECB_Crypter(String vaultPath, String password) throws InvalidKeyException {
        this.vaultPath = vaultPath;
        try {
            byte[] bytes = password.getBytes("UTF-8");
            byte[] legitkey = new byte[32];
            int i = 0;
            while (i < 32 && i < bytes.length) {
                legitkey[i] = bytes[i];
                i++;
            }
            String KEY_ALGORITHM = "AES";
            aesKey = new SecretKeySpec(legitkey, KEY_ALGORITHM);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

    @Override
    public CipherOutputStream getCipherOutputStream(File file, String outputFileName)
            throws SecrecyCipherStreamException, FileNotFoundException {
        Cipher c;
        try {
            c = Cipher.getInstance(mode);
        } catch (NoSuchAlgorithmException e) {
            throw new SecrecyCipherStreamException("Encryption algorithm not found!");
        } catch (NoSuchPaddingException e) {
            throw new SecrecyCipherStreamException("Selected padding not found!");
        }

        try {
            c.init(Cipher.ENCRYPT_MODE, aesKey);
        } catch (InvalidKeyException e) {
            throw new SecrecyCipherStreamException("Invalid encryption key!");
        }

        String filename = Base64Coder.encodeString(FilenameUtils.removeExtension(file.getName())) + "."
                + FilenameUtils.getExtension(file.getName());
        File outputFile = new File(vaultPath + "/" + filename);

        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(outputFile),
                Config.BLOCK_SIZE);

        return new CipherOutputStream(bufferedOutputStream, c);
    }

    @Override
    public SecrecyCipherInputStream getCipherInputStream(File encryptedFile)
            throws SecrecyCipherStreamException, FileNotFoundException {
        Cipher c;
        try {
            c = Cipher.getInstance(mode);
        } catch (NoSuchAlgorithmException e) {
            throw new SecrecyCipherStreamException("Encryption algorithm not found!");
        } catch (NoSuchPaddingException e) {
            throw new SecrecyCipherStreamException("Selected padding not found!");
        }

        try {
            c.init(Cipher.DECRYPT_MODE, aesKey);
        } catch (InvalidKeyException e) {
            throw new SecrecyCipherStreamException("Invalid encryption key!");
        }

        return new SecrecyCipherInputStream(new FileInputStream(encryptedFile), c);
    }

    @Override
    public String getDecryptedFileName(File file) throws SecrecyCipherStreamException, FileNotFoundException {

        String name = FilenameUtils.getBaseName(file.getName());
        try {
            name = Base64Coder.decodeString(name); //if name is invalid, return original name
        } catch (IllegalArgumentException ignored) {
        }
        name += "." + FilenameUtils.getExtension(file.getName());
        return name;
    }

    @Override
    public boolean changePassphrase(String oldPassphrase, String newPassphrase) {
        return false;
    }

    @Override
    public void deleteFile(EncryptedFile file) {
        file.delete();
    }

    @Override
    public void renameFile(File file, String newName) throws SecrecyCipherStreamException, FileNotFoundException {

        File parent = file.getParentFile();
        newName = FilenameUtils.removeExtension(newName);
        newName = Base64Coder.encodeString(newName);
        newName += "." + FilenameUtils.getExtension(file.getName());
        file.renameTo(new File(parent, newName));
    }
}