Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
A simple example of using AES encryption in Java and C.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
* MCrypt API available online:
* http://linux.die.net/man/3/mcrypt
*/
#include <mcrypt.h>
#include <math.h>
#include <stdint.h>
#include <stdlib.h>
int encrypt(
void* buffer,
int buffer_len, /* Because the plaintext could include null bytes*/
char* IV,
char* key,
int key_len
){
MCRYPT td = mcrypt_module_open("rijndael-128", NULL, "cbc", NULL);
int blocksize = mcrypt_enc_get_block_size(td);
if( buffer_len % blocksize != 0 ){return 1;}
mcrypt_generic_init(td, key, key_len, IV);
mcrypt_generic(td, buffer, buffer_len);
mcrypt_generic_deinit (td);
mcrypt_module_close(td);
return 0;
}
int decrypt(
void* buffer,
int buffer_len,
char* IV,
char* key,
int key_len
){
MCRYPT td = mcrypt_module_open("rijndael-128", NULL, "cbc", NULL);
int blocksize = mcrypt_enc_get_block_size(td);
if( buffer_len % blocksize != 0 ){return 1;}
mcrypt_generic_init(td, key, key_len, IV);
mdecrypt_generic(td, buffer, buffer_len);
mcrypt_generic_deinit (td);
mcrypt_module_close(td);
return 0;
}
void display(char* ciphertext, int len){
int v;
for (v=0; v<len; v++){
printf("%d ", ciphertext[v]);
}
printf("\n");
}
int main()
{
MCRYPT td, td2;
char * plaintext = "test text 123";
char* IV = "AAAAAAAAAAAAAAAA";
char *key = "0123456789abcdef";
int keysize = 16; /* 128 bits */
char* buffer;
int buffer_len = 16;
buffer = calloc(1, buffer_len);
strncpy(buffer, plaintext, buffer_len);
printf("==C==\n");
printf("plain: %s\n", plaintext);
encrypt(buffer, buffer_len, IV, key, keysize);
printf("cipher: "); display(buffer , buffer_len);
decrypt(buffer, buffer_len, IV, key, keysize);
printf("decrypt: %s\n", buffer);
return 0;
}
import java.security.MessageDigest;
import java.util.Arrays;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class AES {
static String IV = "AAAAAAAAAAAAAAAA";
static String plaintext = "test text 123\0\0\0"; /*Note null padding*/
static String encryptionKey = "0123456789abcdef";
public static void main(String [] args) {
try {
System.out.println("==Java==");
System.out.println("plain: " + plaintext);
byte[] cipher = encrypt(plaintext, encryptionKey);
System.out.print("cipher: ");
for (int i=0; i<cipher.length; i++)
System.out.print(new Integer(cipher[i])+" ");
System.out.println("");
String decrypted = decrypt(cipher, encryptionKey);
System.out.println("decrypt: " + decrypted);
} catch (Exception e) {
e.printStackTrace();
}
}
public static byte[] encrypt(String plainText, String encryptionKey) throws Exception {
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding", "SunJCE");
SecretKeySpec key = new SecretKeySpec(encryptionKey.getBytes("UTF-8"), "AES");
cipher.init(Cipher.ENCRYPT_MODE, key,new IvParameterSpec(IV.getBytes("UTF-8")));
return cipher.doFinal(plainText.getBytes("UTF-8"));
}
public static String decrypt(byte[] cipherText, String encryptionKey) throws Exception{
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding", "SunJCE");
SecretKeySpec key = new SecretKeySpec(encryptionKey.getBytes("UTF-8"), "AES");
cipher.init(Cipher.DECRYPT_MODE, key,new IvParameterSpec(IV.getBytes("UTF-8")));
return new String(cipher.doFinal(cipherText),"UTF-8");
}
}
@rwst

This comment has been minimized.

Show comment Hide comment
@rwst

rwst Jul 30, 2013

