Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转)

Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转)  

2012-11-19 11:28:00|  分类: c++|举报|字号 订阅


背景(只是个人感想,技术上不对后面的内容构成知识性障碍,可以skip):

最近,基于某些原因和需要,笔者需要去了解一下Crypto++库,然后对一些数据进行一些加密解密的操作。

笔者之前没接触过任何加密解密方面的知识(当然,把每个字符的ASCII值加1之流对明文进行加密的“趣事”还是干过的,当时还很乐在其中。),甚至一开始连Crypto++的名字都没有听过,被BS了之后,就开始了Crypto++的入门探索过程。

最初,大概知道了要了解两大类算法中的几个算法——对称加密算法:DES、AES(后来因为人品好的缘故也了解了下非对称加密算法RSA,后文会详述何谓“人品好”);散列算法(需要通过Hash运算):SHA-256。

起初,笔者以为这样的知名算法在网上应该有很多现成的例子。笔者比较懒,对于自己不熟悉的东西,总希望找捷径,直接找别人现(在已经写)成可(编译运)行的代码然后施展ctrl + C,ctrl + V算法(咳,什么算法,是大法!!!)。

However,发觉网上的例子不是稀缺,就是只有代码没有解释。笔者觉得很难忍受这样的“莫名其妙”(奇怪的是笔者容忍了windows了,尽管它不开源),遂决定从零开始……

 

 

 

……写在代码前……


      如果之前像笔者一样没相关经验——完全没接触过加密解密——,请务必阅读下文。
 

一些前期工作——编译cryptlib并使其可用:

      本文不涉及这部分内容,因为已经有相对完善的资料:
        http://www.cnblogs.com/cxun/archive/2008/07/30/743541.html

 

总结了一点预备知识:

关于几个算法的介绍,网上各大百科都有,笔者不再详细Ctrl+C/V了。不过在写代码之前,即使复制修改人家代码之前,也有必要了解一下几个算法(除了名称之外)的使用流程(不是算法具体的实现,汗!)。

 

对称加密:(AES、DES)

相对于与非对称加密而言,加密、解密用的密匙相同就像日常生活中的钥匙,开门和锁门都是同一把。

详见:http://baike.baidu.com/view/119320.htm

 

非对称加密:(RSA)

相对于上述的对称加密而言,加密、解密用的密匙不同有公匙和私匙之分。

详见:http://baike.baidu.com/view/554866.htm 


散列算法:(SHA系列,我们熟悉的MD5等)

用途:验证信息有没有被修改。

原理:对长度大的信息进行提炼(通过一个Hash函数),提炼过后的信息长度小很多,得到的是一个固定长度的值(Hash值)。对于两个信息量很大的文件通过比较这两个值,就知道这两个文件是否完全一致(另外一个文件有没有被修改)。从而避免了把两个文件中的信息进行逐字逐句的比对,减少时间开销。

形象地描述:鬼泣3里面维吉尔跟但丁除了发型之外都很像。怎么区分两个双生子?比较他们的DNA就好比是比较信息量很大的文件,然而直接看发型就好比是看Hash值。一眼就看出来了。

 

注:以上是笔者对几个概念的,非常不严格的,非常主观的,概括的描述,想要详细了解,可以:

http://wenku.baidu.com/view/4fb8e0791711cc7931b716aa.html

几个算法的介绍,选择,比较。

 

 

 

……Code speaking……

 

平台:WindowsXP

IDE以及工具:Visual Studio 2008 + Visual Assist

库版本:Crypto++ 5.6.0

 

 

库的文档(包括类和函数的接口列表):
http://www.cryptopp.com/docs/ref/index.html

 

 

对称加密算法:

DES:

一开始笔者并没有找到关于DES运用的很好的例程,或者说,笔者的搜索功力薄弱,未能找到非常完整的例程吧。

