文字列を取得して暗号化する簡単なアプリケーションを作成しようとしています。復号化アルゴリズムを使用して前の文字列を取得したい後。
AES暗号化/復号化はかなり良いでしょう
基本的なようですが、ほとんどの例は他の言語で書かれていますが、C ではありません。それを行う適切な例が見つかりませんでした。助けてください。
すべての提案をいただければ幸いです。:-)
文字列を取得して暗号化する簡単なアプリケーションを作成しようとしています。復号化アルゴリズムを使用して前の文字列を取得したい後。
AES暗号化/復号化はかなり良いでしょう
基本的なようですが、ほとんどの例は他の言語で書かれていますが、C ではありません。それを行う適切な例が見つかりませんでした。助けてください。
すべての提案をいただければ幸いです。:-)
次のライブラリが必要です。
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/Messier/Chandra によるこの本 Network Security with OpenSSL をチェックすることをお勧めします (Google で検索すると、この PDF が簡単に見つかります..) 章を読むこれは、EVP API を使用した対称暗号に固有のものです。これは、EVP のさまざまな機能と構造を使用する背後にある理由を実際に理解するのに非常に役立ちました。
Openssl 暗号化ライブラリを深く掘り下げたい場合は、openssl Web サイト (マシンにインストールされているバージョン) からコードをダウンロードし、EVP の実装と aeh api 実装を調べることをお勧めします。
すなわちRot-13から始めて、そこから上に向かって進んでください;)