Defining full 8-bit byte data like the key and IV as ASCII strings, hoping they get magically converted by the compiler, will lead to unexpected results. Secondly, the buffer, when decrypted, certainly won't have a 0 byte at the end, so printing it as is, even if it is printable, will get another unexpected result.

The reason I'm writing this contrary to simply patching is people with homework will find this page and learn nothing from it otherwise.

rwst commented Jul 30, 2013

Defining full 8-bit byte data like the key and IV as ASCII strings, hoping they get magically converted by the compiler, will lead to unexpected results. Secondly, the buffer, when decrypted, certainly won't have a 0 byte at the end, so printing it as is, even if it is printable, will get another unexpected result.

The reason I'm writing this contrary to simply patching is people with homework will find this page and learn nothing from it otherwise.

@ritwikgoud

This comment has been minimized.

Show comment Hide comment
@ritwikgoud

ritwikgoud Oct 30, 2013

thanx alot!!

thanx alot!!

@vandervidi

This comment has been minimized.

Show comment Hide comment
@vandervidi

vandervidi Nov 29, 2013

thanx! just what i need

thanx! just what i need

@hhhhhhitman47

This comment has been minimized.

Show comment Hide comment
@hhhhhhitman47

hhhhhhitman47 Mar 13, 2014

good work.... thanks, what about Aes serpant, Aes twofish method..

good work.... thanks, what about Aes serpant, Aes twofish method..

@doomboss

This comment has been minimized.

Show comment Hide comment
@doomboss

doomboss Mar 27, 2014

Thank you so much for sharing this! :D

Thank you so much for sharing this! :D

@manimuttu

This comment has been minimized.

Show comment Hide comment
@manimuttu

manimuttu Jun 24, 2014

after getting the cipher, which is encrypted byte[]. am converting it into
cipherString = new String(cipher, "UTF-8");
and again am sending it as
decrypt(cipherString.getBytes("UTF-8"), encryptionKey);
but its giving javax.crypto.IllegalBlockSizeException: Input length not multiple of 16 bytes
exception please give a solution.

Note: In any cost i want cipher in String format first, then i need to pass it as getBytes();
please suggest.

after getting the cipher, which is encrypted byte[]. am converting it into
cipherString = new String(cipher, "UTF-8");
and again am sending it as
decrypt(cipherString.getBytes("UTF-8"), encryptionKey);
but its giving javax.crypto.IllegalBlockSizeException: Input length not multiple of 16 bytes
exception please give a solution.

Note: In any cost i want cipher in String format first, then i need to pass it as getBytes();
please suggest.

@PRKarthik007

This comment has been minimized.

Show comment Hide comment
@PRKarthik007

PRKarthik007 Jul 7, 2014

@ manimuttu..Use PKCS5Padding instead Nopadding..

@ manimuttu..Use PKCS5Padding instead Nopadding..

@PRKarthik007

This comment has been minimized.

Show comment Hide comment
@PRKarthik007

PRKarthik007 Jul 7, 2014

Hi,,

Am getting an error when i am Decrypting a capital letter(am not sure..)..
error..

javax.crypto.BadPaddingException: Given final block not properly padded

Hi,,

Am getting an error when i am Decrypting a capital letter(am not sure..)..
error..

javax.crypto.BadPaddingException: Given final block not properly padded

@krishna81m

This comment has been minimized.

Show comment Hide comment
@krishna81m

krishna81m Oct 25, 2014

Curious, if you have set all those UTF-8 encoding explicitly or would a -Dfile.encoding=UTF8 system argument suffice?

Curious, if you have set all those UTF-8 encoding explicitly or would a -Dfile.encoding=UTF8 system argument suffice?

@Robsoares00

This comment has been minimized.

Show comment Hide comment
@Robsoares00

Robsoares00 Oct 31, 2014

Hi, I am interested in that sample because i need for my thesis. But i can't dowload the correct lib. I need the mcrypt.c and mcrypt.h right? and i don't know. The files that i downloaded do not match...

