암호 기술 및 알고리즘을 사용하기 위해 작은 보안 저장 서버 시뮬레이션을 작성 중입니다. 나는 파일 내용의 암호 해독에 갇혔다. 프로젝트는 여기에 모두 넣기에 조금 큽니다. 따라서 코드에서 예외 (사용하는 메소드와 문제가 발생한 위치)를 넣을 것입니다. 파일을 해독하려고하면 BadPaddingException이 발생하는 문제가 있습니다. 내가 대칭 파일 ENC를 사용하려고하고 다른 사람 같이 감속 후 한 때 주요 암호화 로직이 javax.crypto.BadPaddingException : 파일을 복호화 할 때 최종 블록에 적절하게 패딩이 제공되지 않음
public class Crypto {
private Cipher asymmCipher;
//one cipher for asymmetric and one for symmetric
private Cipher symmCipher;
public IvParameterSpec iv;
SecureRandom sr;
KeyGenerator kg;
public Crypto() throws NoSuchAlgorithmException, NoSuchPaddingException {
this.asymmCipher = Cipher.getInstance("RSA");
this.symmCipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
}
/*
Method for symmetric encription of file
*/
public byte[] SymmetricFileEncryption(byte[] file, SecretKey key)
throws InvalidKeyException, IllegalBlockSizeException,
BadPaddingException, NoSuchAlgorithmException {
this.symmCipher.init(Cipher.ENCRYPT_MODE, key);
return this.symmCipher.doFinal(file);
}
/*
Method for symmetric decription of file
*/
public byte[] SymmetricFileDecription(byte[] file, SecretKey key)
throws InvalidKeyException, IllegalBlockSizeException,
BadPaddingException, InvalidAlgorithmParameterException {
this.symmCipher.init(Cipher.DECRYPT_MODE, key);
return this.symmCipher.doFinal(file);
}
/*
Method for write encrypted file
*/
public void writeToFile(File output, byte[] data, SecretKey key)
throws IllegalBlockSizeException, BadPaddingException,
IOException, InvalidKeyException, NoSuchAlgorithmException {
FileOutputStream fos = new FileOutputStream(output);
byte[] encContent = SymmetricFileEncryption(data, key);
fos.write(encContent);
fos.flush();
fos.close();
}
public byte[] readFromFile(File input, SecretKey key)
throws IllegalBlockSizeException, BadPaddingException,
IOException, InvalidKeyException, NoSuchAlgorithmException, InvalidAlgorithmParameterException {
byte[] fileContent = new byte[(int) input.length()];
FileInputStream fis = new FileInputStream(input);
fis.read(fileContent);
fis.close();
return SymmetricFileDecription(fileContent, key);
}
}
을 구현 암호화 클래스의 Excepts : 그것은 잘 작동
String test = "Test symmetric file enc/dec";
byte[] tesT = aCrypto.SymmetricFileEncryption(test.getBytes(), sessionKey);
System.out.println("ENC FROM SERVER " + new String(tesT));
String test2 = new String(aCrypto.SymmetricFileDecription(tesT, sessionKey));
System.out.println("DEC FROM SERVER: " + test2);
.
String test = "Test symmetric file enc/dec";
File fileTest = new File("src/server/testFileEnc");
if(!fileTest.exists()) {
fileTest.createNewFile();
}
aCrypto.writeToFile(fileTest, test.getBytes(), sessionKey);
String decryptedFromFile = new String(aCrypto.readFromFile(fileTest , sessionKey));
System.out.println("DECRYPTED DATA " + decryptedFromFile);
: -
if ("new".equals(option)) {
String fileName = aCrypto.DecryptStringSymmetric((String) ois.readObject(), sessionKey);
System.out.println("FILE NAME SERVER POSLAN IS UPANEL CONTROLLERA : " + fileName);
// String cFileName = aCrypto.EncryptStringSymmetric(fileName, sessionKey);
String formatedEncFileName = aCrypto.encodeWithSHA256(fileName).replaceAll("\\/", "");
File f = new File("src/server/users/" + userName + "/" + formatedEncFileName);
if (!f.exists()) {
f.createNewFile();
System.out.println("FILE CREATED!");
fileNamesMap.put(formatedEncFileName, fileName);
serialize(fileNamesMap);
System.out.println("MAP VALUE FOR " + fileNamesMap.get(formatedEncFileName));
}
byte[] file = aCrypto.SymmetricFileDecription(((byte[]) ois.readObject()), sessionKey);
System.out.println("FILE CONTENT : " + new String(file));
// String encContent = aCrypto.EncryptStringSymmetric(new String(file), sessionKey);
aCrypto.writeToFile(f, file, sessionKey);
oos.writeObject(aCrypto.EncryptStringSymmetric(((f.exists()) ? "true" : "false"), sessionKey));
changeFileWatcher(userName);
}
if (("edit").equals(option)) {
fileName = aCrypto.DecryptStringSymmetric((String) ois.readObject(), sessionKey);
byte[] content = aCrypto.readFromFile(new File(PATH + userName + "/" + (String) getKeyFromValue(fileNamesMap, fileName.split("/")[4])), sessionKey); //Exception in readFromFile
String fileContent = aCrypto.DecryptStringSymmetric(new String(content), sessionKey);
oos.writeObject(aCrypto.EncryptStringSymmetric(fileContent, sessionKey));
System.out.println("NAME FROM SERVER IN EDIT : " + fileName);
}
if (("modify").equals(option)) {
String editedFileContent = aCrypto.DecryptStringSymmetric((String) ois.readObject(), sessionKey);
System.out.println("NAME FROM SERVER IN MODIFY: " + fileName);
String encrytedFileContent = aCrypto.EncryptStringSymmetric(editedFileContent, sessionKey);
File f = new File(PATH + userName + "/" + (String) getKeyFromValue(fileNamesMap, fileName.split("/")[4]));
aCrypto.writeToFile(f, encrytedFileContent.getBytes(), sessionKey);
oos.writeObject(aCrypto.EncryptStringSymmetric("true", sessionKey));
}
또 다른 예를 들어 (내가 읽고 해독 필요로하는 곳에) 새로운 파일 생성 및 편집 파일 서버에서 제외
내가 writeToFile 방법으로 인쇄 및 테스트 쓰기 및 읽기 넣어
출력 :
ENCRYPTED DATA: ×^đzŞĘňmř”›&şH«ťq
DECRYPTED DATA : Test symmetric file enc/dec
BadPaddingException은 대개 데이터가 엉망이되어 버리는 증상입니다. 너가 잘못한 것을 정확히 지적하기 위해서는 물건을 단순화시켜야한다. 먼저 모든 파일 읽기/쓰기 및 다양한 서버 문제없이 암호화 및 복호화가 작동하는지 확인하여 시작하십시오. –
답장을 보내 주셔서 감사합니다. 모든 방법을 테스트했는데 잘 작동하고있는 것으로 보입니다. -/ 내가 추가하고 잘 작동하는 예제를 사용하여 질문을 편집했습니다. 잠시 후 파일을 읽는 중 문제가 발생합니다. -/ – MGKP