2009年2月14日
#
8.04的见 下面的链接:
http://www.linuxdiyf.com/bbs/thread-89540-1-1.html
8.10的见下面的链接:
http://www.einie.org/wp/2008/12/27/ubuntu%E4%B8%8Bflash%E4%B8%AD%E6%96%87%E4%B9%B1%E7%A0%81%E7%9A%84%E8%A7%A3%E5%86%B3%E5%8A%9E%E6%B3%95/
2009年1月26日
#
加密技术
加密技术用于提供以下功能:
|
•
|
机密性。确保数据的保密性。机密性通常是使用加密实现的。可以使用加密算法(使用加密密钥)将明文转换为密文,并使用相应的解密算法将密文转换回明文。对称加密算法使用相同的密钥进行加密和解密,而非对称算法则使用公钥/私钥对。
|
|
•
|
数据完整性。确保数据免受意外或者故意(恶意)的修改。完整性通常是由消息身份验证代码或哈希值提供的。哈希值是从数据序列导出的固定长度的数值。哈希值用于验证通过非安全通道传送的数据的完整性。可以将收到的数据的哈希值与传送时数据的哈希值进行比较,以确定数据是否被篡改。
|
|
•
|
身份验证。保证数据来自某一方。数字证书用于提供身份验证。数字签名通常应用于哈希值,因为这些值比它们所代表的源数据小得多。
|
技术选择
|
•
|
如果需要使用一种方法来验证数据在传输过程中没有被篡改,请使用哈希值。
|
|
•
|
如果要证明实体知道机密但不来回发送机密,或者想使用简单的哈希值以防止在传输过程中被截获,请使用加密的哈希值。
|
|
•
|
如果要隐藏通过不安全的媒介发送的数据或者要永久性保留数据,请使用加密。
|
|
•
|
如果要验证声称是公钥所有者的人员的身份,请使用证书。
|
|
•
|
如果双方事先共享密钥,请使用对称加密以提高速度。
|
|
•
|
如果想通过不安全的媒介安全地交换数据,请使用非对称加密。
|
|
•
|
如果要进行身份验证和实现不可否认性,请使用数字签名。
|
|
•
|
使用 Salt 值(使用加密技术生成的随机数)以防范字典攻击。
|
摘自msdn。
openssl 的crypto程序库是目前用的最广泛的。可以到openssl.org 去下载最新的版本,目前应该是 0.98j。 这个网上的资料就比较多了,但是 openssl 依然没有提供 椭圆曲线加密算法和AES的实现。改库编译出来应该是有一个可执行文件,2个动态库。实际上我在使用vc8编译时候还是会有小麻烦的,按照install的指导来配置和编译,在最新的0.98j版本上是过不去的。通过修改生成的makefile可以把相关的路径修正过来,但在其源码中有许多地方vc8的编译器识别出错误字符。我尝试着修改了几处,但是要改的实在太多了,作罢。
Openssl 提供了许多版本的下载,和不同平台、不同编译器的下载。
crypto++ 是另一好的选择。Crypto++有其明显的优点,主要是功能全,统一性好,包括openssl中缺少的AES。
看其名字就知道是用c++写就的。代码最新版本5.5.2,代码中大量的使用了模板技术,作者是戴伟。
Wei Dai's official Crypto++ web site [www.cryptopp.com]
注:该站需要爬墙。。。
源代码里面提供了vc8 以及gcc 等主流编译器的编译方式。而且提供了静态库和动态库的选择,这个代码在vc下是静态链接运行时库的,
也就是MT或MTd 这样编译下来的lib 或是dll 都有45MB之多,还好,可以使用静态联入的方式。
网上的资料实在是不多,代码中有了部分示例程序。
库中的IO部分设计的很有意思,有点像JAVA中的IO流,使用时可以 一直new下去,
(虽然java的io流部分被许多教材引为反模式) 。
Crypto++的基础设施(IO部分)
像上面这样,source是源,源有很多种比如文件,网络 该库支持跨平台网络通讯的哦!
filter 是过滤器,也可以成为转换器,可以将一个格式转成另一种,等等。。
sink 是容器。 见下面的例子:

