开源项目之NeoCrypt

标签: 开源 项目 neocrypt | 发表时间:2012-09-11 08:38 | 作者:banketree
出处:http://blog.csdn.net

一个文件加密解密软件的源代码,可以设置很多著名的加密算法进行加密解密。它集强力、安全的算法和简单、易用的界面于一身。它的文件管理界面可以轻易地观看和更改整个系 统的加密设置,也可以加/解密选定的文件,安全地删除文件。它支持多用户使用。如图:

项目需要用到第三方库cryptlib,该库已经放到源码包中。

本程序有一个动态链接库NeoCryptSX与一个主程序Neocrypt组成,NeoCryptSX动态库操作简单,只负责发送调用消息,Neocrypt主程序中封装了Decryptor类负责解码、Encryptor类负责编码,File类负责文件操作、CProgUpdater类负责进度等。


解码部分:

void Decryptor::decrypt(const std::string& name,std::list<std::string>& pwds)
{
	char* buf = new char[BUFFER_SIZE];

	File file(name);

	// pass file size to listener
	if (mListener)
		mListener->setRange(file.size());

	// check for password
	if (pwds.size() == 0)
		throw std::logic_error("No passwords specified!");

	// create the envelope
	CRYPT_ENVELOPE env;
	if (cryptCreateEnvelope(&env,CRYPT_UNUSED,CRYPT_FORMAT_AUTO))
		throw std::runtime_error("Failed to create envelope!");

	cryptSetAttribute(env,CRYPT_ATTRIBUTE_BUFFERSIZE,BUFFER_SIZE);

	int n;

	while (!file.eof() && (n = file.read(buf,BUFFER_SIZE-4096)) != 0)
	{
		int cBytes;
		int bytesDone = 0;
		int bytesLeft = n;

		while (bytesLeft)
		{
			int status = cryptPushData(env,buf+bytesDone,bytesLeft,&cBytes);
			if ( status == CRYPT_ENVELOPE_RESOURCE)
			{
				// add passwords until one is accepted
				std::list<std::string>::iterator it;
				std::list<std::string>::iterator end = pwds.end();

				for (it = pwds.begin(); it != end; ++it)
				{
					// loop through all required attributes and try the password with each
					if (cryptSetAttribute(env,CRYPT_ENVINFO_PASSWORD,CRYPT_CURSOR_FIRST) == CRYPT_OK)
					{
						bool accept = false;

						do
						{
							CRYPT_ATTRIBUTE_TYPE attrib;
							cryptGetAttribute(env,CRYPT_ENVINFO_PASSWORD,(int*)&attrib);

							if (attrib == CRYPT_ENVINFO_PASSWORD)
							{
								if (cryptSetAttributeString(env,CRYPT_ENVINFO_PASSWORD,it->c_str(),it->size()) == CRYPT_OK)
								{
									accept = true;
									break;
								}
							}
						}
						while (cryptSetAttribute(env,CRYPT_ENVINFO_PASSWORD,CRYPT_CURSOR_NEXT) == CRYPT_OK);

						if (accept)
							break;
					}
				}

				if (it == end)
					throw std::runtime_error("None of the passwords are valid for file " + name + " ! Please try another password.");
			}
			else if (status != 0)
			{
				throw std::runtime_error("The given file " + name + " is not a valid encrypted file.");
			}

			bytesLeft -= cBytes;
			bytesDone += cBytes;

			cryptPopData(env,buf,BUFFER_SIZE,&cBytes);
			file.write(buf,cBytes);
		}

		if (mListener)
			mListener->increment(n);
	}

	// flush remaining data
	cryptFlushData(env);

	cryptPopData(env,buf,BUFFER_SIZE,&n);
	file.write(buf,n);

	// destroy envelope
	cryptDestroyEnvelope(env);

	// close file
	file.close();

	mListener->complete();

	delete [] buf;
}

编码部分:

void Encryptor::encrypt(const std::string& name,std::list<std::string>& password,Algorithm::Type algo)
{
	char* buf = new char[BUFFER_SIZE];

	File file(name);

	// pass file size to listener
	if (mListener)
		mListener->setRange(file.size());

	// check for at-least one password
	if (password.size() == 0)
		throw std::logic_error("No password in password list!");

	// set algorithm type
	if (cryptSetAttribute(CRYPT_UNUSED,CRYPT_OPTION_ENCR_ALGO,algo))
		throw std::runtime_error("Could not set algorithm type!");

	// create the envelope
	CRYPT_ENVELOPE env;
	if (cryptCreateEnvelope(&env,CRYPT_UNUSED,CRYPT_FORMAT_CRYPTLIB))
		throw std::runtime_error("Failed to create envelope!");

	std::list<std::string>::iterator i;
	std::list<std::string>::iterator e = password.end();

	// add password(s)
	for (i = password.begin(); i != e; ++i)
	{
		if (cryptSetAttributeString(env,CRYPT_ENVINFO_PASSWORD,(*i).c_str(),(*i).size()))
			throw std::runtime_error("Failed to set password " + (*i) + "!");
	}

	// allocate encryption buffer
	if (cryptSetAttribute(env,CRYPT_ATTRIBUTE_BUFFERSIZE,BUFFER_SIZE))
		throw std::runtime_error("Could not allocate encryption buffer!");

	int n;
	int cBytes;

	if (!file.eof() && (n = file.read(buf,100)) != 0)
	{
		cryptPushData(env,buf,n,&cBytes);

		cryptPopData(env,buf,BUFFER_SIZE,&cBytes);
		file.write(buf,cBytes);

		if (mListener)
			mListener->increment(n);
	}

	while (!file.eof() && (n = file.read(buf,BUFFER_SIZE-4096)) != 0)
	{
		cryptPushData(env,buf,n,&cBytes);

		cryptPopData(env,buf,BUFFER_SIZE,&cBytes);
		file.write(buf,cBytes);

		if (mListener)
			mListener->increment(n);
	}

	// flush remaining data
	cryptFlushData(env);

	cryptPopData(env,buf,BUFFER_SIZE,&cBytes);
	file.write(buf,cBytes);

	// destroy envelope
	cryptDestroyEnvelope(env);

	// close file
	file.close();

	mListener->complete();

	delete [] buf;
}