Can you help me?

I really appreciate some help..

Thank's

Hi, I am interested in that sample because i need for my thesis. But i can't dowload the correct lib. I need the mcrypt.c and mcrypt.h right? and i don't know. The files that i downloaded do not match...

Can you help me?

I really appreciate some help..

Thank's

@caoyang1024

This comment has been minimized.

Show comment Hide comment
@caoyang1024

caoyang1024 Feb 12, 2015

Thank you for this. I have 2 questions

  1. I got an error says: Input length not multiple of 16 bytes. Can I change the padding to 'AES/CBC/PKCS5Padding' ?

  2. Should I change the IV ' static String IV = "AAAAAAAAAAAAAAAA";' to another value?

Thank you for this. I have 2 questions

  1. I got an error says: Input length not multiple of 16 bytes. Can I change the padding to 'AES/CBC/PKCS5Padding' ?

  2. Should I change the IV ' static String IV = "AAAAAAAAAAAAAAAA";' to another value?

@jouini1311

This comment has been minimized.

Show comment Hide comment
@jouini1311

jouini1311 Apr 21, 2015

Thank you for this post

Thank you for this post

@Shardss

This comment has been minimized.

Show comment Hide comment
@Shardss

Shardss May 3, 2015

I tried using this example but it doesn't work. I read the first comment and started doing corrections: the key and the IV seem fine to me (he's doing a .getBytes() call, where's the problem? Is this not a conversion?) and for adding the 0 byte at the end of the buffer, I altered the decryption function to:

public String decrypt(byte[] cipherText, String encryptionKey, String IV) throws Exception
{
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding", "SunJCE");
SecretKeySpec key = new SecretKeySpec(encryptionKey.getBytes("UTF-8"), "AES");
cipher.init(Cipher.DECRYPT_MODE, key,new IvParameterSpec(IV.getBytes("UTF-8")));

byte[] buff = cipher.doFinal(cipherText);
byte[] res = new byte[buff.length +1];
for(byte i=0; i<buff.length; i++)
{res[i] = buff[i];}
res[res.length-1] = 0;

return new String(res,"UTF-8");
}

It still doesn't work and returns gibberish. Can someone please help :S?

Shardss commented May 3, 2015

I tried using this example but it doesn't work. I read the first comment and started doing corrections: the key and the IV seem fine to me (he's doing a .getBytes() call, where's the problem? Is this not a conversion?) and for adding the 0 byte at the end of the buffer, I altered the decryption function to:

public String decrypt(byte[] cipherText, String encryptionKey, String IV) throws Exception
{
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding", "SunJCE");
SecretKeySpec key = new SecretKeySpec(encryptionKey.getBytes("UTF-8"), "AES");
cipher.init(Cipher.DECRYPT_MODE, key,new IvParameterSpec(IV.getBytes("UTF-8")));

byte[] buff = cipher.doFinal(cipherText);
byte[] res = new byte[buff.length +1];
for(byte i=0; i<buff.length; i++)
{res[i] = buff[i];}
res[res.length-1] = 0;

return new String(res,"UTF-8");
}

It still doesn't work and returns gibberish. Can someone please help :S?

@NitinLnt

This comment has been minimized.

Show comment Hide comment
@NitinLnt

NitinLnt Jun 10, 2015

Please tell me the procedure of compilation. I tried but could not include mcrypt file
getting this error:
root@sysadmin-OptiPlex-7010:/home/sysadmin/Workspace/g# gcc -o a AES.c
AES.c:9:20: fatal error: mcrypt.h: No such file or directory
#include <mcrypt.h>
^
compilation terminated.

Please tell me the procedure of compilation. I tried but could not include mcrypt file
getting this error:
root@sysadmin-OptiPlex-7010:/home/sysadmin/Workspace/g# gcc -o a AES.c
AES.c:9:20: fatal error: mcrypt.h: No such file or directory
#include <mcrypt.h>
^
compilation terminated.

