如何使用AES加密大数据

时间:2014-09-14 09:27:23

标签: arduino aes

后台:我正在尝试在Arduino Uno中加密/解密[使用AES128]的128字节数据。当我尝试加密128字节的数据时,只有128位的数据被加密。因此,在串行监视器中,它显示16字节的加密数据+ 112字节的明文数据。

问题:如何加密整个数据?我是编程新手,我可能需要将数据分成小尺寸,但我不知道该怎么做。

请注意,出于加密和解密的目的,我使用此source使用AES代码。

简化代码:

#include //include headerfile and library for AES

void setup(){
  Serial.begin(9600);
}

void loop(){
  uint8_t key[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
  char data[] = "ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF12345    67890ABCDEF1234567890ABCDEF1234567890";//128 byte
  aes128_enc_single(key, data);
  Serial.println(data);
  aes128_dec_single(key, data);
  Serial.println(data);
  delay(15000);
}

1 个答案:

答案 0 :(得分:3)

该库使用128位密钥和128 块大小。

函数ase128_enc_single(),加密单个块,即16个字符。这与库中记录的一样:

// encrypt single 128bit block. data is assumed to be 16 uint8_t's
// key is assumed to be 128bit thus 16 uint8_t's
void aes128_enc_single(const uint8_t* key, void* data);

完成长字符串的简单方法是使用8个块:

for(size_t ix = 0; ix < 128; ix += 16) {
  aes128_enc_single(key, data+ix);
}

更常见的方法是块链接:

unsigned long sendcount = 0;
uint8_t iv[] = {0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0};

aes128_cbc_enc(key, iv, data, 128);

初始化向量iv应该是随机的,不要在可能的范围内重复。使用简单的计数器,以防止重复。要添加随机位,请使用当前时间,未使用的模拟引脚输入和/或不那么随机的rand()。将所有这些包装到iv中:

unsigned long t = micros();
int a = analogRead(pinConnectedToNothing);
long r = random(0x8fff);
sendcount += 1;
memcpy(iv, &sendcount, 4);
memcpy(iv+6, &t, 4);
memcpy(iv+10, a, 2);
memcpy(iv+12, r, 4);

您必须将iv与接收器交换,以便编码的文本可以被解码。