OpenSSLの暗号、復号化 [二回目]

今日は暗号を・・・。

前回RSA鍵を使用したRSA暗号をします。

まずはRSA公開鍵の取得

RSA *PEM_read_RSA_PUBKEY(FIEL *fp, RSA **rsa, pem_password_cb *cb, void *u);

fpは鍵ファイルのファイルポインタ
rsaはなんのためにあるんだろ??
cbはPEM_write_RSA_PUBKEYのcbだと思う。
uはなんだろ?


ちなみに秘密鍵の取得はこっち

RSA *PEM_read_RSAPrivateKey(FIEL *fp, RSA **rsa, pem_password_cb *cb, void *u);

基本は公開鍵と一緒だね。


公開鍵暗号RSA-OAEP)の方法↓

int RSA_public_encrypt(int flen, const unsigned char *from, unsigned char *to, RSA *rsa, int padding);

flenは平文のサイズ
fromは平文が格納されているポインタ
toは暗号文を格納するポインタ
rsaRSA
paddingはパディング方式


toの領域サイズは前回の鍵生成時のビット数をバイトにしたものになります。
(1024で公開鍵を生成したら128、2048で公開鍵を作成したら256)


また、

int RSA_size(RSA *rsa);

でサイズが取得できます。


パディング方式はいろいろあるから必要なものを選択する。


正常に終了したら0以上の値が返ります。


サンプル

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/engine.h>

#pragma comment(lib, "libeay32.lib")
#pragma comment(lib, "ssleay32.lib")

int main() {
  RSA *rsa;
  FILE *fp;
  int rsaSize;
  char *enc;
  char planeData[] = "abcdefghijklmnopqrstuvwxyz";

  if( fopen_s(&fp, "C:\\publicKey.pem", "r") != 0 ) {
    printf("公開鍵オープンエラー\n");
    return 1;
  }

  if( (rsa = RSA_read_RSA_PUBKEY(fp, NULL, NULL, NULL)) == NULL ) {
    printf("公開鍵読み込みエラー\n");
    fclose(fp);
    return 1;
  }
  fclose(fp);

  rsaSize = RSA_size(rsa);
  enc = (char *)malloc(rsaSize);
  memset(enc, '\0', rsaSize);

  if( RSA_public_encrypt(strlen(planeData), planeData, enc, rsa, RSA_PKCS1_OAEP_PADDING) < 0 ) {
    free(enc);
    RSA_free(rsa);
    printf("RSA暗号エラー\n");
    return 1;
  }
  RSA_free(rsa);

  printf("平文\n%s\n\n", planeData);
  printf("暗号文\n%s\n", enc);

  free(enc);
  return 0;
}