問題描述
這是我正在做的事情,看起來有點笨拙,但對于這個問題的任何幫助表示贊賞.我得到一個 BadPaddingException
.閱讀幾乎所有相關主題,但沒有找到合適的解決方案.我是加密解密編程的新手,需要在我的一個 Java 應用程序中實現它.
Here is what I am doing which can look a bit clumsy but any help is appreciated regarding the problem. I'm getting a BadPaddingException
. Read almost all related topics but didn't find the appropriate solution. I am new to encryption decryption programming and need to implement it in one of my Java application.
謝謝你..這就是代碼的樣子......
Thank You.. this is how the code looks....
public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
// TODO Auto-generated method stub
String FileName="encryptedtext.txt";
String FileName2="decryptedtext.txt";
String pad="0";
KeyGenerator KeyGen=KeyGenerator.getInstance("AES");
KeyGen.init(128);
SecretKey SecKey=KeyGen.generateKey();
Cipher AesCipher=Cipher.getInstance("AES");
AesCipher.init(Cipher.ENCRYPT_MODE,SecKey);
byte[] byteText="My name is yogesh".getBytes();
byte[] byteCipherText=AesCipher.doFinal(byteText);
String cipherText = null;
try {
FileWriter fw=new FileWriter(FileName);
BufferedWriter bw=new BufferedWriter(fw);
bw.write(byteCipherText.toString());
bw.close();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
FileReader fr=new FileReader(FileName);
BufferedReader br=new BufferedReader(fr);
cipherText=br.readLine();
br.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
AesCipher.init(Cipher.DECRYPT_MODE,SecKey);
while(((cipherText.getBytes().length)%16)!=0)
{
cipherText=cipherText+pad;
}
byte[] bytePlainText=AesCipher.doFinal(cipherText.getBytes());
FileWriter fw1;
try {
fw1 = new FileWriter(FileName2);
BufferedWriter bw1=new BufferedWriter(fw1);
bw1.write(bytePlainText.toString());
bw1.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
推薦答案
這里你要明白的是,密文可能包含不可打印的字符.因此,當您使用 readLine() 時,它可能不會為您提供文件中的所有字節.
Here, what you have to understand is that cipher text may contain non-printable characters. So, when you use readLine(), it will likely not give you all of the bytes in the file.
另外,byteCipherText.toString()
并沒有給你你認為你會得到的東西.在java中,toString()
方法不給出數組內容的字符串表示.
Also, byteCipherText.toString()
does not give you what you thought you would get. In java, the toString()
method does not give the string representation of the contents of the array.
無需為加密文本添加填充.它已經被填充了.
There is no need to add padding to encrypted text. It is already padded.
import java.nio.file.Files;
import java.nio.file.Paths;
import javax.crypto.*;
public class Main {
public static void main(String[] args) throws Exception {
String fileName = "encryptedtext.txt";
String fileName2 = "decryptedtext.txt";
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128);
SecretKey secKey = keyGen.generateKey();
Cipher aesCipher = Cipher.getInstance("AES");
byte[] byteText = "Your Plain Text Here".getBytes();
aesCipher.init(Cipher.ENCRYPT_MODE, secKey);
byte[] byteCipherText = aesCipher.doFinal(byteText);
Files.write(Paths.get(fileName), byteCipherText);
byte[] cipherText = Files.readAllBytes(Paths.get(fileName));
aesCipher.init(Cipher.DECRYPT_MODE, secKey);
byte[] bytePlainText = aesCipher.doFinal(cipherText);
Files.write(Paths.get(fileName2), bytePlainText);
}
}
這篇關于使用 Java 進行 AES 加密和解密的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!