由于AESLib限制,使用了CBC-NoPadding
对应的Arduino代码:
#include <AESLib.h>
const PROGMEM char HEX_VALUES[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
#define CBLOCK (1 * N_BLOCK) + 1
char serialBuffer[120];
void setup() {
Serial.begin(115200);
}
void loop() {
crypt();
delay(10000);
}
void ByteToHexString(char * hexStrParam, unsigned char * byteArrayParam, unsigned int byteArrayLength)
{
unsigned char num;
for (int i = 0, u = 0; i < byteArrayLength; i++, u++)
{
num = byteArrayParam[i] >> 4;
hexStrParam[u] = (char)pgm_read_byte(HEX_VALUES + num);
num = byteArrayParam[i] & 0xf;
hexStrParam[++u] = (char)pgm_read_byte(HEX_VALUES + num);
}
}
void crypt() {
uint8_t key[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
uint8_t iv[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
char data[16];
aes_context ctx;
char auxBuffer[129];
memset(data, 0x00, 16);
memcpy(data, "0123456789012345", 16);
ctx = aes128_cbc_enc_start((const uint8_t*)key, iv);
aes128_cbc_enc_continue(ctx, data, 16);
aes128_cbc_enc_finish(ctx);
memset(auxBuffer, 0x00, 129);
ByteToHexString(auxBuffer, (unsigned char *)data, sizeof(data));
sprintf(serialBuffer, "encrypted-cbc: %s", auxBuffer);
Serial.println(serialBuffer);
ctx = aes128_cbc_dec_start((const uint8_t*)key, iv);
aes128_cbc_dec_continue(ctx, data, 16);
aes128_cbc_dec_finish(ctx);
sprintf(serialBuffer, "decrypted-cbc: %s", data);
Serial.println(serialBuffer);
memset(auxBuffer, 0x00, 129);
ByteToHexString(auxBuffer, (unsigned char *)iv, sizeof(iv));
sprintf(serialBuffer, "iv: %s", auxBuffer);
Serial.println(serialBuffer);
}
js代码:
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/sha1.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/pad-nopadding-min.js"></script>
<script>
var key = CryptoJS.enc.Hex.parse("000102030405060708090a0b0c0d0e0f");
var iv = key;
var message = '0123456789012345'
var encrypted = CryptoJS.AES.encrypt(message, key, {'iv': iv,'padding': CryptoJS.pad.NoPadding, 'mode': CryptoJS.mode.CBC});
console.log('Encrypted: ' + encrypted.ciphertext.toString(CryptoJS.enc.Hex));
var decrypted = CryptoJS.AES.decrypt(encrypted, key, {'iv': iv,'padding': CryptoJS.pad.NoPadding, 'mode': CryptoJS.mode.CBC});
console.log('Output: ' + decrypted.toString(CryptoJS.enc.Utf8));
</script>
Java代码:
package test;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class AesTest {
public static void main(String[] args) {
String encrypted = encrypt();
System.out.println(encrypted);
}
public static String encrypt() {
try {
byte key[] = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
byte iv[] = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(iv));
byte[] encrypted = cipher.doFinal("0123456789012345".getBytes());
return Hex2Str(encrypted);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
public static String Hex2Str(byte[] hexByteIn){
int len = hexByteIn.length;
String restult = new String();
for(int i =0;i<len;i++)
{
restult += String.format( "%02x",hexByteIn[i] );
}
return restult;
}
}