@gurudath

This comment has been minimized.

Show comment Hide comment
@gurudath

gurudath Jun 11, 2015

Please see my blog , you can find step by step implementation of aes-cipher-encryption-decryption-algorithms https://gurudathbn.wordpress.com/2015/02/04/aes-cipher-encryption-decryption-algorithms-using-ruby-on-rails/ for clear solution for ruby on rails

Please see my blog , you can find step by step implementation of aes-cipher-encryption-decryption-algorithms https://gurudathbn.wordpress.com/2015/02/04/aes-cipher-encryption-decryption-algorithms-using-ruby-on-rails/ for clear solution for ruby on rails

@xeno6696

This comment has been minimized.

Show comment Hide comment
@xeno6696

xeno6696 Aug 6, 2015

Please note that this implementation isn't secure... its simple and quick. It has a weakness:

https://cwe.mitre.org/data/definitions/329.html

xeno6696 commented Aug 6, 2015

Please note that this implementation isn't secure... its simple and quick. It has a weakness:

https://cwe.mitre.org/data/definitions/329.html

@xeno6696

This comment has been minimized.

Show comment Hide comment
@xeno6696

xeno6696 Aug 6, 2015

Java doesn't use "\0" for null bytes either.

static String plaintext = "test text 123\0\0\0"; /*Note null padding*/
should be
static String plaintext = "test text 123\u0000\u0000\u0000"; /*Note null padding*/

xeno6696 commented Aug 6, 2015

Java doesn't use "\0" for null bytes either.

static String plaintext = "test text 123\0\0\0"; /*Note null padding*/
should be
static String plaintext = "test text 123\u0000\u0000\u0000"; /*Note null padding*/

@Dhevasenapathi

This comment has been minimized.

Show comment Hide comment
@Dhevasenapathi

Dhevasenapathi Dec 18, 2015

Is it possible to include encryption in embedded c code.

Is it possible to include encryption in embedded c code.

@codingalpha

This comment has been minimized.

Show comment Hide comment
@codingalpha

codingalpha Mar 16, 2016

Also you can check this C Program To Encrypt and Decrypt Text Files using Caesar Cipher's Text!
Link: http://www.codingalpha.com/file-handling-program-to-encrypt-and-decrypt-in-c-programming/

Also you can check this C Program To Encrypt and Decrypt Text Files using Caesar Cipher's Text!
Link: http://www.codingalpha.com/file-handling-program-to-encrypt-and-decrypt-in-c-programming/

@ymanzon

This comment has been minimized.

Show comment Hide comment
@ymanzon

ymanzon Jun 14, 2016

excelent post!

ymanzon commented Jun 14, 2016

excelent post!

@darill

This comment has been minimized.

Show comment Hide comment
@darill

darill Jul 17, 2016

god afternoonmm please l am a student at level 4 in security... and our teacher ask us to write a software on an AES encryption system with a graphical user interface using java... so how can l start please

darill commented Jul 17, 2016

god afternoonmm please l am a student at level 4 in security... and our teacher ask us to write a software on an AES encryption system with a graphical user interface using java... so how can l start please

@Thuetar

This comment has been minimized.

Show comment Hide comment
@Thuetar

Thuetar Aug 12, 2016

Don't know about everyone else, but I love doing someone's homework.
@darill can you please give us some more details regarding your homework?

Thuetar commented Aug 12, 2016

Don't know about everyone else, but I love doing someone's homework.
@darill can you please give us some more details regarding your homework?

@Noe007

This comment has been minimized.

Show comment Hide comment
@Noe007

Noe007 Sep 2, 2016

Thanks:)

Noe007 commented Sep 2, 2016

Thanks:)

@AhmedMkadem

This comment has been minimized.

Show comment Hide comment
@AhmedMkadem

