我尝试使用des算法进行加密和解密。对于enryption我没有问题,并成功地将明文转换为字节数组。但是我无法将密文解密为普通明文。我认为我的解密方法有一些问题。这是我的编码
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
public class FileEncryption {
//Initial Vector
public static final byte[] iv = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
//EncryptAndDecrypt String -> Input : PlainText + Return : CipherText+DecipherText
public static String encryptString(String src) throws Exception
{
String dst="";
//Not Input!
if(src == null || src.length()==0)
return "";
//Encryption Setting
byte[] k="Multimediaproces".getBytes();
SecretKeySpec Key = new SecretKeySpec(k,"AES");
IvParameterSpec ivspec = new IvParameterSpec(iv);
Cipher encryptCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
encryptCipher.init(Cipher.ENCRYPT_MODE,Key,ivspec);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
CipherOutputStream cout = new CipherOutputStream(baos,encryptCipher);
cout.write(src.getBytes());
cout.flush(); //ByteOutputStream -> Write Encryption Text
cout.close();
dst = DatatypeConverter.printHexBinary(baos.toByteArray());
return dst;
}
//String src -> EncryptedData
public static String decryptString(String src) throws Exception
{
//src value is Encrypted Value!
//So, src value -> Not Byte!
//String dst="";
byte[] encryptedBytes = src.getBytes();
//Not Input!
if(src == null || src.length()==0)
return "";
//Decryption Setting
IvParameterSpec ivspec = new IvParameterSpec(iv);
byte[] k="Multimediaproces".getBytes();
SecretKeySpec Key = new SecretKeySpec(k,"AES");
Cipher decryptCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
decryptCipher.init(Cipher.DECRYPT_MODE,Key,ivspec);
//ByteArrayOutputStream baos = new ByteArrayOutputStream();
ByteArrayInputStream bais = new ByteArrayInputStream(encryptedBytes);
CipherInputStream cin = new CipherInputStream(bais,decryptCipher);
//CipherOutputStream cout = new CipherOutputStream(baos,decryptCipher);
//cout.write(src.getBytes());
byte[] buf = new byte[1024];
int read;
while((read=cin.read(buf))>=0) //reading encrypted data!
{
cin.read(buf,0,read); //writing decrypted data!
//read = cin.read(buf);
}
// closing streams
//baos.write(decryptCipher.doFinal());
//return baos.toString();
//cin.close();
return bais.toString();
}
}
运行代码时出现的错误 error messages
答案 0 :(得分:1)
在encryptString
方法中,您将字节转换为十六进制字符串:
dst = DatatypeConverter.printHexBinary(baos.toByteArray());
因此,为了解密,您必须将此十六进制字符串转换回字节:
// Instead of this: byte[] encryptedBytes = src.getBytes();
// Do this:
byte[] encryptedBytes = DatatypeConverter.parseHexBinary(src);
您正在返回toString()
的{{1}}表示,但您实际需要的是ByteArrayInputStream
变量(因为它将包含解密数据)。
因此,您的buf
方法应返回:
decryptString
注意:当您将// Instead of this: return bais.toString();
// do this:
return new String(buf);
转换为字节,将字节转换回String
时,您可能会面临一些编码问题。为防止这种情况,建议始终使用相同的编码进行两次转换。在这种情况下,您可以执行以下操作(假设您要使用 UTF-8 )。
在String
:
encryptString
在cout.write(src.getBytes("UTF-8")); // instead of cout.write(src.getBytes());
:
decryptString
这适用于任何编码,只要您对两种方法都使用相同。