使用AES解密

时间:2019-07-16 10:29:31

标签: utf-8 aes raspberry-pi3

我正在使用AES库将arduino端的加密数据发送到树莓派pi.arduino串行监视器上打印的加密数据与树莓派上打印的数据不同。 也许是解码问题。

在覆盆子pi端解密时,还会出现一条错误消息:“输入文本的长度必须是16的倍数”,当我将输入(温度数据)填充为零时,它仍然会给出相同的错误消息。

我尝试使用'utf-8'和'iso-8859-1'进行解码,但仍然无法显示相同的解密数据。

PYTHON代码:

 from Crypto.Cipher import AES
 ser=serial.Serial(' /dev/ttyS0',9600)
 st=ser.readline()
 st1=st.decode('utf-8')
 obj = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')
 ciphertext = obj.encrypt(message)

 obj2 = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')
 obj2.decrypt(ciphertext)

ARDUINO代码:

void aesTest (int bits)
{
aes.iv_inc();

byte iv [N_BLOCK] ;
int plainPaddedLength = sizeof(chartemp) + (N_BLOCK - ((sizeof(chartemp)-1) % 16)); 
byte cipher [plainPaddedLength];
byte check [plainPaddedLength]; 


aes.set_IV(myIv);
aes.get_IV(iv);

aes.do_aes_encrypt(chartemp,sizeof(chartemp),cipher,key,bits,iv);


aes.set_IV(myIv);
aes.get_IV(iv);


aes.printArray(cipher,(bool)false); //print cipher with padding
String cipher1=String((char*)cipher);

myserial.println(cipher1);

}

HERE chartemp是LM35 IC转换为字符阵列的温度。

我希望树莓派的输出能够正确解密

1 个答案:

答案 0 :(得分:0)

加密的数据是伪随机字节序列。这不是有效的UTF-8字符串。

此行有点不可靠,但从技术上讲可能是“有效的”:

String cipher1=String((char*)cipher);

但是这一行是不正确的:

st1=st.decode('utf-8')

您不能获取随机数据并将其解码为utf-8。您要么仅以字节字符串的形式发送和接收数据,要么将数据编码为字符串,例如使用Base64。我怀疑您会更喜欢后者,因此请查看Java中的Base64和Python中的base64