今天給團隊調試一個錯誤,概率性的加密的數據沒法做解密,現象是解密出來的結果和源數據長度不一致,很奇怪的現象,因爲加密使用的數據是隨機的,所以使得問題出現時表象是概率的問題;
因爲初次做加解密算法相關的項目,碰到這樣的問題,首先是單步把解密流程過了一遍,發現解密沒有問題,能正常的解密,但解密出來的長度就是不對,分析才發現加密後的數據的長度也不正常,所以考慮是加密源數據的問題,通過分析,才發現一個二進制的源數據經過轉換爲字符串對象string後使用openssl的接口完成的加密處理,導致string對象比原來的字節數組長度要短,短的原因是字節數組中包括了'\0'結束符,原以爲是openssl的接口實現存在這樣的問題,建議使用方將加密的字節數組將0字符都過濾一遍,但想來還是不正確,原來char*的數組轉換爲string存在一個陷阱:見“https://blog.csdn.net/b876144622/article/details/79972498”;所以還是轉換的不合適,修改前後的代碼如下:
//原來的代碼
#if 0
char *temp = (char *)malloc(length + 1);
if (temp == NULL){
ALOGE("encrypt failed, temp == NULL");
ShutdownOpenABE();
return -1;
}
memcpy(temp, rawData, length);
temp[length] = '\0';
string inputStr = temp;
FREE(temp);
#else
//修改的代碼
string inputStr ;//= temp;
//convert temp to string
for (int i=0; i<length; i++){
if (i < length-1 && rawData[i] == '\0'){
cerr << "rawdata:" << rawData <<", length:" << length<<endl;
//ALOGE("rawdata:%s, length:%d, i:%d", rawData, length, i);
//return PARMETER_ERR_CONTENT;
}
inputStr += rawData[i];
}
#endif//end
參考:https://blog.csdn.net/analogous_love/article/details/71744427
還有一種方法是使用assign方法進行賦值,需要指定賦值字節數組的長度,否則以0做結束符計算長度;
inputStr .assign(rawData, length);