Java:加密无法在命令行中运行

时间:2014-06-24 19:36:23

标签: java encryption

我使用以下代码来加密值:

import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;

public class crypto {
    public static void main(String [] args) {
        String s = args[0];
        String s1 = args[1];
        String ivkey = "1234567891234567891235478912345";
        byte[] ivraw = ivkey.getBytes();
        SecretKeySpec skeySpec = new SecretKeySpec(ivraw, "AES");

        if (s.equalsIgnoreCase("ENCRYPT")) {
            try {
                Cipher cipher = Cipher.getInstance("AES");
                cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
                byte[] encrypted = cipher.doFinal(s1.getBytes());
                System.out.println(new String(Base64.encodeBase64(encrypted)));
                System.out.println(s1);

            } catch (NoSuchAlgorithmException | NoSuchPaddingException
                    | InvalidKeyException | IllegalBlockSizeException
                    | BadPaddingException e) {
            }
        } else {
            try {
                Cipher cipher = Cipher.getInstance("AES");
                cipher.init(Cipher.DECRYPT_MODE, skeySpec);
                byte[] encrypted = cipher.doFinal(s1.getBytes());
                System.out.println(new String(Base64.encodeBase64(encrypted)));

            } catch (NoSuchAlgorithmException | NoSuchPaddingException
                    | InvalidKeyException | IllegalBlockSizeException
                    | BadPaddingException e) {
            }

        }
        return;
    };
}

然而,每当我编译它然后运行代码时,我都没有收到任何错误,它只是向我吐出s1的值,而不是它的加密值。我不完全确定我在哪里出错,我在编译期间或运行时都没有收到任何错误。

我已经放置了标记来跟踪我通过应用程序的进度,似乎正在触及所有关键点。我关注的是Base64无法正常工作,因为我必须使用javac -classpath "/path/to/commons.jar" crypto.java进行编译,但我无法判断它是否存在。

感谢您的协助

1 个答案:

答案 0 :(得分:0)

你的密钥太小了,它是31个字节。使它16字节,你会有AES-128。密钥永远不应该是一个字符串,它应该与随机(字节或位)无法区分。对于AES,IV的大小是固定的,它应该是16个字节(或cipher.getBlockSize()),而不是更少,但肯定不会更多。

确保您了解应用加密技术。您当前正在使用ECB模式加密,这对文本(以及块密码的大多数其他用途,实际上)都是不安全的。键不应该是字符串,IV应该是随机的。仅使用"AES"并不会使您的代码在加密方面安全。

不要在表下推送异常,并尝试使用带调试器的IDE。