title: AES - simple encrypt in Java, decrypt with openssl
body: <p>I am trying to do a simple AES encryption in Java, using Java Cryto, that can then be decrypted in ObjectiveC, using OpenSSL.</p>
  
  <p>as I am not doing the ObjectiveC side, I want to make sure it works, using the openSSL command line, but I always get "bad magic number"</p>
  
  <p>Here is my Java code</p>
  
  <pre><code>public class EncryptionUtils {
  
  private static final String AES_CIPHER_METHOD = "AES";
  private static final int AES_KEY_SIZE = 128;
  
  public static byte[] generateAesKey() throws NoSuchAlgorithmException {
      KeyGenerator keyGenerator = KeyGenerator.getInstance(AES_CIPHER_METHOD);
      keyGenerator.init(AES_KEY_SIZE);
      SecretKey key = keyGenerator.generateKey();
      return key.getEncoded();
  }
  
  public static SecretKeySpec createAesKeySpec(byte[] aesKey) {
      return new SecretKeySpec(aesKey, AES_CIPHER_METHOD);
  }
  
  public static void aesEncryptFile(File in, File out, SecretKeySpec aesKeySpec) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IOException {
      Cipher aesCipher = Cipher.getInstance(AES_CIPHER_METHOD);
      aesCipher.init(Cipher.ENCRYPT_MODE, aesKeySpec);
      InputStream inputStream = new FileInputStream(in);
      try {
          OutputStream outputStream = new CipherOutputStream(new FileOutputStream(out), aesCipher);
          try {
              IOUtils.copy(inputStream , outputStream);
          } finally {
              outputStream.close();
          }
      } finally {
          inputStream.close();
      }
  }
  }
  
  
  //testcode
  @Test
  public void testAesEncryptFile() throws IOException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException {
      byte[] aesKey = EncryptionUtils.generateAesKey();
      SecretKeySpec aesKeySpec = EncryptionUtils.createAesKeySpec(aesKey);
      EncryptionUtils.aesEncryptFile(new File("C:\\test\\test.txt"), new File("C:\\test\\test-encrypted.txt"), aesKeySpec);
  
      FileOutputStream outputStream = new FileOutputStream("C:\\test\\aes.key");
      outputStream.write(aesKey);
      outputStream.close();
  }
  
  @Test
  public void testAesDecryptFile() throws IOException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException {
      FileInputStream keyFis = new FileInputStream("C:\\test\\aes.key");
      ByteArrayOutputStream keyBaos = new ByteArrayOutputStream();
      IOUtils.copy(keyFis, keyBaos);
  
      SecretKeySpec keySpec = new SecretKeySpec(keyBaos.toByteArray(), "AES");
      Cipher cipher = Cipher.getInstance("AES");
      cipher.init(Cipher.DECRYPT_MODE, keySpec);
  
      FileInputStream fileInputStream = new FileInputStream("C:\\test\\test-encrypted.txt");
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      IOUtils.copy(fileInputStream, baos);
  
      byte[] decrypted = cipher.doFinal(baos.toByteArray());
      FileOutputStream outputStream = new FileOutputStream("C:\\test\\test-decrypted.txt");
      outputStream.write(decrypted);
      outputStream.close();
  
  }
  </code></pre>
  
  <p>Now that runs as expected, file "test-encrypted.txt" is indeed encrypted, and "test-decrypted.txt" == "test.txt"</p>
  
  <p>I then tried to run a decryption on the command line using OpenSSL</p>
  
  <pre><code>openssl enc -d -aes-128-ecb -in test-encrypted.txt -k aes.key
  </code></pre>
  
  <p>however, this always give me </p>
  
  <pre><code>bad magic number
  </code></pre>
  
  <p>From what I can see, the using algorithm "AES" in Java uses "ECB" mode by default, so the above should work. What am I doing wrong.</p>