diff --git a/src/cplusplus/abracadabra.cpp b/src/cplusplus/abracadabra.cpp index 340bee0..66d53b7 100644 --- a/src/cplusplus/abracadabra.cpp +++ b/src/cplusplus/abracadabra.cpp @@ -87,6 +87,8 @@ DemapResult deMap(PreCheckResult input,string key,bool g,bool t); string FindOriginText(string& letter); string GetCryptedText(string& letter); int GetRandomIndex(int length); +int GetLuhnBit(vector& data); +bool CheckLuhnBit(vector data); std::vector readFile(const char* filename); PreCheckResult preCheck(vector Input); void rotateString(std::string& str,int n); @@ -139,7 +141,7 @@ int main(int argc, char *argv[]){ SetConsoleOutputCP(CP_UTF8); #endif - CLI::App app{"***Abracadabra v2.6.1***"}; //CLI11提供的命令行参数解析 + CLI::App app{"***Abracadabra v2.6.5***"}; //CLI11提供的命令行参数解析 string arg1 = ""; PreCheckResult input; @@ -322,9 +324,7 @@ string enMap(PreCheckResult input,string key,bool t,bool q){ vector OriginalData = input.output; string TempS(input.output.begin(),input.output.end()); - OriginalData.push_back(2); //在末尾加入三个字节的标志位 222 - OriginalData.push_back(2); - OriginalData.push_back(2); + OriginalData.push_back(GetLuhnBit(OriginalData)); //获取校验码并压进去。 std::array RandomByte { //取两个随机数作为初始化向量的随机性 @@ -497,18 +497,21 @@ DemapResult deMap(PreCheckResult input,string key,bool g,bool t){ } } delete[] RandomByte; - - if(TempStr2Int.at(TempStr2Int.size()-1) == 2 && - TempStr2Int.at(TempStr2Int.size()-2) == 2 && - TempStr2Int.at(TempStr2Int.size()-3) == 2){ - TempStr2Int.pop_back(); - TempStr2Int.pop_back(); - TempStr2Int.pop_back(); - }else{ - if(!g){ - cout<<"Error Decrypting. Incorrect key."<& data, const int* randomByte) { // AES_CTR_xcrypt_buffer(&ctx, data.data(), data.size()); } +int GetLuhnBit(vector& data){ //计算数据的卢恩校验码 + vector Digit; + unsigned int num,digit; + for(unsigned int i = 0;i 0){ //取字节值的每一位数字 + digit = num % 10; // 取得最低位数 + Digit.push_back(digit); + num /= 10; //除去十 + } + } + + // Digit应当是一个数位构成的数组。 + int sum = 0; + int Check; + for(unsigned int i = 0;i= 10){ //如果大于等于十 + Digit[i] = (Digit[i] % 10) + (Digit[i] / 10); //计算数字之和 + } + } + sum += (int)Digit[i]; + } + + Check = 10 - (sum % 10); + + return Check; +} + +bool CheckLuhnBit(vector data){ //检查数据的卢恩校验码 + int DCheck = (int)data.at(data.size()-1); + data.pop_back(); + int Check = GetLuhnBit(data); + + if(Check == DCheck){ + return true; + }else{ + return false; + } +} + std::vector GZIP_COMPRESS(std::vector Data){ string RawStringData(Data.begin(),Data.end()); string compressedData = gzip::compress(RawStringData.c_str(),RawStringData.size());