2017-11-05 10 views
0

암호 기술 및 알고리즘을 사용하기 위해 작은 보안 저장 서버 시뮬레이션을 작성 중입니다. 나는 파일 내용의 암호 해독에 갇혔다. 프로젝트는 여기에 모두 넣기에 조금 큽니다. 따라서 코드에서 예외 (사용하는 메소드와 문제가 발생한 위치)를 넣을 것입니다. 파일을 해독하려고하면 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 
+1

BadPaddingException은 대개 데이터가 엉망이되어 버리는 증상입니다. 너가 잘못한 것을 정확히 지적하기 위해서는 물건을 단순화시켜야한다. 먼저 모든 파일 읽기/쓰기 및 다양한 서버 문제없이 암호화 및 복호화가 작동하는지 확인하여 시작하십시오. –

+0

답장을 보내 주셔서 감사합니다. 모든 방법을 테스트했는데 잘 작동하고있는 것으로 보입니다. -/ 내가 추가하고 잘 작동하는 예제를 사용하여 질문을 편집했습니다. 잠시 후 파일을 읽는 중 문제가 발생합니다. -/ – MGKP

답변

0

마지막으로 내가 찾은 문제. 문제는 내가 조금 바보입니다 :) 새 사용자가있을 때마다 새 세션 키가 생성된다는 것을 잊었습니다. 따라서 특정 사용자와 암호화 된 파일을 만들었더라도 응용 프로그램을 다시 시작한 후에는 새 3DES 키가 제공되고 그 새 키로 다른 3DES 키로 암호화 된 파일의 암호를 해독하려고합니다. 서버에 세션 키를 저장하고 특정 사용자에 대해 동일한 키를 사용해야합니다.

+0

이제 패딩 오류가 잘못되었음을 알고 있기 때문에 일반적으로 해독에 실패했습니다. 16 년 전에 AES가 승인되었으며 3DES가 ​​아직 사용되고 있습니까? 바라기를 24 바이트 키. – zaph

+0

예, 이제 알았습니다. 처음에는 나쁜 키 문제라고 생각하지 않았지만 분명히 잘못되었습니다. 나는 실제로 AES를 사용하고 있지만, 절망에서 3DES로 바꿨다. – MGKP