http://bbs.pediy.com/showthread.php?p=745389

笔者以下的代码主要是参考上面URL的论坛回帖,但是作了些修改:

 

 1 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 #include  < iostream >
 2 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途#include  < des.h >
 3 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 4 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途#pragma comment( lib,  " cryptlib.lib "  )
 5 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 6 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 using   namespace  std;
 7 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 using   namespace  CryptoPP;
 8 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 9 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 int  main(  void  )
10 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 {
11Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //主要是打印一些基本信息,方便调试:
12Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    cout << "DES Parameters: " << endl;
13Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    cout << "Algorithm name : " << DES::StaticAlgorithmName() << endl; 
14Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    
15Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    unsigned char key[ DES::DEFAULT_KEYLENGTH ];
16Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    unsigned char input[ DES::BLOCKSIZE ] = "12345";
17Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    unsigned char output[ DES::BLOCKSIZE ];
18Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    unsigned char txt[ DES::BLOCKSIZE ];
19Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
20Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    cout << "input is: " << input << endl;
21Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
22Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //可以理解成首先构造一个加密器
23Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    DESEncryption encryption_DES;
24Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
25Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //回忆一下之前的背景,对称加密算法需要一个密匙。加密和解密都会用到。
26Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //因此,设置密匙。
27Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    encryption_DES.SetKey( key, DES::KEYLENGTH );
28Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //进行加密
29Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    encryption_DES.ProcessBlock( input, output );
30Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
31Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //显示结果
32Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //for和for之后的cout可有可无,主要为了运行的时候看加密结果
33Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //把字符串的长度写成一个常量其实并不被推荐。
34Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //不过笔者事先知道字符串长,为了方便调试,就直接写下。
35Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //这里主要是把output也就是加密后的内容,以十六进制的整数形式输出。
36Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    forint i = 0; i < 5; i++ )
37Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    {
38Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途        cout << hex << (int)output[ i ] << ends;
39Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    }

40Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    cout << endl;
41Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
42Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //构造一个加密器
43Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    DESDecryption decryption_DES;    
44Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
45Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //由于对称加密算法的加密和解密都是同一个密匙,
46Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //因此解密的时候设置的密匙也是刚才在加密时设置好的key
47Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    decryption_DES.SetKey( key, DES::KEYLENGTH );
48Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //进行解密,把结果写到txt中
49Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //decryption_DES.ProcessAndXorBlock( output, xorBlock, txt );
50Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    decryption_DES.ProcessBlock( output, txt );
51Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
52Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //以上,加密,解密还原过程已经结束了。以下是为了验证:
53Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //加密前的明文和解密后的译文是否相等。
54Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    if ( memcmp( input, txt, 5 ) != 0 )
55Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    {
56Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途        cerr << "DES Encryption/decryption failed.\n";
57Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途        abort();
58Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    }

59Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    cout << "DES Encryption/decryption succeeded.\n";
60Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    
61Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    return 0;
62Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途}

63 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途

 回想一下以上代码的编写过程,就可以发现,进行DES加密,流程大概是:
       数据准备;
       构造加密器;
       设置加密密匙;
       加密数据;
       显示(非必要);
       设置解密密匙(跟加密密匙是同一个key);
       解密数据;
       验证与显示(非必要);
       由此可见,主要函数的调用流程就是这样。但是文档没有详细讲,笔者当时打开下载回来的源文件时,就傻了眼。
猜想:
       AES和以后的算法,是不是都是按照这些基本的套路呢?


       AES:    

       在实际运用的时候,从代码上看,AES跟DES非常相像。但是值得注意一点的是,AES取代了DES成为21世纪的加密标准。是因为以其密匙长度和高安全性获得了先天优势。虽然界面上看上去没多大区别,但是破解难度远远大于DES。详细情况,在之前的URL有提及过。
     
       很幸运,笔者很快就找到了AES的使用例程,而且很详细:
      http://dev.firnow.com/course/3_program/c++/cppsl/2008827/138033.html

 1 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 #include  < iostream >
 2 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途#include  < aes.h >
 3 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 4 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途#pragma comment( lib,  " cryptlib.lib "  )
 5 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 6 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 using   namespace  std; 
 7 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 using   namespace  CryptoPP;
 8 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 9 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 int  main()
