2017-05-02 6 views
2
내가 DNSSEC 알고리즘 (13)에 대한 개인 키와 공개 키를 생성하려고

: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=과 일치하지 않습니다.

왜 이런 일이 일어 났습니까?

답변

3

실제로 두 값은 OpenSSL이 접두사 바이트 0x04을 추가한다는 점을 제외하고는 동일합니다. 이것은 표준 형식이며, 0x04은 점이 비 압축 형식임을 나타냅니다. 그 다음에는 점의 X 좌표 32 바이트, Y 좌표 32 바이트 (총 65 바이트)가옵니다.

DNS 항목에는 접두사 바이트가없는 X 좌표와 Y 좌표가 총 64 바이트로 있습니다.

이 추가 바이트는 첫 번째 바이트이므로 기본 64 인코딩과 두 인코딩 된 값의 정렬이 완전히 다르게 변경됩니다.

은 OpenSSL에서 먼저 값을 값을 비교 :

$ echo BAPe3AhjpcMCQPpZzZeFRwVuR4su/cmd3Vl2zn+i2izEWxOdbww/3fw4yAi0yQUUhlvXZqTnaeolOK03LOdsKkk= | base64 -D | xxd 
00000000: 0403 dedc 0863 a5c3 0240 fa59 cd97 8547 [email protected] 
00000010: 056e 478b 2efd c99d dd59 76ce 7fa2 da2c .nG......Yv...., 
00000020: c45b 139d 6f0c 3fdd fc38 c808 b4c9 0514 .[..o.?..8...... 
00000030: 865b d766 a4e7 69ea 2538 ad37 2ce7 6c2a .[.f..i.%8.7,.l* 
00000040: 49 

다음 DNS의 값 :

echo A97cCGOlwwJA+lnNl4VHBW5Hiy79yZ3dWXbOf6LaLMRbE51vDD/d/DjICLTJBRSGW9dmpOdp6iU4rTcs52wqSQ== | base64 -D | xxd 
00000000: 03de dc08 63a5 c302 40fa 59cd 9785 4705 [email protected] 
00000010: 6e47 8b2e fdc9 9ddd 5976 ce7f a2da 2cc4 nG......Yv....,. 
00000020: 5b13 9d6f 0c3f ddfc 38c8 08b4 c905 1486 [..o.?..8....... 
00000030: 5bd7 66a4 e769 ea25 38ad 372c e76c 2a49 [.f..i.%8.7,.l*I 

당신이 볼 수 있다는 점을 제외하고 추가 0x04 두 값에 대한 동일합니다.

+0

대단히 감사합니다! 나는 당신의 대답을 보았을 때 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. 그러나 그 이유를 알지 못했습니다. 그리고 당신의 대답은 이것을 아주 잘 설명합니다. 다시 한번 감사드립니다. –