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"で開いたファイルポインタ
rsaRSA_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;
}