2012-12-01 45 views
2

我試圖編寫簡單的應用程序來獲取字符串並對其進行加密。 我想通過使用解密算法得到以前的字符串。如何使用C加密和解密文本?

AES加密/解密將是相當不錯的

這似乎簡單,但其他語言編寫的大多數例子,但不是C.我沒有找到任何合適的例子來做到這一點。請幫忙。

任何和所有的建議將不勝感激。 :-)

+1

那麼,你想要什麼樣的加密?什麼級別的安全性? –

+5

無論您使用何種語言,基本算法都是相同的。將文件讀入數據緩衝區,調用加密或解密函數,並將結果寫入新文件。您不需要自己編寫加密函數,它應該可以作爲庫來使用。 – Barmar

+0

AES加密/解密將會相當不錯 –

回答

2

您需要以下庫:

libc.lib 
    euser.lib 
    libcrypto.lib 

你也將需要從http://www.developer.nokia.com/info/sw.nokia.com/id/91d89929-fb8c-4d66-bea0-227e42df9053/Open_C_SDK_Plug-In.html

安裝OpenC的插件

以下是帶解釋評論的源代碼:

#include <stddef.h> 
#include <openssl/rc4.h> 
#include <openssl/md5.h> 

//#include<filelogger.h> 

void openc_encrypt(int len, unsigned char* in, unsigned char* crypted, unsigned char* password, int passlen) 
{ 
    unsigned char digest[MD5_DIGEST_LENGTH]; 
    RC4_KEY key; 

    MD5(password, passlen, digest); 

    RC4_set_key(&key, MD5_DIGEST_LENGTH, digest); 
    RC4(&key, len, in, crypted); 
} 

void openc_decrypt(int len, unsigned char* in, unsigned char* decrypted, unsigned char* password, int passlen) 
{ 
    unsigned char digest[MD5_DIGEST_LENGTH]; 
    RC4_KEY key; 

    MD5(password, passlen, digest); 

    RC4_set_key(&key, MD5_DIGEST_LENGTH, digest); 
    RC4(&key, len, in, decrypted); 
} 

///////////////////////////////////////////////////////////////////////////////////// 

const TInt KMaxTextLen = 100; 

_LIT8(KExampleText, "Encrypt this text!"); 
_LIT8(KPassWord, "secret"); 

void doExampleL() 
    {  
    TBuf8<KMaxTextLen> buffer(KExampleText); 

    HBufC8* password = KPassWord().AllocLC();  
    HBufC8* crypted = HBufC8::NewLC(buffer.Size()); 

    TPtr8 cryptedPtr = crypted->Des(); 
    cryptedPtr.SetLength(buffer.Size()); 

    openc_encrypt(buffer.Size(), 
       (unsigned char*)buffer.Ptr(), 
       (unsigned char*)cryptedPtr.Ptr(), 
       (unsigned char*)password->Ptr(), 
       password->Size()); 

    //LOGDES16(buffer); //Encrypt this text! 
    //LOGDES8(*crypted) ; //Ór›­Â Û¦ }ÖŠ4 b q 

    HBufC8* decrypted = HBufC8::NewLC(buffer.Size()); 
    TPtr8 decryptedPtr = decrypted->Des(); 

    buffer.Copy(cryptedPtr); 
    decryptedPtr.SetLength(buffer.Size()); 

    openc_decrypt(buffer.Size(),   
       (unsigned char*)buffer.Ptr(), 
       (unsigned char*)decryptedPtr.Ptr(), 
       (unsigned char*)password->Ptr(), 
       password->Size()); 

    //LOGDES16(buffer);  //Ór›­Â Û¦ }ÖŠ4 b q 
    //LOGDES8(*decrypted) ; //Encrypt this text! 

    CleanupStack::PopAndDestroy(3); //decrypted, crypted, password     
} 

本示例中的文本已使用密碼短語加密,之後使用示例函數openc_encrypt()和openc_decrypt()使用相同的密碼短語進行解密。

編輯

AES加密

(歸功於:ABHI)

對於AES加密請參考下面這個例子:http://saju.net.in/code/misc/openssl_aes.c.txt

的代碼是詳細足夠的評論,如果你仍然需要關於API的很多解釋本身我建議看看這本書網絡安全與Viega /梅西耶/錢德拉的OpenSSL(谷歌它,你會很容易地找到這個..的PDF)讀第6章是特定於對稱密碼使用EVP API ..這幫了我很多真正理解使用EVP各種功能和結構背後的原因。

如果您想深入Openssl加密庫,我建議從openssl網站(安裝在您的機器上的版本)下載代碼,然後查看EVP和aeh api實現的實現。