10 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 {
11Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
12Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //AES中使用的固定参数是以类AES中定义的enum数据类型出现的,而不是成员函数或变量
13Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //因此需要用::符号来索引
14Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    cout << "AES Parameters: " << endl;
15Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    cout << "Algorithm name : " << AES::StaticAlgorithmName() << endl;      
16Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
17Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //Crypto++库中一般用字节数来表示长度,而不是常用的字节数
18Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    cout << "Block size     : " << AES::BLOCKSIZE * 8 << endl;
19Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    cout << "Min key length : " << AES::MIN_KEYLENGTH * 8 << endl;
20Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    cout << "Max key length : " << AES::MAX_KEYLENGTH * 8 << endl;
21Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
22Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //AES中只包含一些固定的数据,而加密解密的功能由AESEncryption和AESDecryption来完成
23Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //加密过程
24Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    AESEncryption aesEncryptor; //加密器 
25Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
26Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    unsigned char aesKey[AES::DEFAULT_KEYLENGTH];  //密钥
27Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    unsigned char inBlock[AES::BLOCKSIZE] = "123456789";    //要加密的数据块
28Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    unsigned char outBlock[AES::BLOCKSIZE]; //加密后的密文块
29Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    unsigned char xorBlock[AES::BLOCKSIZE]; //必须设定为全零
30Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
31Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    memset( xorBlock, 0, AES::BLOCKSIZE ); //置零
32Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
33Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    aesEncryptor.SetKey( aesKey, AES::DEFAULT_KEYLENGTH );  //设定加密密钥
34Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    aesEncryptor.ProcessAndXorBlock( inBlock, xorBlock, outBlock );  //加密
35Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
36Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //以16进制显示加密后的数据
37Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    forint i=0; i<16; i++ ) {
38Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途        cout << hex << (int)outBlock[i] << " ";
39Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    }

40Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    cout << endl;
41Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
42Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //解密
43Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    AESDecryption aesDecryptor;
44Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    unsigned char plainText[AES::BLOCKSIZE];
45Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
46Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    aesDecryptor.SetKey( aesKey, AES::DEFAULT_KEYLENGTH );
47Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //细心的朋友注意到这里的函数不是之前在DES中出现过的:ProcessBlock,
48Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //而是多了一个Xor。其实,ProcessAndXorBlock也有DES版本。用法跟AES版本差不多。
49Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //笔者分别在两份代码中列出这两个函数,有兴趣的朋友可以自己研究一下有何差异。
50Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    aesDecryptor.ProcessAndXorBlock( outBlock, xorBlock, plainText );
51Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
52Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
53Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    forint i=0; i<16; i++ ) 
54Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    {      
55Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途        cout << plainText[i];   
56Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    }

57Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    cout << endl;
58Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
59Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    return 0;
60Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途}

61 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
62 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途


其实来到这里,都可以发现,加密解密的套路也差不多,至于之后笔者在误打误撞中找到的RSA,也只不过是在设置密匙的时候多了私匙和公匙的区别而已。笔者总觉得,有完整的例程对照学习,是一件很幸福的事情。

 

非对称加密算法:

RSA:

小背景:
       其实,笔者在一开始并没有接到“了解RSA”的要求。不过由于笔者很粗心,在看AES的时候只记得A和S两个字母,Google的时候就误打误撞Google了一个RSA。其实RSA方面的资料还是挺多的,因此它事实上是笔者第一个编译运行成功的Crypto++库中算法的应用实例。
       
         http://www.cnblogs.com/cxun/archive/2008/07/30/743541.html
       以下代码主要是按照上述URL中提供的代码写成的,作为笔者的第一份有效学习资料,笔者认为作为调用者的我们,不用清楚算法实现的细节。只需要明白几个主要函数的功用和调用的次序即可。
       由以下代码可以看出,其实RSA也离不开:数据准备、设置密匙(注意,有公匙和私匙)、加密解密这样的套路。至于如何产生密匙,有兴趣的朋友可以到Crypto++的主页上下载源文件研究。作为入门和了解阶段,笔者觉得:只需要用起来即可。

  1 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 // version at Crypto++ 5.60
  2 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 #include  " randpool.h "
  3 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途#include  " rsa.h "
  4 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途#include  " hex.h "
  5 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途#include  " files.h "
  6 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途#include  < iostream >
  7 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
  8 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 using   namespace  std;
  9 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 using   namespace  CryptoPP;
 10 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 11 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途#pragma comment(lib,  " cryptlib.lib " )
 12 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 13 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 14 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 // ------------------------
 15 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 16 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 //  函数声明
 17 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 18 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 // ------------------------
 19 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 20 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 void  GenerateRSAKey( unsigned  int  keyLength,  const   char   * privFilename,  const   char   * pubFilename,  const   char   * seed  );
 21 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 string  RSAEncryptString(  const   char   * pubFilename,  const   char   * seed,  const   char   * message );
 22 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 string  RSADecryptString(  const   char   * privFilename,  const   char   * ciphertext );
 23 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途RandomPool  &  GlobalRNG();
 24 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 25 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 // ------------------------
 26 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 //  主程序
 27 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 // ------------------------
 28 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 29 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 void  main(  void  )
 30 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 31 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 {
 32Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    char priKey[ 128 ] = 0 };
 33Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    char pubKey[ 128 ] = 0 };
 34Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    char seed[ 1024 ]  = 0 };
 35Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 36Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    // 生成 RSA 密钥对
 37Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    strcpy( priKey, "pri" );  // 生成的私钥文件
 38Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    strcpy( pubKey, "pub" );  // 生成的公钥文件
 39Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    strcpy( seed, "seed" );
 40Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    GenerateRSAKey( 1024, priKey, pubKey, seed );
 41Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 42Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    // RSA 加解密
 43Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    char message[ 1024 ] = 0 };
 44Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    cout<< "Origin Text:\t" << "Hello World!" << endl << endl;
 45Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    strcpy( message, "Hello World!" );
 46Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    string encryptedText = RSAEncryptString( pubKey, seed, message );  // RSA 公匙加密
 47Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    cout<<"Encrypted Text:\t"<< encryptedText << endl << endl;
 48Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    string decryptedText = RSADecryptString( priKey, encryptedText.c_str() );  // RSA 私匙解密
 49Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途}

 50 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 51 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 52 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 53 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 // ------------------------
 54 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 55 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 //  生成RSA密钥对
 56 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 57 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 // ------------------------
 58 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 59 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 void  GenerateRSAKey(unsigned  int  keyLength,  const   char   * privFilename,  const   char   * pubFilename,  const   char   * seed)
 60 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 {
 61Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    RandomPool randPool;
 62Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    randPool.Put((byte *)seed, strlen(seed));
 63Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 64Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    RSAES_OAEP_SHA_Decryptor priv(randPool, keyLength);
 65Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    HexEncoder privFile(new FileSink(privFilename));
 66Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 67Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    priv.DEREncode(privFile);
 68Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    privFile.MessageEnd();
 69Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 70Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    RSAES_OAEP_SHA_Encryptor pub(priv);
 71Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    HexEncoder pubFile(new FileSink(pubFilename));
 72Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    pub.DEREncode(pubFile);
 73Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 74Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    pubFile.MessageEnd();
 75Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 76Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    return ;
 77Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途}

 78 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 79 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 80 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 81 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 // ------------------------
 82 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 83 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 //  RSA加密
 84 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 85 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 // ------------------------
 86 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 87 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 string  RSAEncryptString(  const   char   * pubFilename,  const   char   * seed,  const   char   * message )
 88 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 {
 89Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    FileSource pubFile( pubFilename, truenew HexDecoder );
 90Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    RSAES_OAEP_SHA_Encryptor pub( pubFile );
 91Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 92Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    RandomPool randPool;
 93Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    randPool.Put( (byte *)seed, strlen(seed) );
 94Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 95Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    string result;
 96Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    StringSource( message, truenew PK_EncryptorFilter(randPool, pub, new HexEncoder(new StringSink(result))) );
 97Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    
 98Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    return result;
 99Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途}

