:OpenSSL을 사용하여 DNSSEC 용 ECDSA 개인 및 공개 키를 생성하는 방법은 무엇입니까?
#include <stdio.h>
#include <stdlib.h>
#include <openssl/ec.h>
#include <openssl/obj_mac.h>
#include <openssl/bn.h>
int main()
{
EC_KEY *eckey = NULL;
const EC_POINT *pub_key = NULL;
const EC_GROUP *group = NULL;
const BIGNUM *res;
BN_CTX *ctx;
ctx = BN_CTX_new();
eckey = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
EC_KEY_generate_key(eckey);
res = EC_KEY_get0_private_key(eckey);
printf("Private: %s\n", BN_bn2hex(res));
group = EC_KEY_get0_group(eckey);
pub_key = EC_KEY_get0_public_key(eckey);
printf("Public: %s\n", EC_POINT_point2hex(group, pub_key, 4, ctx));
return 0;
}
테스트 :
$ gcc -lcrypto test.c
$ ./a.out | perl -MMIME::Base64 -pe 's/(?<=:\s)(.+)/encode_base64(pack "H*", $1)/e'
Private: PgO6atAv+YEuyvRvvuTyDf8kz7vp/hQKNdKJyvVVBoQ=
Public: BAPe3AhjpcMCQPpZzZeFRwVuR4su/cmd3Vl2zn+i2izEWxOdbww/3fw4yAi0yQUUhlvXZqTnaeol
OK03LOdsKkk=
은 (펄 라인은베이스 64에 다음 진수 바이너리 표기법 및 변환합니다.)
그러나이 개인 키를 DNS 서버에 설정하면 (개인 키만 허용하고 공개 키를 생성 함) OpenSSL에서 반환 한 공개 키와 일치하지 않는 공개 키를 반환합니다.
Key inside DNS server (PowerDNS):
Private-key-format: v1.2
Algorithm: 13 (ECDSAP256SHA256)
PrivateKey: PgO6atAv+YEuyvRvvuTyDf8kz7vp/hQKNdKJyvVVBoQ=
$ dig @127.0.0.1 +short example.com DNSKEY
257 3 13 A97cCGOlwwJA+lnNl4VHBW5Hiy79yZ3dWXbOf6LaLMRbE51vDD/d/DjI CLTJBRSGW9dmpOdp6iU4rTcs52wqSQ==
따라서 A97cCGOlwwJA+lnNl4VHBW5Hiy79yZ3dWXbOf6LaLMRbE51vDD/d/DjI CLTJBRSGW9dmpOdp6iU4rTcs52wqSQ==
은 BAPe3AhjpcMCQPpZzZeFRwVuR4su/cmd3Vl2zn+i2izEWxOdbww/3fw4yAi0yQUUhlvXZqTnaeol OK03LOdsKkk=
과 일치하지 않습니다.
왜 이런 일이 일어 났습니까?
대단히 감사합니다! 나는 당신의 대답을 보았을 때 bind9 소스 코드 안에 깊숙이 있었고 같은 것을 발견했다. (나는 당신이 이것을 타이핑 한 것과 동시에 생각한다.) 그들은 첫 번째 바이트없이 키의 복사본을 만든다 : https://source.isc.org/cgi- bin/gitweb.cgi? p = bind9.git; a = blob; f = lib/dns/opensslecdsa_link.c; h = 42b929a33ea4863fa07d52f435e3bd89beaf44c2; hb = HEAD # l391. 그러나 그 이유를 알지 못했습니다. 그리고 당신의 대답은 이것을 아주 잘 설명합니다. 다시 한번 감사드립니다. –