Code
//读入文件内容到一个字符串里面
char const* zInputFile =
;
string sContents;
FileSource(zInputFile, true, new StringSink(sContents));
//存储hash值到byte数组
string sData =
;
byte abDigest[SHA::DIGESTSIZE];
SHA sha;
StringSource(sData, true,
new HashFilter(sha,
new ArraySink(abDigest, sizeof(abDigest))));
//从socket取数据存入string
Socket s;

// Open connection

SocketSink sink(s);
string sDataToSend;
sink.PutWord32(sDataToSend.size());
sink.Put((byte const*) sDataToSend.data(), sDataToSend.size());
有了上面这部分io使用基础,那么使用该库就少了许多麻烦。剩余部分待续。
2009年1月24日
#
公钥和私钥都是固定长度的二进制比特串(如目前常用的RSA公私钥长度为1024比特),从性质上来讲,他们都可以加解密,
只是人们根据使用的方式不同,将他们进行了区分,有些称为私钥,有些称为公钥。
另外,根据公私钥使用方式的不同,它们在数据加密和签名时的管理方式也不一样。
(1)数字签名
一个用户拥有一个数字证书(签名证书),里面包括一对密钥(公钥和私钥),私钥用于签名,公钥用于验证签名。
如果私钥被攻击者知道,就可以用你的私钥伪造你的签名,所以私钥的安全性要求较高,不允许进行备份(包括CA中心),
私钥丢失时,只能重新生成密钥对,旧的签名可以用备份的公钥进行验证。另外,用户可以自己生成密钥对,在证书注册时提交给CA中心即可。
(2)加解密
一个用户也拥有一个数字证书(加密证书),里面也包括一对密钥(公钥和私钥),私钥用于解密信息,公钥用于加密信息。
当用户A给用户B传送数据时,用户A 以外带的方式(如从CA中心)获取用户B的公钥,并用其加密,加密后的数据传送给用户B,
用户B收到后用私钥解密。加解密私钥要进行备份,否则,当私钥丢失时,以前加密的数据将无法解密。另外,
密钥对只能在注册时由CA中心产生,这个是国家安全政策的原因,国家必须能解密每个用户加密的所有信息。
注:加解密证书和签名证书虽然在本质上一样(密钥对的产生方式及结果一样,即从数学算法的角度考虑一样),
但因其用途的不同导致其安全策略的不同,所以不能混用。
CryptoAPI(一个应用程序编程接口)目的就是提供开发者在 Windows 下使用 PKI 的编
程接口。CryptoAPI 提供了很多函数,包括编码、解码、加密、解密、哈希、数字证书、
证书管理和证书存储等功能。对于加密和解密,CryptoAPI 同时提供基于会话密钥和公
钥/私钥对的方法。
CryptoAPI 2.0 中提供了管理和使用
证书的函数,另外,2.0 版本中也提供了编码和解码 PKCS#7(ASN.1)消息。
该API提供了基本加密函数,所有 CSP 的通讯都是通过这些函数。
一个CSP 是实现所有加密操作的独立模块。在每一个应用程序中至少需要提供一个CSP。如果不选用CSP
该API会自动选用默认的CSP。
如果使用多于一个以上的 CSP,在加密函数调用中就要指定所需的 CSP。微软基本加密
提供者(Microsoft Base Cryptographic Provider),是缺省绑定到 CryptoAPI 里的。如果没有
指定其他 CSP 时,这个 CSP 就是却省的。
每一个 CSP 对 CryptoAPI 提供了一套不同的实现。一些提供了更加强大的加密算法,
而其他一些 CSP 包含了对硬件的支持,比如智能卡。另外,一些 CSP 偶尔和使用者直接通
讯,比如数字签名就使用了用户的签名私钥。
以下是主要API功能:
CryptAcquireContext
获得CSP的函数接口
CryptReleaseContext
释放。。
CryptEnumProviderTypes
枚举CSP类型
密钥产生函数创建、配置和销毁加密密钥。他们也用于和其他用户进行交换密钥。
CryptDeriveKey
从一个密码中派生一个密钥
CryptDestoryKey
销毁密钥
CryptDuplicateKey
制作一个密钥和密钥状态的精确复制
CryptExportKey
把 CSP 的密钥做成 BLOB 传送到应用程序的内存空间中
CryptGenKey
创建一个随机密钥
CryptGenRandom
产生一个随机数
CryptGetKeyParam
得到密钥的参数
CryptGetUserKey
得到一个密钥交换或签名密钥的句柄
CryptImportKey
把一个密钥 BLOB 传送到 CSP 中
CryptSetKeyParam
指定一个密钥的参数
编码/解码函数:
CryptDecodeObject
对 lpszStructType 结构进行解码
CryptDecodeObjectEx
对 lpszStructType 结构进行解码,此函数支持内存分配选项
CryptEncodeObject
对 lpszStructType 结构进行编码
CyptEncodeObjectEx
对 lpszStructType 结构进行编码,此函数支持内存分配选项
CryptEncrypt 和 CryptDecrypt 要求在被调用前指定一个密钥。
这个密钥可以由 CryptGenKey、CryptDeriveKey 或 CryptImportKey 产生。创建密
钥时要指定加密算法。CryptSetKeyParam 函数可以指定额外的加密参数。
CryptDecrypt
使用指定加密密钥来解密一段密文
CryptEncrypt
使用指定加密密钥来加密一段明文
CryptProtectData
执行对 DATA_BLOB 结构的加密
CryptUnprotectData
执行对 DATA_BLOB 结构的完整性验证和解密
计算哈希、创建和校验数字签名:
CryptCreateHash
创建一个空哈希对象
CryptDestoryHash
销毁一个哈希对象
CryptDuplicateHash
复制一个哈希对象
CryptGetHashParam
得到一个哈希对象参数
CryptHashData
对一块数据进行哈希,把它加到指定的哈希对象中
CryptHashSessionKey
对一个会话密钥进行哈希,把它加到指定的哈希对象中
CryptSetHashParam
设置一个哈希对象的参数
CryptSignHash
对一个哈希对象进行签名
CryptVerifySignature
校验一个数字签名
具体的代码可在msdn上和下面的网址找到
http://www.vckbase.com/document/viewdoc/?id=974
另外据有人在使用时,会有些许不兼容的情况,该同学列出了在xp下解密成功而2000下失败的情况。
cryptoAPI 适用于双边都是windows的情况,且证书操作比较频繁,可以尝试使用该API。
.NET 下面可以用System.Security.Cryptography 命名空间提供加密服务,
其中包括数据的安全编码和解码、哈希、随机数生成和消息身份验证。这个空间应该是CrpytoCom的实现。
2009年1月14日
#
写加密解密,密钥,证书,签名的都会用的加密库 和key等。
加密算法,现在成熟的也有很多了。 最近在学习这些方面的知识,搜集了一些资料和代码。
也比较了些实现。过几日 作些整理,写些总结放上来。
1.安装python运行环境
1.安装python运行环境
2.安装python开发环境及依赖库
apt-get install python-dev
3.安装python的网络组件
apt-get install python-clientcookie
说明:安装网络组件后才可以使用urllib2及cookie相关的库
2.安装python开发环境及依赖库
apt-get install python-dev
3.安装python的网络组件
apt-get install python-clientcookie
说明:安装网络组件后才可以使用urllib2及cookie相关的库
引用 http://blog.csdn.net/digmouse/archive/2008/12/17/3537219.aspx
我就说 ubuntu 的下面 python应用这么多,怎么写个小爬虫 还不让用urllib2了。。
这个问题郁闷我好久,今天实在要用这个了,一搜找到了上面的。恩。。实在太 disgusted了。
恩,最后发现问题是本地目录下有个urllib.py 的文件。
结论就是 记住 python 是优先搜索 当前目录的!!
2009年1月6日
#
到年关了,大家都要忙着回家,或是年后的行程,老盯着特价机票也不是个事,太浪费时间了。所以,
写了个小工具-机票助手。
它能定时扫描互联网,获取指定航线的机票信息,同时当票价低于某个预设值时,会及时提醒用户。
下载地址如下:
http://xxair.googlecode.com/files/TA-1.0.0.2.exe
版本是经过了小修改的版本。有需要的就下载下来用一下吧。
2009年1月5日
#
2008年12月27日
#
通常我们抓取网页内容,或是下载网络文件使用http协议,当不能预先确定报文体的长度时,不可能在头中包含Content-Length域来指明报文体长度,此时就需要通过Transfer-Encoding域来确定报文体长度。
Transfer-Encoding域的值应当为chunked,表明采用chunked编码方式来进行报文体的传输。chunked编码是HTTP/1.1 RFC里定义的一种编码方式,因此所有的HTTP/1.1应用都应当支持此方式。
在其他的语言的库里面这个的实现完整性应该是不错的。但是在c 或是 c++ 里面有些库就会有问题。我在使用curl 和 codeproject 上面的 generic Http
库的时候就遇到了,当网页文件过大的时候,得到的response 里面会含有很多的 1ff8 开头的空行。 一搜 ,下面这个链接的仁兄也是这个问题:
http://topic.csdn.net/u/20080910/14/19995069-3d08-4e1a-ad2c-93be991b861a.html
这个1ff8 接空行的模式会有规律出现。无论是xml 还是html 的文件中如果多了这些信息,就会解析出错。仔细检查原来自己的curl中的流写入函数有问题。
改写后就好了。这个问题缠了我好久,特意记下来,如果谁要是再次遇到这个模式,可以向这边想想。
2008年12月21日
#
这一周以来,我被莫名奇妙的问题折磨的快要疯掉了。。。
过程是这样的:
一个点子,于是开始想实现它,那么开始的demo就选了c# ,想起码展示界面方便些。
迅速编码一共demo ,一共2天 搞定了。现在跑的也很好。
但是一个需求是,不是谁的电脑上都有.net运行时库。。。怎么办。回到了c++上面来。
所需要的库 也就是 网络,html、xml解析,图形界面库。
图形界面 本来可以用qt的,但是要带dll 为了方便就用了mfc。
网络库就很多了,xml 简单些就用tinyxml了,xml和html 本身就是为了解析网页来使用的。
这下好, 为了提取网页中的表格数据,真是辛苦,加上如同虚设的c++异常,我陷入了debug、
debug、、debug。 检查如何崩溃的循环中。 一周了,仍然没搞定,而那个c#版2天的demo 居然
被几个人用了起来,还没有崩溃过。。 mshtml这个控件,,说爱你不容易啊。。。
2008年10月27日
#
最近有个想法,就是想将原本是dll导出的函数,统统放到一个原本可以执行的文件中,且要求
已让能够导出函数像原来dll一样,给其他的pe来使用。
测试环境是vc8。
开始拿了小的测试工程,2个exe的project。都非常简单。传递参数,简单的add操作。没问题。
网络上许多说法,其实没有什么和平常的dll导出方法操作是一样的,只有你使用def文件的时候不要加
那行library就行。 在这个过程中还试验出。调用函数的两边都是使用dllexport 居然也能够调用成功。
于是开始了大规模的移动代码过程。代码就绪后,编译 ok 过了,链接ok 也过了。
但是在执行上出了问题。追了很久 ,发现是因为在函数内部使用了string。(注这里使用string只是做了交换的临时变量)
于是用char* 替换了string 修改代码n处。。。最终测试出在malloc上出了问题。
用string时出的问题是特权指令出错。 而用char* malloc(堆分配)时 出现的是非法访问内存。。堆分配出错。
于是改用其他的alloca(栈分配) 等一族方法,出错地址依旧。
换个思路-自己维护堆, 用api 开了一个堆。 结果在执行api时 出错。作罢。
网络上传的调用方式都是很简单的方法。。并没有动态申请内存的过程。。还有就是看雪论坛的那个帖子
olly.dbg(好像是这么拼的) 功能我不知怎么能搞出来。
还有就是"调用门" 一个exe调用一个dll ,而这个dll反过来调用exe的一个导出函数。这样的实现是能找到例子的。
核心部分嵌了几行汇编。 但是我的这个问题是没有解决的。。 只有绕过,或是也许在2进制上做手脚才行吧。。忘达人
告知解决方法。