源码下载,喜欢的自己研究了,



作者:banketree 发表于2012-9-11 8:38:38 原文链接
阅读:0 评论:0 查看评论

相关 [开源 项目 neocrypt] 推荐:

开源项目之NeoCrypt

- - CSDN博客推荐文章
一个文件加密解密软件的源代码,可以设置很多著名的加密算法进行加密解密. 它集强力、安全的算法和简单、易用的界面于一身. 它的文件管理界面可以轻易地观看和更改整个系 统的加密设置,也可以加/解密选定的文件,安全地删除文件. 项目需要用到第三方库cryptlib,该库已经放到源码包中. 本程序有一个动态链接库NeoCryptSX与一个主程序Neocrypt组成,NeoCryptSX动态库操作简单,只负责发送调用消息,Neocrypt主程序中封装了Decryptor类负责解码、Encryptor类负责编码,File类负责文件操作、CProgUpdater类负责进度等.

Android优秀开源项目

- - CSDN博客移动开发推荐文章
Android经典的开源项目其实非常多,但是国内的博客总是拿着N年前的一篇复制来复制去,实在是不利于新手学习. 今天爬爬把自己熟悉的一些开源项目整理起来,希望能对 Android开发同学们有所帮助. 另外,如果你有比较好的项目推荐,也烦请在评论里分享出来,我会定期更新博客内容. Apollo音乐播放器:就一个播放器,但是实现的很好.

开源项目 AllJoyn 初识

- - CSDN博客推荐文章
AllJoyn 高通的一个开源项目,针对IoT的. 光看到介绍第一个感觉就是高大上啊. 它要解决的问题是物联网中互联互通的问题,一个好大平台. 从它介绍的PPT的两张图比较一下就会比较清楚了. 第一张图中它描绘的是现状,各个设备厂商虽然都对外提供了物联网接口,云接口,但各个设备没有互联互通,各自为政,群雄割据.

Google正式开源LevelDB项目

- Jie - 新闻 - LUPA开源社区
  Google 宣布 LevelDB 项目开源,使用的开源授权协议为 BSD.   Leveldb是一个google实现的非常高效的kv数据库,目前的版本1.2能够支持billion级别的数据量了. 在这个数量级别下还有着非常高的性能,主要归功.

晒晒我的开源项目们

- zffl - 透明思考 - Thoughts
在等“bundle install”的时候闲着没事,打开 我的Github ,发现还有那么一些东西值得分享一下的. 啤酒游戏 :《 第五项修炼 》里讲的啤酒游戏. 合作的进化 :这就是《 合作的进化 》那本书里讲的生存竞赛游戏. 可以自己写新的策略放进来,看看重复囚徒困境中的最佳策略是如何被选择出来的.

如何熟悉一个开源项目?

- - IT技术博客大学习
       你有个任务,需要用到某个开源项目;或者老大交代你一个事情,让你去了解某个东西.     1.首先,查找和阅读该项目的博客和资料,通过google你能找到某个项目大体介绍的博客,快速阅读一下就能对项目的目的、功能、基本使用有个大概的了解.     2.阅读项目的文档,重点关注类似 Getting started、Example之类的文档,从中学习如何下载、安装、甚至基本使用该项目所需要的知识.

OpenStack – 开源云计算项目

- - 弯曲评论
系列目录 Future Internet Technology. OpenFlow – 打造弹性化的可控互联网. Open vSwitch – 开放虚拟交换标准. Mininet – “懒惰”网络研究者的福音. NOX – 现代网络操作系统. OpenStack – 开源云计算项目. 时下云计算如火如荼,众多企业纷纷推出云计算相关的应用,不少还搭建企业私有云和少数公有云(代表为Amazon).

2012年五大开源项目

- - 创意科技 - 果壳网
如果一切照计划运行,明年红帽公司(Red Hat)将成为第一家年收入超过10亿美元的开源软件企业,这将是开源社区历史上一个重要的分水岭,开源开发人员一向认为基于社区的开源开发模式非常的具有可行性,甚至比闭源开发更优越,将替代传统开发模式,成为将来软件开发模式. 近几年,诸如Linux,Perl, Apache, Hadoop, OpenOffice, GIMP等数十开源项目在软件市场上如鱼得水,新的一年,又有什么项目会脱颖而出.

晒晒我们的开源项目

- - robbin的自言自语
我们的研发团队是一支mini型研发团队,目前共有研发人员13人. 由于网站产品维护的历史原因,这13人的研发团队分为4支小组,分别是:Ruby研发小组5人;PHP研发小组4人;.net研发小组2人,Java搜索小组2人. 别看我们研发人员这么少,但是我们研发人员战斗力很强,我们维护和开发着十多条产品线.

Google code android开源项目(四)

- - CSDN博客推荐文章
一个简洁的android rss阅读器. 创建者写的一些应用包括:闹钟和调节屏幕亮度小工具等. 远程控制winamp(5.5以上版本).  Tesseract OCR(HP实验室开源的)封装的 Android APIs. 使用 visual studio 开发Android NDK C/C++ . android版quake2.