public class AESEncDec {
private static final String ALGO = "AES";
private static final byte[] keyValue = new byte[] { 'T', 'h', 'e', 'B','e', 's', 't','S', 'e', 'c', 'r','e', 't', 'K', 'e', 'y' };
public static String encrypt(String Data) throws Exception {
Key key = generateKey();
Cipher c = Cipher.getInstance(ALGO);
c.init(Cipher.ENCRYPT_MODE, key);
byte[] encVal = c.doFinal(Data.getBytes());
String encryptedValue = new BASE64Encoder().encode(encVal);
System.err.println("encVal: "+encryptedValue.length());
return encryptedValue;
}
public static String decrypt(String encryptedData) throws Exception {
Key key = generateKey();
Cipher c = Cipher.getInstance(ALGO);
c.init(Cipher.DECRYPT_MODE, key);
byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedData);
byte[] decValue = c.doFinal(decordedValue);
//byte[] decValue = c.doFinal(encryptedData.getBytes());
String decryptedValue = new String(decValue);
System.err.println("decVal: "+decryptedValue.length());
return decryptedValue;
}
private static Key generateKey() throws Exception {
Key key = new SecretKeySpec(keyValue, ALGO);
return key;
}
}
class TCPServer
{
public static void main(String argv[]) throws Exception
{
AESEncDec edData= new AESEncDec();
// AES edData= new AES();
String msg="Message_";
String clientSentence="";
String capitalizedSentence;
ServerSocket welcomeSocket = new ServerSocket(6789);
Socket connectionSocket = welcomeSocket.accept();
for (int i = 0; i < 10; i++)
{
clientSentence=edData.encrypt(msg+i)+"\n";
DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
outToClient.writeBytes(clientSentence);
Thread.sleep(100);
}
}
}
TCP客户端代码:
class TCPClient {
public static void main(String argv[]) throws Exception {
AESEncDec edData= new AESEncDec();
String modifiedSentence;
String DecData="";
Socket clientSocket = new Socket("localhost", 6789);
while(true){
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
modifiedSentence = inFromServer.readLine();
DecData=edData.decrypt(modifiedSentence);
System.out.println("FROM SERVER: " + DecData);
}
//clientSocket.close();
}
}
对于相同的代码,当消息很小时,它会被正确解密。但是当消息很长时,我会得到illegalBlocksize异常。我尝试使用aes/cbc/pkcs5padding来填充消息,并且blocksize是16的倍数。但我还是得到了相同的错误或BadPaddingException。如果am指定PKCS5Padding作为填充技术,那么应该正确填充消息,而不应该给出此错误。为什么不起作用。我可以做什么来正确地解密数据。请帮忙。
AES是一种分组密码,只能加密16到16字节。如果要加密任意输入,则需要操作模式和填充方案。默认模式通常是ECB,默认填充方案是PKCS#5填充(实际上是PKCS#7填充)。
这意味着单个加密也必须以完全相同的方式解密,因为必须在解密期间删除填充。重要的是,多个密文不能重叠,也不能分开(分块/包装)。
在加密多个消息时,换行符应该这样做,因为您在接收端以线性方式读取密文。
问题是默认的sun.misc.base64encoder#encode
方法实际上会自己引入换行符。每76个字符插入一个换行,但是接收者无法知道哪个换行实际上分隔了消息密文,哪个换行分隔了单个消息密文中的包装行。
String encryptedValue = new BASE64Encoder().encode(encVal).replaceAll("\\s", "");
这将替换单个消息密文中的所有空白。
由于您使用的是私有的sun.misc.*
类,因此最好转移到另一个Base64实现,因为这些类不必在每个JVM中都可用。您应该使用一些已知的库,如Apache的commons-codec,它提供了一个可以禁用包装/分块的实现:
String encryptedValue = Base64.encodeBase64(encVal, false);
相当于
String encryptedValue = Base64.encodeBase64(encVal);
我在java类中发现了一个解密错误: 我能做些什么来解决这个问题? 更新: 我忘了提到它工作了一次,当第二次我试图再次执行它时,它抛出了上面提到的错误。
运行以下代码时,如何解决此错误? 产出:
虽然对于调试来说,当我试图解密(使用相同的代码)app1上的加密url时,它工作得很好。但不知道是什么原因导致了APP2的异常? 这是代码
使用密钥加密和解密的新值(value1)。 两个示例加密值(enctypedValue1,enctypedValue2)正在使用相同的密钥进行解密。encryptedValue2在使用相同密钥解密时出现问题。 使用密钥加密和解密的新值(value4)。 在解密encryptedValue2时,我得到以下异常: 以下是我到目前为止得出的结论。 如果这个问题发生了,它应该发生在所有的值上。 这是一个特
我有一个安全课程的项目,但我有一个问题。 基本上,我试图加密然后解密一个密码,但我得到这个解密错误。 我这样做对吗。我在关注2012年的一篇文章。还安全吗? 我还尝试替换算法,但似乎没有任何效果: “AES”、“RSA/ECB/PKCS1Padding”、“PbeWithHMACSHA256andDesede”..以及更多
所有人。我基本上是试图加密和解密一个字符串类型的密码。我得到的错误是javax . crypto . illegalblocksizeexception:使用填充密码解密时,输入长度必须是8的倍数。 我尝试用指定的填充做其他算法,例如AES/CBC/NoPadding。但得到不同的错误是Java . security . invalidkeyexception:无效的AES密钥长度:5个字节。