AhmedMkadem Dec 11, 2016

Can any body explain to me how to use the mcrypt API? Thanks in advance

Can any body explain to me how to use the mcrypt API? Thanks in advance

@klgopal

This comment has been minimized.

Show comment Hide comment
@klgopal

klgopal Feb 14, 2017

pls can anyone confirm if rijndael-128 used in C implementation is AES 256 bit encryption or not.

will the same prog work with keysize as 32 instead of 16 in c program.

klgopal commented Feb 14, 2017

pls can anyone confirm if rijndael-128 used in C implementation is AES 256 bit encryption or not.

will the same prog work with keysize as 32 instead of 16 in c program.

@shai1esh

This comment has been minimized.

Show comment Hide comment
@shai1esh

shai1esh Mar 27, 2017

can you modify the code using new libraries as mcrypt.h is abandoned...!

can you modify the code using new libraries as mcrypt.h is abandoned...!

@mootensai

This comment has been minimized.

Show comment Hide comment
@mootensai

mootensai Apr 10, 2017

Sorry, i'm a noob here, could someone explain why the cipher text is integer?? If I encrypt use PHP, the output is letters and special chars.
How to make output letters and special chars??

Sorry, i'm a noob here, could someone explain why the cipher text is integer?? If I encrypt use PHP, the output is letters and special chars.
How to make output letters and special chars??

@melvyniandrag

This comment has been minimized.

Show comment Hide comment
@melvyniandrag

melvyniandrag Nov 7, 2017

@rwst I don't know what you mean about the the defining full 8 bit byte data and waiting for compiler magic? I think youre referring to passing char* to int mcrypt_generic_init( MCRYPT td, void *key, int lenofkey, void *IV);? Anyway who cares. At the end of the day I don't know of anyone using mcrypt, I've only seen gcrypt in production.

http://mcrypt.hellug.gr/lib/mcrypt.3.html

melvyniandrag commented Nov 7, 2017

@rwst I don't know what you mean about the the defining full 8 bit byte data and waiting for compiler magic? I think youre referring to passing char* to int mcrypt_generic_init( MCRYPT td, void *key, int lenofkey, void *IV);? Anyway who cares. At the end of the day I don't know of anyone using mcrypt, I've only seen gcrypt in production.

http://mcrypt.hellug.gr/lib/mcrypt.3.html

@22karthik

This comment has been minimized.

Show comment Hide comment
@22karthik

22karthik Dec 12, 2017

Hi
I am getting mcrypt.h file not found.Please let me know how to use mycrypt.h api

Hi
I am getting mcrypt.h file not found.Please let me know how to use mycrypt.h api

@akshay0297

This comment has been minimized.

Show comment Hide comment
@akshay0297

akshay0297 Feb 14, 2018

If you are using Ubuntu add related mcrypt libraries using the command sudo apt-get install libmcrypt-dev

akshay0297 commented Feb 14, 2018

If you are using Ubuntu add related mcrypt libraries using the command sudo apt-get install libmcrypt-dev

@Hansum

This comment has been minimized.

Show comment Hide comment
@Hansum

Hansum Feb 19, 2018

How can we use the MCRYPT API? PLSS REPLY ASAP :(

Hansum commented Feb 19, 2018

How can we use the MCRYPT API? PLSS REPLY ASAP :(

@chandralakagwad

This comment has been minimized.

Show comment Hide comment
@chandralakagwad

chandralakagwad Mar 8, 2018

Thank you.. Your post was really helpful

Thank you.. Your post was really helpful

@chandralakagwad

This comment has been minimized.

Show comment Hide comment
@chandralakagwad

chandralakagwad Mar 8, 2018

If I want to encrypt the whole file instead of just a single sentence. What modification is required in the code? and How can we get the secret key? Its not displayed in the output.

If I want to encrypt the whole file instead of just a single sentence. What modification is required in the code? and How can we get the secret key? Its not displayed in the output.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment