crypto++5.0應用一例 (2千字)

看雪資料發表於2002-12-30

/*
目標為娃娃[CCG]的在論壇的文章
一篇關於密碼學的入門級破解例項-BiSHoP's CrackMe4 (30千字)
地址見http://www.chat001.com/forum/crackforum/245341.html

根據娃娃老鳥(三年算老鳥了吧)的結論
Registeration Code = [ MD5( Name + Organization ) ^ D ] MOD N
已知N , D也已經用RSATools算出
*/

#include <iostream>
#include <string.h>
#include "../crypto50/hex.h"        //HexEncoder
#include "../crypto50/md5.h"        // MD5
#include "../crypto50/filters.h"    
#include "../crypto50/files.h"        //FileSink
#include "../crypto50/rsa.h"        //rsa
#include "../crypto50/nbtheory.h"    //Integer  大數

int main(int argc, char* argv[])
{
    using namespace std;
    using namespace CryptoPP;

    MD5 md5;
    string strDigest;        //md5 摘要
    RSAFunction  rsa;        //rsa
    Integer plaintext;        //明文    即註冊碼    
    char name[100],organization[100];    //姓名,組織

    cout << "Name: ";        //輸入姓名
    ws(cin);
    cin.getline(name,100);

    cout << "Organization: ";    //輸入組織
    ws(cin);
    cin.getline(organization,100);

    //計算摘要,結果以16進位制方式放在strDigest中
    HashFilter hashFilter(md5, new HexEncoder(new StringSink(strDigest)));    
    hashFilter.Put((const byte*)name, strlen(name));                    //put name
    hashFilter.Put((const byte*)organization, strlen(organization));    //put organization
    hashFilter.MessageEnd();        

    strDigest="0x"+strDigest;        
    string letmeat="李嘉欣惡啃到掉渣,讓我啃吧,讓我啃吧!";    //==>小心花指令
    Integer c((const char*) strDigest.data());            //c以16進位制初始化
    Integer d("0x1E2D9B52ADCBC20DCCDE3C721AA740E83");    //d
    Integer n("0x24DFDA27FA14D3F27DDF62CEA5D2381F9");    //n

    rsa.Initialize(n,d);        //初始化
    plaintext = rsa.ApplyFunction(c);    //解密 得到明文

//由於未知道有沒有方便的方法輸出Integer對應的十六進位制,所以只好一個一個byte的幹了:<

    byte* buffer=new byte[1024];            
    for (int i=0;i<plaintext.ByteCount();i++)    
        buffer[plaintext.ByteCount()-1-i]=plaintext.GetByte(i);  //注意高位在後
    
    buffer[plaintext.ByteCount()]=0;

    //構造一條pipeline  一般地 pipeline的頭為Source  尾為Sink 中間為各種的filter類
    StringSource(buffer,plaintext.ByteCount(), true,        
        new HexEncoder(                        //編碼為16進位制
            new FileSink(cout)));                //輸出到螢幕
    cout << endl;

    return 0;
}

/*

我的註冊碼  (算娃娃的那兩個註冊碼發現在code的前面比他的多了個0)
name=yyxzz
organization=[CCG]
code=D54E3A1976B790C3FCCE022B777FA875


有興趣的朋友可參考如下網站或資料
crypto++作者weidai(相信是一個具有華人血統的snooker高手)  其中的faq不可不看
        http://www.eskimo.com/~weidai/cryptlib.html
doxygen 的主頁    http://www.trolocsis.com/crypto++/index.html
CryptoPPGuide.chm 在google上 雖然有點過時,但還是很有用的


                                yyxzz[CCG] 2002.12.29
*/

相關文章