java.lang.ArrayIndexOutOfBoundsException:来自Java In A Nutshell的示例中的1

时间:2017-10-08 08:06:39

标签: java cryptography indexoutofboundsexception

我想尝试Java In A Nutshell书(第3版)中的代码,但是当我尝试运行它时,我收到java.lang.ArrayIndexOutOfBoundsException: 1错误。我找到了信息:

  

抛出以指示已使用非法索引访问数组。索引为负数或大于或等于数组的大小。

但不幸的是我仍然无法找到并修复它

package tripledes;

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

public class TripleDES {

public static void main(String[] args) {

    try {
        try {
            Cipher c = Cipher.getInstance("DESede");
        } catch (Exception e) {
            System.err.println("Installing SunJCE provicer");
            Provider sunjce = new com.sun.crypto.provider.SunJCE();
            Security.addProvider(sunjce);
        }

        File keyfile = new File(args[1]);

        if (args[0].equals("-g")) {
            System.out.println("Generating key. This may take some time...");
            System.out.flush();
            SecretKey key = generateKey();
            writeKey(key, keyfile);
            System.out.println("Done");
            System.out.println("Secret key written to " + args[1] + ". Protect that file!");
        } else if (args[0].equals("-e")) {
            SecretKey key = readKey(keyfile);
            encrypt(key, System.in, System.out);
        } else if (args[0].equals("-d")) {
            SecretKey key = readKey(keyfile);
            decrypt(key, System.in, System.out);
        }
    } catch (Exception e) {
        System.err.println(e);
        System.err.println("Usage: java " + TripleDES.class.getName() + "-d|-e|-g <keyfile>");
    }

}

public static SecretKey generateKey() throws NoSuchAlgorithmException {
    KeyGenerator keygen = KeyGenerator.getInstance("DESede");
    return keygen.generateKey();
}

public static void writeKey(SecretKey key, File f) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException {
    SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("DESede");
    DESedeKeySpec keyspec = (DESedeKeySpec) keyfactory.getKeySpec(key, DESedeKeySpec.class);
    byte[] rawkey = keyspec.getKey();

    FileOutputStream out = new FileOutputStream(f);
    out.write(rawkey);
    out.close();
}

public static SecretKey readKey(File f) throws IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidKeySpecException {
    DataInputStream in = new DataInputStream(new FileInputStream(f));
    byte[] rawkey = new byte[(int) f.length()];
    in.readFully(rawkey);
    in.close();

    DESedeKeySpec keyspec = new DESedeKeySpec(rawkey);
    SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("DESede");
    SecretKey key = keyfactory.generateSecret(keyspec);
    return key;
}

public static void encrypt(SecretKey key, InputStream in, OutputStream out)
        throws NoSuchAlgorithmException, InvalidKeyException, NoSuchPaddingException, IOException {
    Cipher cipher = Cipher.getInstance("DESede");
    cipher.init(Cipher.ENCRYPT_MODE, key);

    CipherOutputStream cos = new CipherOutputStream(out, cipher);

    byte[] buffer = new byte[2048];
    int bytesRead;
    while ((bytesRead = in.read(buffer)) != -1) {
        cos.write(buffer, 0, bytesRead);
    }
    cos.close();

    java.util.Arrays.fill(buffer, (byte) 0);
}

public static void decrypt(SecretKey key, InputStream in, OutputStream out)
        throws NoSuchAlgorithmException, InvalidKeyException, IOException, IllegalBlockSizeException,
        NoSuchPaddingException, BadPaddingException {
    Cipher cipher = Cipher.getInstance("DESede");
    cipher.init(Cipher.DECRYPT_MODE, key);

    byte[] buffer = new byte[2048];
    int bytesRead;
    while ((bytesRead = in.read(buffer)) != -1) {
        out.write(cipher.update(buffer, 0, bytesRead));
    }
    out.write(cipher.doFinal());
    out.flush();
}

}

1 个答案:

答案 0 :(得分:1)

当您访问args数组时。如:

 File keyfile = new File(args[1]);

如果你的程序没有参数,那么这将是一个ArrayIndexOutOfBoundsException。