⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pwmanager.cpp

📁 KeePassX用于保护密码的安全
💻 CPP
📖 第 1 页 / 共 4 页
字号:
if(CryptoAlgorithmus == ALGO_AES) Flags |= PWM_FLAG_RIJNDAEL;else if(CryptoAlgorithmus == ALGO_TWOFISH) Flags |= PWM_FLAG_TWOFISH;Version = PWM_DBVER_DW;NumGroups = Groups.size();NumEntries = Entries.size()+MetaStreams.size();getRandomBytes(FinalRandomSeed,1,16,false);getRandomBytes(TrafoRandomSeed,1,32,false);getRandomBytes(EncryptionIV,1,16,false);quint16 FieldType;quint32 FieldSize;int pos=DB_HEADER_SIZE; // Skip the header, it will be written laterfor(int i=0; i < Groups.size(); i++){		FieldType = 0x0001; FieldSize = 4;		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		memcpyToLEnd32(buffer+pos, &Groups[i].ID); pos += 4;		FieldType = 0x0002; FieldSize = Groups[i].Name.toUtf8().length() + 1;		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		memcpy(buffer+pos, Groups[i].Name.toUtf8(),FieldSize); pos += FieldSize;		FieldType = 0x0003; FieldSize = 5;		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		dateToPackedStruct5(Groups[i].Creation,(unsigned char*)buffer+pos); pos += 5;		FieldType = 0x0004; FieldSize = 5;		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		dateToPackedStruct5(Groups[i].LastMod,(unsigned char*)buffer+pos);pos += 5;		FieldType = 0x0005; FieldSize = 5;		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		dateToPackedStruct5(Groups[i].LastAccess,(unsigned char*)buffer+pos);pos += 5;		FieldType = 0x0006; FieldSize = 5;		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		dateToPackedStruct5(Groups[i].Expire,(unsigned char*)buffer+pos);pos += 5;		FieldType = 0x0007; FieldSize = 4;		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		memcpyToLEnd32(buffer+pos, &Groups[i].OldImgID); pos += 4;		FieldType = 0x0008; FieldSize = 2;		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		memcpyToLEnd16(buffer+pos, &Groups[i].Level); pos += 2;		FieldType = 0x0009; FieldSize = 4;		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		memcpyToLEnd32(buffer+pos, &Groups[i].Flags); pos += 4;		FieldType = 0xFFFF; FieldSize = 0;		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;}for(int i = 0; i < Entries.size(); i++){		FieldType = 0x0001; FieldSize = 16;		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		Entries[i].Uuid.toRaw(buffer+pos);		pos += 16;		FieldType = 0x0002; FieldSize = 4;		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		memcpyToLEnd32(buffer+pos, &Entries[i].GroupID); pos += 4;		FieldType = 0x0003; FieldSize = 4;		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		memcpyToLEnd32(buffer+pos,&Entries[i].OldImgID); pos += 4;		FieldType = 0x0004;		FieldSize = Entries[i].Title.toUtf8().length() + 1; // Add terminating NULL character space		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		memcpy(buffer+pos, Entries[i].Title.toUtf8(),FieldSize);  pos += FieldSize;		FieldType = 0x0005;		FieldSize = Entries[i].URL.toUtf8().length() + 1; // Add terminating NULL character space		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		memcpy(buffer+pos, Entries[i].URL.toUtf8(),FieldSize);  pos += FieldSize;		FieldType = 0x0006;		FieldSize = Entries[i].UserName.toUtf8().length() + 1; // Add terminating NULL character space		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		memcpy(buffer+pos, Entries[i].UserName.toUtf8(),FieldSize);  pos += FieldSize;		FieldType = 0x0007;		FieldSize = Entries[i].Password.length() + 1; // Add terminating NULL character space		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		Entries[i].Password.unlock();		memcpy(buffer+pos, Entries[i].Password.string().toUtf8(),FieldSize);  pos += FieldSize;		Entries[i].Password.lock();		FieldType = 0x0008;		FieldSize = Entries[i].Additional.toUtf8().length() + 1; // Add terminating NULL character space		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		memcpy(buffer+pos, Entries[i].Additional.toUtf8(),FieldSize);  pos += FieldSize;		FieldType = 0x0009; FieldSize = 5;		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		dateToPackedStruct5(Entries[i].Creation,(unsigned char*)buffer+pos); pos+=5;		FieldType = 0x000A; FieldSize = 5;		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		dateToPackedStruct5(Entries[i].LastMod,(unsigned char*)buffer+pos); pos+=5;		FieldType = 0x000B; FieldSize = 5;		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		dateToPackedStruct5(Entries[i].LastAccess,(unsigned char*)buffer+pos); pos+=5;		FieldType = 0x000C; FieldSize = 5;		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		dateToPackedStruct5(Entries[i].Expire,(unsigned char*)buffer+pos); pos+=5;		FieldType = 0x000D;		FieldSize = Entries[i].BinaryDesc.toUtf8().length() + 1; // Add terminating NULL character space		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		memcpy(buffer+pos, Entries[i].BinaryDesc.toUtf8(),FieldSize);  pos += FieldSize;		FieldType = 0x000E; FieldSize = Entries[i].BinaryData.length();		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		if((!Entries[i].BinaryData.isNull()) && (FieldSize != 0))			memcpy(buffer+pos, Entries[i].BinaryData.data(), FieldSize);		pos += FieldSize;		FieldType = 0xFFFF; FieldSize = 0;		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;}for(int i = 0; i < MetaStreams.size(); i++){		FieldType = 0x0001; FieldSize = 16;		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		MetaStreams[i]->Uuid.toRaw(buffer+pos); pos += 16;		FieldType = 0x0002; FieldSize = 4;		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		memcpyToLEnd32(buffer+pos, &MetaStreams[i]->GroupID); pos += 4;		FieldType = 0x0003; FieldSize = 4;		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		memcpyToLEnd32(buffer+pos, &MetaStreams[i]->ImageID); pos += 4;		FieldType = 0x0004;		FieldSize = MetaStreams[i]->Title.toUtf8().length() + 1; // Add terminating NULL character space		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		memcpy(buffer+pos, MetaStreams[i]->Title.toUtf8(),FieldSize);  pos += FieldSize;		FieldType = 0x0005;		FieldSize = MetaStreams[i]->URL.toUtf8().length() + 1; // Add terminating NULL character space		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		memcpy(buffer+pos, MetaStreams[i]->URL.toUtf8(),FieldSize);  pos += FieldSize;		FieldType = 0x0006;		FieldSize = MetaStreams[i]->UserName.toUtf8().length() + 1; // Add terminating NULL character space		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		memcpy(buffer+pos, MetaStreams[i]->UserName.toUtf8(),FieldSize);  pos += FieldSize;		FieldType = 0x0007;		FieldSize = MetaStreams[i]->Password.length() + 1; // Add terminating NULL character space		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		MetaStreams[i]->Password.unlock();		memcpy(buffer+pos, MetaStreams[i]->Password.string().toUtf8(),FieldSize);  pos += FieldSize;		MetaStreams[i]->Password.lock();		FieldType = 0x0008;		FieldSize = MetaStreams[i]->Additional.toUtf8().length() + 1; // Add terminating NULL character space		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		memcpy(buffer+pos, MetaStreams[i]->Additional.toUtf8(),FieldSize);  pos += FieldSize;		FieldType = 0x0009; FieldSize = 5;		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		dateToPackedStruct5(MetaStreams[i]->Creation,(unsigned char*)buffer+pos); pos+=5;		FieldType = 0x000A; FieldSize = 5;		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		dateToPackedStruct5(MetaStreams[i]->LastMod,(unsigned char*)buffer+pos); pos+=5;		FieldType = 0x000B; FieldSize = 5;		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		dateToPackedStruct5(MetaStreams[i]->LastAccess,(unsigned char*)buffer+pos); pos+=5;		FieldType = 0x000C; FieldSize = 5;		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		dateToPackedStruct5(MetaStreams[i]->Expire,(unsigned char*)buffer+pos); pos+=5;		FieldType = 0x000D;		FieldSize = MetaStreams[i]->BinaryDesc.toUtf8().length() + 1; // Add terminating NULL character space		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		memcpy(buffer+pos, MetaStreams[i]->BinaryDesc.toUtf8(),FieldSize);  pos += FieldSize;		FieldType = 0x000E; FieldSize = MetaStreams[i]->BinaryData.length();		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;		if((!MetaStreams[i]->BinaryData.isNull()) && (FieldSize != 0))			memcpy(buffer+pos, MetaStreams[i]->BinaryData.data(), FieldSize);		pos += FieldSize;		FieldType = 0xFFFF; FieldSize = 0;		memcpyToLEnd16(buffer+pos, &FieldType); pos += 2;		memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4;}sha256_context context;sha256_starts(&context);sha256_update(&context,(unsigned char*)buffer+DB_HEADER_SIZE, pos - DB_HEADER_SIZE);sha256_finish(&context,(unsigned char*)ContentsHash);memcpyToLEnd32(buffer,&Signature1);memcpyToLEnd32(buffer+4,&Signature2);memcpyToLEnd32(buffer+8,&Flags);memcpyToLEnd32(buffer+12,&Version);memcpy(buffer+16,FinalRandomSeed,16);memcpy(buffer+32,EncryptionIV,16);memcpyToLEnd32(buffer+48,&NumGroups);memcpyToLEnd32(buffer+52,&NumEntries);memcpy(buffer+56,ContentsHash,32);memcpy(buffer+88,TrafoRandomSeed,32);memcpyToLEnd32(buffer+120,&KeyEncRounds);transformKey(MasterKey,TransformedMasterKey,TrafoRandomSeed,KeyEncRounds);quint8 FinalKey[32];sha256_starts(&context);sha256_update(&context,FinalRandomSeed, 16);sha256_update(&context,TransformedMasterKey, 32);sha256_finish(&context,FinalKey);unsigned long EncryptedPartSize;if(CryptoAlgorithmus == ALGO_AES){Rijndael aes;// Initialize Rijndael/AES  if(aes.init(Rijndael::CBC, Rijndael::Encrypt, FinalKey,Rijndael::Key32Bytes, EncryptionIV) != RIJNDAEL_SUCCESS){	_ERROR	delete [] buffer;	return false;}EncryptedPartSize = (unsigned long)aes.padEncrypt((quint8*)buffer+DB_HEADER_SIZE,						  pos - DB_HEADER_SIZE,						  (quint8*)buffer+DB_HEADER_SIZE);}else if(CryptoAlgorithmus == ALGO_TWOFISH){CTwofish twofish;if(twofish.init(FinalKey, 32, EncryptionIV) == false){_ERRORdelete [] buffer;return false;}EncryptedPartSize = (unsigned long)twofish.padEncrypt((quint8*)buffer+DB_HEADER_SIZE,						      pos - DB_HEADER_SIZE,						      (quint8*)buffer+DB_HEADER_SIZE);}if((EncryptedPartSize > 2147483446) || (!EncryptedPartSize && Groups.size())){_ERRORdelete [] buffer;return false;}file->resize(0); //truncateif(file->write(buffer,EncryptedPartSize+DB_HEADER_SIZE)!=EncryptedPartSize+DB_HEADER_SIZE){delete [] buffer;return false;}file->flush();delete [] buffer;//if(SearchGroupID!=-1)Groups.push_back(SearchGroup);return true;}CGroup* PwDatabase::addGroup(CGroup* parent){CGroup group;if(parent)group.Level=parent->Level+1;group.ImageID=0;group.ID=getNewGroupId();if(!Groups.size() || !parent){	Groups << group;	return &Groups.back();}else {  int i=Groups.indexOf(*parent)+1;	for(i;i<Groups.size();i++)		if(Groups[i].Level<=parent->Level)break;	Groups.insert(i,group);	return &Groups[i];}}void PwDatabase::deleteGroup(unsigned long id){for(int i=0;i<Groups.size();i++){	if(Groups[i].ID==id) return deleteGroup(&Groups[i]);}}void PwDatabase::deleteGroup(CGroup* group){int GroupIndex=Groups.indexOf(*group);int NumChilds;int i;for(i=GroupIndex+1; i<Groups.size(); i++){ if(Groups[i].Level<=group->Level)break;}NumChilds=i-GroupIndex-1;//delete entriesfor(i=GroupIndex; i<=GroupIndex+NumChilds; i++){	for(int j=0; j<Entries.size();){		if(Entries[j].GroupID==Groups[i].ID)		 deleteEntry(&Entries[j]);		else		 j++;		}}for(i=NumChilds; i>=0; i--){	Groups.removeAt(GroupIndex+i);}}int PwDatabase::getGroupIndex(CGroup* g){return getGroupIndex(g->ID);}int PwDatabase::getGroupIndex(unsigned long ID){int i=0;for(i;i<Groups.size();i++){if(Groups[i].ID==ID)break;}return i;}void PwDatabase::merge(Database* db){for(int i=0;i<db->numGroups();i++){	int NewGroupID;	if(isGroupIdInUse(db->group(i).ID)==true) NewGroupID=getNewGroupId();	else NewGroupID=db->group(i).ID;	for(int j=0;j<db->numEntries();j++){		if(db->entry(j).GroupID==db->group(i).ID){			Entries.push_back(db->entry(j));			Entries.back().GroupID=NewGroupID;			Entries.back().sID=getNewEntrySid();}	}	Groups.push_back(db->group(i));	Groups.back().ID=NewGroupID;}}bool PwDatabase::isGroupIdInUse(quint32 id){for(int i=0;i<Groups.size();i++) if(Groups[i].ID==id)return true;return false;}bool PwDatabase::isEntrySidInUse(quint32 sid){for(int i=0;i<Entries.size();i++) if(Entries[i].sID==sid)return true;return false;}bool PwDatabase::isParentGroup(CGroup* child, CGroup* parent){if(child==parent)return true;	//maybe a bad ideaint ChildIndex=getGroupIndex(child->ID);int ParentIndex=getGroupIndex(parent->ID);if(ParentIndex > ChildIndex) return false;for(int i=ChildIndex; i>ParentIndex;i--){  if(Groups[i].Level<=parent->Level)return false;}return true;}quint32 PwDatabase::getNewGroupId(){quint32 id;bool used;while(1){used=false;getRandomBytes(&id,4,1,false);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -