我正在使用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转换为字符阵列的温度。
我希望树莓派的输出能够正确解密
答案 0 :(得分:0)
加密的数据是伪随机字节序列。这不是有效的UTF-8字符串。
此行有点不可靠,但从技术上讲可能是“有效的”:
String cipher1=String((char*)cipher);
但是这一行是不正确的:
st1=st.decode('utf-8')
您不能获取随机数据并将其解码为utf-8。您要么仅以字节字符串的形式发送和接收数据,要么将数据编码为字符串,例如使用Base64。我怀疑您会更喜欢后者,因此请查看Java中的Base64
和Python中的base64
。