de.tntinteractive.portalsammler.engine.CryptoHelper.java Source code

Java tutorial

Introduction

Here is the source code for de.tntinteractive.portalsammler.engine.CryptoHelper.java

Source

/*
Copyright (C) 2013  Tobias Baum <tbaum at tntinteractive.de>
    
This file is a part of Portalsammler.
    
Portalsammler is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
    
Portalsammler is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
    
You should have received a copy of the GNU General Public License
along with Portalsammler.  If not, see <http://www.gnu.org/licenses/>.
 */
package de.tntinteractive.portalsammler.engine;

import java.io.InputStream;
import java.io.OutputStream;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.engines.AESFastEngine;
import org.bouncycastle.crypto.io.CipherInputStream;
import org.bouncycastle.crypto.io.CipherOutputStream;
import org.bouncycastle.crypto.modes.CBCBlockCipher;
import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.crypto.params.ParametersWithRandom;

public final class CryptoHelper {

    private CryptoHelper() {
    }

    public static byte[] generateKey(final SecureRandom srand) throws NoSuchAlgorithmException {
        final byte[] key = new byte[256 / 8];
        srand.nextBytes(key);
        return key;
    }

    public static CipherInputStream createAesDecryptStream(final InputStream is, final byte[] key,
            final SecureRandom srand) {
        final PaddedBufferedBlockCipher cipher = initAes(key, srand, false);
        return new CipherInputStream(is, cipher);
    }

    public static CipherOutputStream createAesEncryptStream(final OutputStream os, final byte[] key,
            final SecureRandom srand) {
        final PaddedBufferedBlockCipher cipher = initAes(key, srand, true);
        return new CipherOutputStream(os, cipher);
    }

    private static PaddedBufferedBlockCipher initAes(final byte[] key, final SecureRandom srand,
            final boolean forEncryption) {
        final CipherParameters cipherParams = new ParametersWithRandom(new KeyParameter(key), srand);

        final AESFastEngine aes = new AESFastEngine();
        final PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(aes));
        cipher.init(forEncryption, cipherParams);
        return cipher;
    }

    public static byte[] keyFromString(final String pw) {
        return Base64.decodeBase64(pw);
    }

    public static String keyToString(final byte[] key) {
        return Base64.encodeBase64String(key);
    }

}