title: AES Encryption in android and decryption in nodejs
body: <p>I was trying encryption in android and decryption in nodejs server. I generated an AES 128bit key and encrypt it using AES algorithm and then encrypt this generated key using RSA algorithm. Then send both to the server. But while decrypting on the server side, I think the RSA decryption works fine but have a problem in AES decryption. 
  I'm not getting the string in server side that I encrypted on the client side. </p>
  
  <p>This is the code for the encryption on android side: </p>
  
  <pre><code>String encryptedSecretKey;
  String cipherTextString;
  
  // 1. generate secret key using AES
  KeyGenerator keyGenerator = null;
  keyGenerator = KeyGenerator.getInstance("AES");
  keyGenerator.init(128);
  
  // 2. get string which needs to be encrypted
  String text = "This is the message to be encrypted";
  
  // 3. encrypt string using secret key
  byte[] raw = secretKey.getEncoded();
  SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
  Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
  cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
  cipherTextString = Base64.encodeToString(cipher.doFinal(text.getBytes(Charset.forName("UTF-8"))), Base64.DEFAULT);
  
  // 4. get public key
  X509EncodedKeySpec publicSpec = new X509EncodedKeySpec(Base64.decode(publicKeyString, Base64.DEFAULT));
  KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  PublicKey publicKey = keyFactory.generatePublic(publicSpec);
  
  // 5. encrypt secret key using public key
  Cipher cipher2 = Cipher.getInstance("RSA/ECB/OAEPWithSHA1AndMGF1Padding");
  cipher2.init(Cipher.ENCRYPT_MODE, publicKey);
  encryptedSecretKey = Base64.encodeToString(cipher2.doFinal(secretKey.getEncoded()), Base64.DEFAULT);
  </code></pre>
  
  <p>Then send this to the server side. </p>
  
  <p>The code for server side is given below:</p>
  
  <pre><code>var encryptedMessage = req.body.cipherText;
  var encryptedAesKey = req.body.secretKey;
  
  //printing those values
  console.log("\nEncryptedMessage: \n" + encryptedMessage);
  console.log("\nEncrypted key: \n" + encryptedAesKey);
  
  var privateKey = fs.readFileSync('././Keys/privkey_server.pem', "utf8");
  var bufferForAesKey = new Buffer(encryptedAesKey, "base64");
  var obj = {
          key: privateKey
          // , padding: constants.RSA_PKCS1_PADDING
          // , padding: constants.RSA/ECB/OAEPWithSHA-1
  };
  var decryptedAes = crypto.privateDecrypt(obj, bufferForAesKey);
  
  console.log("Decrypted AES: " + decryptedAes);
  
  var decryptedAesKeyString = decryptedAes.toString("base64");
  console.log("Decrypted AES Key: " + decryptedAesKeyString);
  var bufferForAES = new Buffer(decryptedAes, "base64");
  
  //decrypting using AES
  var bufferForEncryptedMsg = new Buffer(encryptedMessage, "base64");
  
  var decipher = crypto.createDecipher('aes-128-cbc',bufferForAES);
  decipher.setAutoPadding(false);
  var dec = decipher.update(bufferForEncryptedMsg,"base64", "utf8");
  dec += decipher.final("utf8");
  console.log(dec);
  </code></pre>
  
  <p>Here the final result 'dec' is not giving the correct result but the intermediate results are same in client and server. That means, RSA works fine but have problem in AES. </p>
  
  <p>The output is given below: </p>
  
  <pre><code>EncryptedMessage: 
  SfosHg+cTrQXYUdF0FuqCJMHgfcP13ckp2L0B9QqOcl8UtWnnl8fLi5lxgR2SKOj
  
  
  Encrypted key: 
  C/pa52PZda3xShrPXkHZx8OL6sW4JBEhG/ggNAoHhSVXIGt+iDq/B1ByG5yStBGF3GFJRQT0aGsG
  +bZJydP7j9gTivmt99H/bxiZan4CHZnqfGKG1dJCI7ILAYZMCw7JhIcRC8qHMM4LMdF+rxRhENDe
  alUfnsLWpcrX9J6fKejJ7EWnWQ1VadKqCDmrJ5xw0lBbsOpwN/vY09+VhF4WkOz8Y3cQGk+FVdz5
  tr4L9/jgXlTZdOC2KVBLSH+9pvtHwMWFKKoDSAzvkil4htBjbWTqlBuEINC4I/J/4P3RX2riT5Pv
  xHQi/Dv7vdBlo9AEdvWe3Ek8oBleIpmIQHXwQWknPOYghhBAVmACG/tbEQcAtbcmRLruT/XzjPJt
  HNBt2HeG9JHYKNoHC3kOuJdnlGe8mv8k0Nzwj04RhEGKSmPIiu/oDgYwS0l96KIlS2ELqBlS5O0L
  AJ+RBG7m0WwC9dfrufsuwu0+SPUmg5/ElXRmA3T81lXtQqQbGg8G6r/bAVFGduy4a49s/VWoylx+
  /sI079IwyY0IOfwQTVGZRyDC5O1ZBjoYv2+TRo3bjG8GXNQoybkmWkhgotcqVD9mXO67D2NBsFPT
  EJnw+1ApSqR7ggIAF+qsMxejFKBICBL/4J8FP4+obA07J1pWiciTRKX+G130qzIBKM08Zdaf/50=
  
  Decrypted AES: %Kp[ϪS�/�W l��9ӊ˽��~��
  B�A�
  Decrypted AES Key: JUtwW8+qU6Mv/FcgbMbkOdOKy72pun4B490KQrRB4QQ=
  T�Ϝ��u��q�
            ���w�p���u`�̗r[`H0[tW��=��~i-�W
  </code></pre>
  
  <p>Here the Decrypted AES key is same as the key that we generate in android. But the final output is not giving the desired result. Is there any error in my code?? </p>