Functions | |
int | Aes_Encrypt (unsigned char *output, int outlen, unsigned char *input, int inlen, unsigned char *password) |
Ecrypt a block of data using AES. | |
int | Aes_Decrypt (unsigned char *output, int outlen, unsigned char *input, int inlen, unsigned char *password) |
Decrypt a block of AES encrypted data. |
AES is a block cipher adopted for use by the NSA (US government agency). According to Wikipedia, "This marks the first time the public has had access to a cipher approved by the NSA for top secret information." Pretty cool, right? This is a good way to send info privately from your Make Controller over the network, to a web server for example.
AES requires that both sides of communication have access to the same key. So both your Make Controller, and whatever other device it's communicating with need to know about the same password so they can decrypt data that has been encrypted by the other.
There are several different flavors of AES. There are two main ways in which AES libraries differ:
This library uses ECB (Electronic Code Book) chaining, and pads data with a character that corresponds to the number of bytes needed to pad to 16. Check the Wikipedia article for an explanation - http://en.wikipedia.org/wiki/Advanced_Encryption_Standard
The lookup tables used in this library will use somewhere between 8 and 13 kB of program space, depending on the compiler optimization you use. Memory usage is pretty minimal.
Code is used and adapted from Philip J. Erdelsky - see http://www.efgh.com/software/rijndael.htm for the original.
int Aes_Decrypt | ( | unsigned char * | output, | |
int | outlen, | |||
unsigned char * | input, | |||
int | inlen, | |||
unsigned char * | password | |||
) |
Decrypt a block of AES encrypted data.
output | A pointer to the buffer into which the decrypted data will be written. | |
outlen | The maximum number of bytes of data to write into the output buffer. | |
input | A pointer to the encrypted block to be decrytped. | |
inlen | The number of bytes to be decrypted. | |
password | The password, or key, used to encrypt the data. Must be 16 bytes long. |
// first encrypt some data, then decrypt it and make sure we get out what we put in unsigned char cipherbuf[256]; unsigned char plainbuf[256]; unsigned char plaintext[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // our plaintext to encrypt unsigned char secret[] = "A SECRET PASSWORD"; // 16 bytes long int written = Aes_Encrypt(cipherbuf, 256, plaintext, 26, secret); written = Aes_Decrypt(plainbuf, 256, cipherbuf, written, secret); // we now have our original plaintext in plainbuf
int Aes_Encrypt | ( | unsigned char * | output, | |
int | outlen, | |||
unsigned char * | input, | |||
int | inlen, | |||
unsigned char * | password | |||
) |
Ecrypt a block of data using AES.
output | A pointer to the buffer into which the encrypted data will be written. | |
outlen | The maximum number of bytes to write into the output buffer. | |
input | A pointer to the data to be encrypted. | |
inlen | The number of bytes of data to encrypt. | |
password | The password, or key, used to encrypt the data. Must be 16 bytes long. |
#define BUFF_SIZE 256 unsigned char cipherbuf[BUFF_SIZE]; // the buffer that will be written into unsigned char plaintext[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // the text to encrypt unsigned char secret[] = "A SECRET PASSWORD"; // 16 bytes long int written = Aes_Encrypt(cipherbuf, BUFF_SIZE, plaintext, 26, secret);