我使用以下代码来加密值:
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
进行编译,但我无法判断它是否存在。
感谢您的协助
答案 0 :(得分:0)
你的密钥太小了,它是31个字节。使它16字节,你会有AES-128。密钥永远不应该是一个字符串,它应该与随机(字节或位)无法区分。对于AES,IV的大小是固定的,它应该是16个字节(或cipher.getBlockSize()
),而不是更少,但肯定不会更多。
确保您了解应用加密技术。您当前正在使用ECB模式加密,这对文本(以及块密码的大多数其他用途,实际上)都是不安全的。键不应该是字符串,IV应该是随机的。仅使用"AES"
并不会使您的代码在加密方面安全。
不要在表下推送异常,并尝试使用带调试器的IDE。