0

モジュロと RSA ペアの公開キーを含む ASN.1 x509 バイト配列があります。私の目標は、これを使用して文字列を暗号化するために必要なことは何でもすることです。これを達成するために、objective-c で openssl を使用しようとしています。を使用して RSA オブジェクトを取得しようとすると、常にd2i_X509null が返されます。openssl を使用してこれを達成できない場合は、別のライブラリに切り替えるつもりです。うまくいくものを見つけるのを手伝ってください。

4

1 に答える 1

1

通常、X.509 の公開鍵を直接使用して文字列を暗号化することはありません。代わりに、(特定の品質の) 強力なラ​​ンダム キーを生成します。通常の対称暗号化 (AES など) を使用し、それを使用して文字列を暗号化します。次に、ランダム キーを X.509 で暗号化します。

その理由については、優れた PKI/Crypto の本 (例: http://www.amazon.com/Applied-Cryptography-Protocols-Algorithms-Source/dp/0471117099 ) を参照してください (キー リーク、ビット フリッピング、パディング、および (re )2回暗号化)。

これを本当にやりたい場合は、https: //github.com/dirkx/smime-add-encryption-for-recipient/blob/master/smime-add-encrypt/main.c の pkcs7_encode_rinfo 関数を見てください。

x509cert = ... something to read your x509 byte array in.

unsigned char *stuff = "Some zecret string";
int stufflen = strlen(stuff);

EVP_PKEY *pkey;
EVP_PKEY_CTX *pctx = NULL;

assert(pkey =  = X509_get_pubkey( x509cert));
assert(pctx = EVP_PKEY_CTX_new(pkey, NULL));
assert(EVP_PKEY_encrypt_init(pctx)==1);
assert((EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_ENCRYPT
                      EVP_PKEY_CTRL_PKCS7_ENCRYPT, 0, ri)==1);

size_t eklen;
assert(EVP_PKEY_encrypt(pctx, NULL, &eklen, stuff, stufflen)==1);

ek = OPENSSL_malloc(eklen);
assert(ek);

unsigned char *ek = NULL;
assert((EVP_PKEY_encrypt(pctx, ek, &eklen, key, keylen)==1);

printf("Encrypted blurp: ");
for(int i = 0; i < eklen; i++) {
    printf("0x%02X ", ek[i];
};
printf("\n");
exit(0);
于 2013-03-25T10:10:27.563 に答える