OpenSSLの暗号、復号化 [一回目]
最近ずっとC言語だよorz
そんなわけでOpenSSLを使った暗号、復号の一回目。
まずは暗号に必要な鍵の生成
RSA *RSA_generate_key(int keyBit, long e, void(*)(int, int, void *)callback, void *cb_arg);
で鍵ペアを生成します。
keyBitは鍵のビット数(RSAでの最大ビット数は2048)
eはよくわからないけど13や65537が多く使われるらしい。
callbackもよくわからん;
cb_argはcallbackに関係するらしい。
まぁ第一、第二引数のみで問題なく動く。
次に公開鍵のPEMファイルの出力
int PEM_write_RSA_PUBKEY(FILE *fp, RSA *rsa);
fpはstdoutや、"w"で開いたファイルポインタ
rsaはRSA_generate_keyの戻り値のRSA *を指定する。
秘密鍵のPEMファイル出力
int PEM_write_RSAPrivateKey(FILE *fp, RSA *rsa, const EVP_CIPHER *enc, unsigned char *kstr, int klen, pem_password_cb, void *u);
fp、rsaは上と同じ
enc、kstr、klen、uはよくわからん;
pem_password_cbはパスフレーズ??
とりあえずサンプルを。
コレでCドライブ直下に公開鍵(publicKey.pem)と、秘密鍵(privateKey.pem)ができているはず!!
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/rsa.h> #include <openssl/pem.h> #include <openssl/applink.c> #pragma comment(lib, "libeay32.dll") #pragma comment(lib, "ssleay32.dll") int main() { RSA *rsa; FILE *fp; if( (rsa = RSA_generate_key(2048, 13, NULL, NULL)) == NULL ) { printf("鍵ペア生成エラー"); return 1; } if( (fp = fopen("C:\\publicKey.pem", "w")) == NULL ) { RSA_free(rsa); printf("公開鍵ファイルオープンエラー"); return 1; } if( PEM_write_RSA_PUBKEY(fp, rsa) != 1 ) { fclose(fp); RSA_free(rsa); printf("公開鍵出力エラー"); return 1; } fclose(fp); if( (fp = fopen("C:\\privateKey.pem", "w")) == NULL ) { RSA_free(rsa); printf("秘密鍵ファイルオープンエラー"); return 1; } if( PEM_write_RSAPrivateKey(fp, rsa, NULL, NULL, 0, NULL, NULL) != 1 ) { fclose(fp); RSA_free(rsa); printf("秘密鍵出力エラー"); } fclose(fp); RSA_free(rsa); return 0; }