OpenSSLの暗号、復号化 [二回目]
今日は暗号を・・・。
まずは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);
基本は公開鍵と一緒だね。
int RSA_public_encrypt(int flen, const unsigned char *from, unsigned char *to, RSA *rsa, int padding);
flenは平文のサイズ
fromは平文が格納されているポインタ
toは暗号文を格納するポインタ
rsaはRSA
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; }