100 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
101 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
102 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
103 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 // ------------------------
104 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 //  RSA解密
105 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 // ------------------------
106 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
107 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 string  RSADecryptString(  const   char   * privFilename,  const   char   * ciphertext )
108 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 {
109Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    FileSource privFile( privFilename, truenew HexDecoder );
110Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    RSAES_OAEP_SHA_Decryptor priv(privFile);
111Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
112Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    string result;
113Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    StringSource( ciphertext, truenew HexDecoder(new PK_DecryptorFilter(GlobalRNG(), priv, new StringSink(result))) );
114Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
115Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    return result;
116Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途}

117 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
118 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
119 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
120 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 // ------------------------
121 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
122 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 //  定义全局的随机数池
123 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
124 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 // ------------------------
125 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
126 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途RandomPool  &  GlobalRNG()
127 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 {
128Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    static RandomPool randomPool;
129Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    return randomPool;
130Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途}

131 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
132 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途


 

散列算法:


SHA-256                                                                                                                                                                                                                                                                      

       SHA-256主要是用来求一大段信息的Hash值,跟之前三个用于加密、解密的算法有所不同。用到SHA的场合,多半是为了校验文件。
       
         笔者的参考资料:http://hi.baidu.com/magic475/blog/item/19b37a8c1fa15a14b21bbaeb.html
       请注意,笔者在实现的时候,稍微修改了一下两个子函数的实现,以满足笔者的需求。因此会与上述URL中的代码有差异。

  1 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 // http://hi.baidu.com/magic475/blog/item/19b37a8c1fa15a14b21bbaeb.html
  2 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 #include  < iostream >
  3 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途#include  < string .h >
  4 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
  5 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途#include  " sha.h "
  6 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途#include  " secblock.h "
  7 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途#include  " modes.h "
  8 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途#include  " hex.h "
  9 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 10 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途#pragma comment( lib,  " cryptlib.lib " )
 11 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 12 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 using   namespace  std;
 13 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 using   namespace  CryptoPP;
 14 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 15 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 void  CalculateDigest( string   & Digest,  const   string   & Message);
 16 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 bool  VerifyDigest( const   string   & Digest,  const   string   & Message);
 17 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 18 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 int  main(  void  )
 19 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 {
 20Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //main函数中注释掉的,关于strMessage2的代码,其实是笔者模拟了一下
 21Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //通过求Hash值来对“大”量数据进行校验的这个功能的运用。
 22Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //注释之后并不影响这段代码表达的思想和流程。
 23Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    string strMessage( "Hello world" );
 24Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    string strDigest;
 25Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //string strMessage2( "hello world" ); //只是第一个字母不同
 26Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //string strDigest2;
 27Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 28Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    CalculateDigest( strDigest, strMessage );  //计算Hash值并打印一些debug信息
 29Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    cout << "the size of Digest is: " << strDigest.size() << endl;
 30Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    cout << "Digest is: " << strDigest << endl;
 31Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 32Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //CalculateDigest( strDigest2, strMessage2 );
 33Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //why put this function here will affect the Verify function?
 34Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //作者在写代码的过程中遇到的上述问题。
 35Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //如果把这行代码的注释取消,那么之后的运行结果就不是预料中的一样:
 36Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //即使strDigest也无法对应strMessage,笔者不知道为什么,希望高手指出,谢谢!
 37Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 38Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    bool bIsSuccess = false;
 39Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    bIsSuccess = VerifyDigest( strDigest, strMessage ); 
 40Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //通过校验,看看strDigest是否对应原来的message
 41Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    if( bIsSuccess )
 42Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    {
 43Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途        cout << "sussessive verify" << endl;
 44Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途        cout << "origin string is: " << strMessage << endl << endl;
 45Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    }

 46Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    else
 47Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    {
 48Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途        cout << "fail!" << endl;
 49Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    }

 50Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 51Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //通过strDigest2与strMessage进行校验,要是相等,
 52Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //就证明strDigest2是对应的strMessage2跟strMessage1相等。
 53Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //否则,像这个程序中的例子一样,两个message是不相等的
 54Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    /*CalculateDigest( strDigest2, strMessage2 );
 55Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    bIsSuccess = VerifyDigest( strDigest2, strMessage );
 56Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    if( !bIsSuccess )
 57Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    {
 58Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途        cout << "success! the tiny modification is discovered~" << endl;
 59Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途        cout << "the origin message is: \n" << strMessage << endl;
 60Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途        cout << "after modify is: \n" << strMessage2 << endl;
 61Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    }*/

 62Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    return 0;
 63Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途}

 64 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 65 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 66 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 // 基于某些原因,以下两个子函数的实现跟原来参考代码中的实现有所区别,
 67 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 // 详细原因,笔者在CalculateDigest函数的注释中写明
 68 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 void  CalculateDigest( string   & Digest,  const   string   & Message)
 69 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 {
 70Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    SHA256 sha256;
 71Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    int DigestSize = sha256.DigestSize();
 72Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    char* byDigest;
 73Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    char* strDigest;
 74Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 75Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    byDigest = new char[ DigestSize ];
 76Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    strDigest = new char[ DigestSize * 2 + 1 ];
 77Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 78Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    sha256.CalculateDigest((byte*)byDigest, (const byte *)Message.c_str(), Message.size());
 79Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    memset(strDigest, 0sizeof(strDigest));
 80Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //uCharToHex(strDigest, byDigest, DigestSize);
 81Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //参考的代码中有以上这么一行,但是貌似不是什么库函数。
 82Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //原作者大概是想把Hash值转换成16进制数保存到一个string buffer中,
 83Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //然后在主程序中输出,方便debug的时候对照查看。
 84Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //但是这并不影响计算Hash值的行为。
 85Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //因此笔者注释掉了这行代码,并且修改了一下这个函数和后面的VerifyDigest函数,
 86Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //略去原作者这部分的意图,继续我们的程序执行。
 87Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 88Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    Digest = byDigest;
 89Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 90Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    delete []byDigest;
 91Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    byDigest = NULL;
 92Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    delete []strDigest;
 93Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    strDigest = NULL;
 94Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 95Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    return;
 96Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途}

 97 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
 98 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 bool  VerifyDigest( const   string   & Digest,  const   string   & Message)
 99 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途 {
100Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    bool Result;
101Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    SHA256 sha256;
102Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    char* byDigest;
103Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
104Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    byDigest = new char[ sha256.DigestSize() ];
105Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    strcpy( byDigest, Digest.c_str() );
106Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
107Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //HexTouChar(byDigest, Digest.c_str(), Digest.size());
108Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    //为何注释掉,请参看CalculateDigest函数的注释
109Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    Result = sha256.VerifyDigest( (byte*)byDigest, (const byte *)Message.c_str(), Message.size() );
110Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
111Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    delete []byDigest;
112Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    byDigest = NULL;
113Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途    return Result;
114Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途}

115 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途
116 Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转) - 小宝 - 征途




        后记:
        为什么写这篇文章呢?因为笔者在搜索过程中觉得这方面的资料有 点分散,因此想把它们集中起来,方便刚刚入门的朋友。
         同时,也算是为自己留点学习资料吧。


鸣谢:
jingzhongrong
vczh 
没了这两位,在这个宇宙、这个时间、这个维度肯定不会有这篇文章,哈哈!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值