后台:我正在尝试在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);
}
答案 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与接收器交换,以便编码的文本可以被解码。