我想从加密文件中读取数据并将解密后的数据存储在本地变量中(不将其保存在文件中)。
所以,当我进行操作时(在同一个类中)cryptingFile - > DecryptFile - >存储:没关系。 但是,当我尝试直接使用加密文件再次运行代码时,我得到了错误" BadPaddingException"。
我不知道发生了什么......
下面是工作代码:
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
generateKey(clef);
CryptingWithSave(Cipher.ENCRYPT_MODE,"db/db.csv",publicKey,"db/db.csv_encrypted");
decrypt_file("db/db.csv_encrypted",publicKey);
System.out.println(tab);
}
public static void generateKey (String clef) throws NoSuchAlgorithmException{
final KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128);
final SecretKey key = keyGen.generateKey();
publicKey= new SecretKeySpec(key.getEncoded(),"AES");
}
public static void CryptingWithSave (int Crypting_METHOD,String inputFile, SecretKeySpec clef, String outputFile) throws NoSuchAlgorithmException, NoSuchPaddingException, BadPaddingException, Exception{
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Crypting_METHOD, clef);
FileInputStream fis = new FileInputStream(inputFile);
FileOutputStream fos = new FileOutputStream(outputFile);
byte[] input = new byte[64];
int bytesRead;
while ((bytesRead = fis.read(input)) != -1) {
byte[] output = cipher.update(input, 0, bytesRead);
if (output != null)
fos.write(output);
}
byte[] output = cipher.doFinal();
if (output != null)
fos.write(output);
fis.close();
fos.flush();
fos.close();
}
public static void decrypt_file (String inputFile, SecretKeySpec clef) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IOException, IllegalBlockSizeException, BadPaddingException{
Cipher cipher2 = Cipher.getInstance("AES");
cipher2.init(Cipher.DECRYPT_MODE, clef);
FileInputStream fis = new FileInputStream(inputFile);
byte[] input = new byte[64];
int bytesRead;
while ((bytesRead = fis.read(input)) != -1) {
byte[] output = cipher2.update(input, 0, bytesRead);
if (output != null)
tab=tab.concat(new String(output));
}
byte[] output = cipher2.doFinal();
if (output != null)
tab=tab.concat(new String(output));
fis.close();
}
在那里,非工作代码(唯一的变化是被注释的CryptingWithSave):
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
generateKey(clef);
//CryptingWithSave(Cipher.ENCRYPT_MODE,"db/db.csv",publicKey,"db/db.csv_encrypted");
decrypt_file("db/db.csv_encrypted",publicKey);
System.out.println(tab);
}
public static void generateKey (String clef) throws NoSuchAlgorithmException{
final KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128);
final SecretKey key = keyGen.generateKey();
publicKey= new SecretKeySpec(key.getEncoded(),"AES");
}
public static void CryptingWithSave (int Crypting_METHOD,String inputFile, SecretKeySpec clef, String outputFile) throws NoSuchAlgorithmException, NoSuchPaddingException, BadPaddingException, Exception{
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Crypting_METHOD, clef);
FileInputStream fis = new FileInputStream(inputFile);
FileOutputStream fos = new FileOutputStream(outputFile);
byte[] input = new byte[64];
int bytesRead;
while ((bytesRead = fis.read(input)) != -1) {
byte[] output = cipher.update(input, 0, bytesRead);
if (output != null)
fos.write(output);
}
byte[] output = cipher.doFinal();
if (output != null)
fos.write(output);
fis.close();
fos.flush();
fos.close();
}
public static void decrypt_file (String inputFile, SecretKeySpec clef) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IOException, IllegalBlockSizeException, BadPaddingException{
Cipher cipher2 = Cipher.getInstance("AES");
cipher2.init(Cipher.DECRYPT_MODE, clef);
FileInputStream fis = new FileInputStream(inputFile);
byte[] input = new byte[64];
int bytesRead;
while ((bytesRead = fis.read(input)) != -1) {
byte[] output = cipher2.update(input, 0, bytesRead);
if (output != null)
tab=tab.concat(new String(output));
}
byte[] output = cipher2.doFinal();
if (output != null)
tab=tab.concat(new String(output));
fis.close();
}
答案 0 :(得分:3)
这是因为下次运行它时会生成一个与前一个不同的新密钥。尝试使用那个旧密钥。