Java:加密在命令行中不起作用

Java:加密在命令行中不起作用,java,encryption,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.NoSuchPad

我使用以下代码对值进行加密:

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进行编译,但我无法判断它是否起作用


非常感谢您的帮助

您的密钥太小,只有31个字节。如果设置为16字节,您将拥有AES-128。密钥永远不应该是字符串,它应该与随机的字节或位无法区分。IV的大小对于AES是固定的,它应该是16字节或cipher.getBlockSize,不能小于,但肯定也不能大于

确保您对应用密码学有一点了解。您当前使用的是ECB模式加密,这对于文本和大多数其他分组密码的使用都是不安全的。键不应该是字符串,IV应该是随机的。仅仅使用AES并不能保证代码的加密安全


不要将异常推到表下,尝试使用带有调试器的IDE。

忽略可能的异常。至少在catch子句中打印stacktrace。请使用throw new RuntimeExceptionOne替换空异常处理,然后查看发生了什么。请注意,计数时0是一个重要数字。你是以9为基数,而不是10为基数。我应该注意到,我使用的是一个32字节的键,我只是为了在网上发布而更改了它对此表示歉意。嗯,更改密钥大小后,在我的机器上运行base64时会打印它。请注意,对于ECB,如果s1为空,则输出为空。但您应该始终创建一个16字节的IV。