2015-01-25 1 views
0

파일을 암호화하고 해독 할 수있는 몇 가지 방법이 있습니다. 내가 아는 한 내 암호화 기능은 훌륭하게 작동하지만 해독은 대개 InvalidKeyException, 특히 Cipher.getInstance("AES"); 비트를 던졌습니다. 나는 이걸 RSA에서 "RSA/CBC/PKCS5Padding"으로 바꾸었지만 지금까지 아무 일도 없었다.AES 키를 해독하는 중에 잘못된 키 예외가 발생했습니다.

주요 기능 :

static String inFile = ""; 
    static String outFile = ""; 
    static String hexKey=""; 
    static String keyStore; 
    static String keyName; 

    public static void main(String[] args) { 

     if (args.length==5 && args[0].equals("-encRSA")) { 
      keyStore = args[1]; 
      keyName = args[2]; 
      inFile = args[3]; 
      outFile = args[4]; 
      encryptRSA(); 
     } else if (args.length==5 && args[0].equals("-decRSA")) { 
      keyStore = args[1]; 
      keyName = args[2]; 
      inFile = args[3]; 
      outFile = args[4]; 
      decryptRSA(); 
     } else { 
      System.out.println("This is a simple program to encrypt and decrypt files"); 
      System.out.println("Usage: "); 
      System.out.println(" -encRSA <keyStore> <keyName> <inputFile> <outputFile>   RSA encrypt"); 
      System.out.println(" -decRSA <keyStore> <keyName> <inputFile> <outputFile>   RSA decrypt"); 
    } 

암호화 기능 (지금까지)

private static void encryptRSA() { 
     try { 
      //Get the public key from the keyStore and set up the Cipher object 
      PublicKey publicKey = getPubKey(keyStore,keyName); 
      Cipher rsaCipher = Cipher.getInstance("RSA"); 
      rsaCipher.init(Cipher.ENCRYPT_MODE, publicKey); 

      //Read the plainText 
      System.out.println("Loading plaintext file: "+inFile); 
      RandomAccessFile rawDataFromFile = new RandomAccessFile(inFile, "r"); 
      byte[] plainText = new byte[(int)rawDataFromFile.length()]; 
      rawDataFromFile.read(plainText); 

      // Generate a symmetric key to encrypt the data and initiate the AES Cipher Object 
      System.out.println("Generating AES key"); 
      KeyGenerator sKenGen = KeyGenerator.getInstance("AES"); //ECB is fine here 
      Key aesKey = sKenGen.generateKey(); 
      Cipher aesCipher = Cipher.getInstance("AES"); 
      aesCipher.init(Cipher.ENCRYPT_MODE, aesKey); 

      // Encrypt the symmetric AES key with the public RSA key 
      System.out.println("Encrypting Data"); 
      byte[] encodedKey = rsaCipher.doFinal(aesKey.getEncoded()); 
      // Encrypt the plaintext with the AES key 
      byte[] cipherText = aesCipher.doFinal(plainText); 

      //Write the encrypted AES key and Ciphertext to the file. 
      System.out.println("Writting to file: "+outFile); 
      FileOutputStream outToFile = new FileOutputStream(outFile); 
      outToFile.write(encodedKey); 
      outToFile.write(cipherText); 

      System.out.println("Closing Files"); 
      rawDataFromFile.close(); 
      outToFile.close(); 
     } 
     catch (Exception e) { 
      System.out.println("Doh: "+e); 
     } 
    } 

해독 기능 :

private static void decryptRSA() 
    { 
     FileInputStream cipherfile; 
     try { 
      cipherfile = new FileInputStream(inFile); 

     byte[] ciphertext = new byte[cipherfile.available()]; 

     PrivateKey privatekey = getKeyPair().getPrivate(); 

     /* Create cipher for decryption. */ 

     Cipher decrypt_cipher = Cipher.getInstance("AES"); 
     decrypt_cipher.init(Cipher.DECRYPT_MODE, privatekey); 

     /* Reconstruct the plaintext message. */ 


     byte[] plaintext = decrypt_cipher.doFinal(ciphertext); 
     FileOutputStream plainfile = new FileOutputStream(outFile); 
     plainfile.write(plaintext); 
     plainfile.close(); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

private static KeyPair getKeyPair() throws Exception 
    { 
     KeyPair keypair = null; 
     FileInputStream is = new FileInputStream(keyStore); 
     KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); 
     keystore.load(is, password.toCharArray()); 
     Key key = keystore.getKey(keyName, password.toCharArray()); 
     if (key instanceof PrivateKey) { 
      Certificate cert = keystore.getCertificate(keyName); 
      PublicKey publicKey = cert.getPublicKey(); 
      keypair = new KeyPair(publicKey, (PrivateKey) key); 
     } 
     return keypair; 
    } 

답변

1

당신은 암호 해독 프로세스를 코드에 암호화 프로세스를 반대로해야합니다. 현재 RSA를 사용하여 AES 키를 암호화 한 다음 AES를 사용하여 일반 텍스트를 암호문으로 암호화하고 있습니다.

해독 과정에서 AES를 사용하여 암호문을 해독하고 해독합니다. 먼저 암호화 된 AES 키를 추출하고 해독 한 다음 AES를 사용하여 (나머지) 암호문을 해독하여 일반 텍스트를 검색해야합니다.

관련 문제