bool BotanWrapper::DecryptFile(QString Source, QString Destination) { //qDebug() << "\n\n"; QFileInfo name = Source; //qDebug() << Source; QString base = name.baseName(); //qDebug() << base; QString encrypted3 = soutput + base + ".serpentdecrypted"; //qDebug() << soutput; QString encrypted4 = tfoutput + base + ".twofishdecrypted"; //qDebug() << toutput; try { //Setup the key derive functions PKCS5_PBKDF2 pbkdf2(new HMAC(new Keccak_1600)); const u32bit PBKDF2_ITERATIONS = 700000; string inFilename3 = Source.toStdString(); string outFilename3 = encrypted3.toStdString(); std::ifstream in3(inFilename3.c_str(),std::ios::binary); std::ofstream out3(outFilename3.c_str(),std::ios::binary); char* salt3 = new char[256]; in3.read(salt3 , 256 ); qDebug() << "create salt"; SecureVector<byte> salts3((const byte*)salt3, 256 ) ; mSalt3 = salts3; //Create the KEY and IV KDF* kdf3 = get_kdf("KDF2(Tiger)"); qDebug() << "create master key"; //Create the master key SecureVector<byte> mMaster3 = pbkdf2.derive_key(128, mPassword3.toStdString(), &mSalt3[0], mSalt3.size(),PBKDF2_ITERATIONS).bits_of(); SymmetricKey mKey3 = kdf3->derive_key(32, mMaster3, "salt1"); InitializationVector mIV3 = kdf3->derive_key(16, mMaster3, "salt2"); qDebug() << "begin serpent decrypt"; Pipe pipe3(get_cipher("Serpent/CBC/PKCS7", mKey3, mIV3,DECRYPTION),new DataSink_Stream(out3)); pipe3.start_msg(); in3 >> pipe3; pipe3.end_msg(); out3.flush(); out3.close(); in3.close(); /*************************TWOFISH DECRYPTION*************************/ PKCS5_PBKDF2 pbkdf3(new HMAC(new Skein_512)); string inFilename2 = encrypted3.toStdString(); string outFilename2 = encrypted4.toStdString(); std::ifstream in2(inFilename2.c_str(),std::ios::binary); std::ofstream out2(outFilename2.c_str(),std::ios::binary); char* salt2 = new char[256]; in2.read(salt2 , 256 ); SecureVector<byte> salts2((const byte*)salt2, 256 ) ; mSalt2 = salts2; //Create the KEY and IV KDF* kdf2 = get_kdf("KDF2(Whirlpool)"); //Create the master key SecureVector<byte> mMaster2 = pbkdf3.derive_key(128, mPassword2.toStdString(), &mSalt2[0], mSalt2.size(),PBKDF2_ITERATIONS).bits_of(); SymmetricKey mKey2 = kdf2->derive_key(32, mMaster2, "salt1"); InitializationVector mIV2 = kdf2->derive_key(16, mMaster2, "salt2"); qDebug() << "twofish"; Pipe pipe2(get_cipher("Twofish/CFB", mKey2, mIV2,DECRYPTION),new DataSink_Stream(out2)); pipe2.start_msg(); in2 >> pipe2; pipe2.end_msg(); out2.flush(); out2.close(); in2.close(); /************AES DECRYPTION*************************/ string inFilename = encrypted4.toStdString(); string outFilename = Destination.toStdString(); std::ifstream in(inFilename.c_str(),std::ios::binary); std::ofstream out(outFilename.c_str(),std::ios::binary); char* salt = new char[256]; in.read(salt , 256 ); SecureVector<byte> salts((const byte*)salt, 256 ) ; mSalt = salts; //Create the KEY and IV KDF* kdf = get_kdf("KDF2(SHA-512)"); //Create the master key SecureVector<byte> mMaster = pbkdf2.derive_key(128, mPassword.toStdString(), &mSalt[0], mSalt.size(),PBKDF2_ITERATIONS).bits_of(); SymmetricKey mKey = kdf->derive_key(32, mMaster, "salt1"); InitializationVector mIV = kdf->derive_key(16, mMaster, "salt2"); qDebug() << "AES"; Pipe pipe(get_cipher("AES-256/EAX", mKey, mIV,DECRYPTION),new DataSink_Stream(out)); pipe.start_msg(); in >> pipe; pipe.end_msg(); out.flush(); out.close(); in.close(); QMessageBox msgBox; msgBox.setText("Success!"); msgBox.setInformativeText("File successfully decrypted!"); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); QFile s(encrypted3), t(encrypted4); s.remove(); t.remove(); return true; } catch(...) { return false; } }
bool BotanWrapper::EncryptFile(QString Source, QString Destination) { QFileInfo name = Source; QString base = name.baseName(); QString encrypted1 = eoutput + base + ".gg"; QString encrypted2 = toutput + base + ".twofish"; QFile e(encrypted1); QFile t(encrypted2); try { //Setup the key derive functions PKCS5_PBKDF2 pbkdf2(new HMAC(new Keccak_1600)); const u32bit PBKDF2_ITERATIONS = 700000; qDebug() << "create keys"; //Create the KEY and IV KDF* kdf = get_kdf("KDF2(SHA-512)"); AutoSeeded_RNG rng; qDebug() << "create salt"; SecureVector<byte> salt(256); rng.randomize(&salt[0], salt.size()); mSalt = salt; qDebug() << "create master key"; //Create the master key SecureVector<byte> mMaster = pbkdf2.derive_key(128, mPassword.toStdString(), &mSalt[0], mSalt.size(),PBKDF2_ITERATIONS).bits_of(); SymmetricKey mKey = kdf->derive_key(32, mMaster, "salt1"); InitializationVector mIV = kdf->derive_key(16, mMaster, "salt2"); qDebug() << "start encryption"; string inFilename = Source.toStdString(); string outFilename = encrypted1.toStdString(); std::ifstream inFile(inFilename.c_str()); std::ofstream outFile(outFilename.c_str()); Pipe pipe(get_cipher("AES-256/EAX", mKey, mIV,ENCRYPTION),new DataSink_Stream(outFile)); outFile.write((const char*)mSalt.begin(), mSalt.size()); pipe.start_msg(); inFile >> pipe; pipe.end_msg(); outFile.flush(); outFile.close(); inFile.close(); QMessageBox msgBox; /*****************TWOFISH ENCRYPTION********************/ qDebug() << "Twofish"; //Setup the key derive functions PKCS5_PBKDF2 pbkdf3(new HMAC(new Skein_512)); //Create the KEY and IV KDF* kdf2 = get_kdf("KDF2(Whirlpool)"); SecureVector<byte> salt2(256); rng.randomize(&salt2[0], salt2.size()); mSalt2 = salt2; //Create the master key SecureVector<byte> mMaster2 = pbkdf3.derive_key(128, mPassword2.toStdString(), &mSalt2[0], mSalt2.size(),PBKDF2_ITERATIONS).bits_of(); SymmetricKey mKey2 = kdf2->derive_key(32, mMaster2, "salt1"); InitializationVector mIV2 = kdf2->derive_key(16, mMaster2, "salt2"); string inFilename2 = encrypted1.toStdString(); string outFilename2 = encrypted2.toStdString(); std::ifstream inFile2(inFilename2.c_str()); std::ofstream outFile2(outFilename2.c_str()); Pipe pipe2(get_cipher("Twofish/CFB", mKey2, mIV2,ENCRYPTION),new DataSink_Stream(outFile2)); outFile2.write((const char*)mSalt2.begin(), mSalt2.size()); pipe2.start_msg(); inFile2 >> pipe2; pipe2.end_msg(); outFile2.flush(); outFile2.close(); inFile2.close(); /**************************SERPENT ENCRYPTION*****************/ //Create the KEY and IV KDF* kdf3 = get_kdf("KDF2(Tiger)"); SecureVector<byte> salt3(256); rng.randomize(&salt3[0], salt3.size()); mSalt3 = salt3; //Create the master key SecureVector<byte> mMaster3 = pbkdf2.derive_key(128, mPassword3.toStdString(), &mSalt3[0], mSalt3.size(),PBKDF2_ITERATIONS).bits_of(); SymmetricKey mKey3 = kdf3->derive_key(32, mMaster3, "salt1"); InitializationVector mIV3 = kdf3->derive_key(16, mMaster3, "salt2"); string inFilename3 = encrypted2.toStdString(); string outFilename3 = Destination.toStdString(); std::ifstream inFile3(inFilename3.c_str()); std::ofstream outFile3(outFilename3.c_str()); qDebug() << "serpent"; Pipe pipe3(get_cipher("Serpent/CBC/PKCS7", mKey3, mIV3,ENCRYPTION),new DataSink_Stream(outFile3)); outFile3.write((const char*)mSalt3.begin(), mSalt3.size()); pipe3.start_msg(); inFile3 >> pipe3; pipe3.end_msg(); outFile3.flush(); outFile3.close(); inFile3.close(); msgBox.setText("Success!"); msgBox.setInformativeText("File successfully encrypted!"); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); e.remove(); t.remove(); return true; } catch(...) { return false; } }
int main() { Source src(100); Pipe pipe1(80); Valve valve1(on); Tank tank1(60); Switch switch1(&tank1,300); Switch switch2(&tank1, 50); Pipe pipe2(80); Sink sink1(30); Pipe pipe3(40); Valve valve2(on); Tank tank2(80); Switch switch3(&tank2, 250); Switch switch4(&tank2, 50); Sink sink2(20); while( !kbhit() ) { src>=pipe1; pipe1>=valve1; valve1>=tank1; Tee(tank1,pipe2,pipe3); pipe2>=sink1; pipe3>=valve2; valve2>=tank2; tank2>=sink2; src.Tick(); pipe1.Tick(); valve1.Tick(); tank1.Tick(); switch1.Tick(); switch2.Tick(); pipe2.Tick(); sink1.Tick(); pipe3.Tick(); valve2.Tick(); tank2.Tick(); switch3.Tick(); switch4.Tick(); sink2.Tick(); if(valve1.Status()==on&& switch1.Status()==on) valve1.Status()=off; if (valve1.Status()==off && switch2.Status()==off) valve1.Status()=on; if(valve2.Status()==on && switch3.Status()==on) valve2.Status()=off; if(valve2.Status()==off && switch4.Status()==off) valve2.Status()=on; cout<<" Src=" <<setw(2)<<src.Flow(); cout<<" p1="<<setw(2)<<pipe1.Flow(); if(valve1.Status()==off) cout<<" v1=off"; else cout<<" v1=on"; cout<<" T1="<<setw(3)<<tank1.Contents(); cout<<" p2="<<setw(2)<<pipe2.Flow(); cout<<" Sink1= "<<setw(2)<<sink1.Flow(); cout<<" p3="<<setw(2)<<pipe3.Flow(); if(valve2.Status()==off) cout<<" v2=off"; else cout<<" v2=on"; cout<<" T2= "<<setw(3)<<tank2.Contents(); cout<<" sink2= "<<setw(2)<<sink2.Flow(); cout<<"\n"; } return 0; }