현재 위치 - 법률 상담 무료 플랫폼 - 특허 조회 - OpenSSL 의 EVP 사용법
OpenSSL 의 EVP 사용법
OpenSSL EVP 는 다양한 암호화 기능을 제공합니다. OpenSSL 에는 다양한 대칭 알고리즘, 추상 알고리즘 및 서명/서명 유효성 검사 알고리즘이 구현되었습니다. EVP 함수는 이러한 특정 알고리즘을 캡슐화합니다.

EVP 는 주로 다음 기능을 캡슐화합니다.

1) BASE64 코덱 BIO; 가 구현되었습니다.

2) 생물학적 정보의 암호화 및 암호 해독을 달성한다. 을 눌러 섹션을 인쇄할 수도 있습니다

3) 추상 생물을 실현하다. 을 눌러 섹션을 인쇄할 수도 있습니다

4) 신뢰할 수있는 io 를 달성하기 위해;

5) 패키지 요약 알고리즘;

6) 패키지 대칭 암호화 및 암호 해독 알고리즘;

7) 비대칭 키를 캡슐화하는 암호화 (공개 키), 암호 해독 (개인 키), 서명 및 인증, 액세스 가능성

8) 암호 기반 암호화 (pbe);

9) 대칭 키 처리

10) 디지털 봉투: 디지털 봉투는 상대방의 공개 키를 사용하여 대칭 키를 암호화하고 이 대칭 키를 사용하여 데이터를 암호화합니다. 상대방에게 보낼 때 대칭 키 암호문과 데이터 암호문이 동시에 전송됩니다. 수신자는 먼저 자신의 개인 키로 키 암호문을 해독하여 대칭 키를 얻은 다음 이를 사용하여 데이터를 해독합니다.

1 1) 기타 액세스 가능성.

이 문서에서는 OpenSSL 이 설치되어 있고 소스 코드 사본이 1. 1. 1 인 것으로 가정합니다.

EVP 관련 헤더 파일은 evp.h 에 있고 소스 파일은 crypto/evp 디렉토리에 있습니다.

EVP 의 기능이 너무 강하고, 나의 정력과 수준이 제한되어 있기 때문에, 잠시 일부 기능만 발췌하고 설명한다.

이 구조는 요약 알고리즘의 추상 방법을 정의합니다. 주요 필드 의미:

추상 알고리즘의 유형 NID 입니다.

PKEY _ TYPE- 요약 알고리즘과 연관된 키 NID 입니다.

MD _ size- 요약 값의 출력 크기입니다.

깃발-내부 표시.

Init- 초기화 함수입니다.

갱신-계산 기능을 시작합니다.

최종 출력 계산 기능.

복사-요약 작업 컨텍스트 복사 기능.

정리-요약 작업 컨텍스트 정리 기능.

Block _ size- 작업 그룹 크기를 요약합니다.

CTX 크기-작업 패킷 버퍼 크기를 요약합니다.

MD _ CTRL- 합산 작업 명령 제어 기능.

지원되는 요약 알고리즘은 다음과 같습니다.

Constevp _ MD * EVP _ MD5 (void);

Constevp _ MD * EVP _ sha1(void);

Constevp _ MD * EVP _ sha256 (void);

Constevp _ MD * EVP _ sha512 (void);

EVP_md5 () 를 예로 들면 반환 값은 다음과 같습니다.

다음 함수는 MD 의 속성 정보를 질의합니다.

때때로 우리는 사용 된 요약 알고리즘에 익숙하지 않습니다. 이러한 함수는 매우 유용합니다.

EVP _ MD _ CTX * EVP _ MD _ CTX _ 신규 (void);

Void EVP _ MD _ CTX _ free (EVP _ MD _ CTX * CTX);

이 두 함수는 대칭 요약 컨텍스트 객체를 만들고 해제하는 데 사용됩니다.

Intevp _ digestinit (EVP _ MD _ CTX * CTX, constevp _ MD * type);

추상 컨텍스트가 초기화되고 type 은 추상 알고리즘의 추상 모음입니다.

1 성공 반환, 0 실패 반환.

Intevp _ digestupdate (EVP _ MD _ CTX * CTX, const void *d, size _ t CNT);

요약에서 계산된 스폰지 구조에 데이터를 입력합니다.

1 성공 반환, 0 실패 반환.

Intevp _ digestfinal (EVP _ MD _ CTX * CTX, unsigned char *md, unsigned int * s);

최종 요약을 생성하고 요약 값과 길이를 출력합니다.

1 성공 반환, 0 실패 반환.

Int EVP_Digest(const void *data, size_t count, unsigned char *md, unsigned int *size, constevp)

패키지화된 일회성 방법으로 작은 데이터 세그먼트의 요약을 계산합니다.

1 성공 반환, 0 실패 반환.

구조 evp_cipher_st {

Int NID

Int block _ size

/* 가변 길이 암호의 기본값/

Int key _ len

Int iv _ len

/다양한 로고/

부호없는 긴 로고;

/init 키/

Int (init) (EVP_CIPHER_CTX *ctx, const 부호 없는 char *key,

Const 부호 없는 char iv, int enc);

/데이터 암호화/암호 해독/

Int (do _ cipher) (EVP _ cipher _ CTX * CTX, 부호 없는 char *out,

Const 부호 없는 char in, size _ t inl);

/cleanup CTX/

Int (cleanup) (EVP _ cipher _ CTX);

/얼마나 큰 CTX-& gt;; Cipher_data 요구 사항은/

Int CTX _ size

/매개 변수/채우기 ASN 1_TYPE

Int (set _ ASN1_ parameters) (EVP _ cipher _ CTX *, ASN1_ type

/ASN 1_TYPE/에서 매개변수 가져오기

Int (get _ ASN1_ parameters) (EVP _ cipher _ CTX *, ASN1_ type

/기타 작업/

Int (ctrl) (EVP_CIPHER_CTX *, int type, int arg, voidptr);

/애플리케이션 데이터 */

Void app _ data

}/EVP _ cipher */;

Typedef struct EVP _ cipher _ ST EVP _ cipher;

이 구조는 대칭 암호화 알고리즘의 추상 방법을 정의합니다. 주요 필드 의미:

암호화 알고리즘의 NID-NID 입니다.

Block _ size- 패킷 크기입니다.

Key _ len- 키 길이입니다.

Iv _ len- 초기 벡터 길이입니다.

깃발-내부 표시.

Init- 초기화 함수입니다.

Do _ cipher- 중간 연산 함수입니다.

정리-마지막 작업 기능.

CTX 크기-컨텍스트 크기입니다.

Ctrl- 기능을 제어합니다.

App _ data- 데이터를 적용합니다.

지원되는 암호 추상 암호화 및 암호 해독 알고리즘은 다음과 같습니다.

Constevp _ cipher * EVP _ des _ ECB (void);

Constevp _ cipher * EVP _ des _ ede3 (void);

Constevp _ cipher * EVP _ AES _128 _ ECB (void);

Constevp _ cipher * EVP _ AES _128 _ CBC (void);

다음 함수는 암호의 속성 정보를 쿼리합니다.

Intevp _ cipher _ NID (constevp _ cipher * cipher);

Intevp _ cipher _ type (constevp _ cipher * CTX);

# EVP _ cipher _ name (e) obj _ nid2sn 정의 (EVP _ cipher _ NID (e))

Intevp _ cipher _ block _ size (constevp _ cipher * cipher);

Int EVP_CIPHER_key_length (EVP _ CIPHER * CIPHER); 상수);

Intevp _ cipher _ iv _ length (constevp _ cipher * cipher);

때때로 우리는 사용 된 암호화 알고리즘에 익숙하지 않습니다. 이러한 함수는 매우 유용합니다.

Evp _ cipher _ CTX * EVP _ cipher _ CTX _ new (void);

Void EVP _ cipher _ CTX _ free (EVP _ cipher _ CTX * c);

이 두 함수는 대칭 암호화 및 암호 해독 컨텍스트 객체를 만들고 해제하는 데 사용됩니다.

Intevp _ cipher _ CTX _ set _ key _ length (EVP _ cipher _ CTX * x, intkey len);

대칭 알고리즘의 키 길이가 가변적일 때 대칭 알고리즘의 키 길이를 설정합니다.

1 성공 반환, 0 실패 반환.

Intevp _ cipher _ CTX _ set _ padding (EVP _ cipher _ CTX * c, intpad);

대칭 알고리즘의 채우기를 설정하는 데는 채우기가 포함되는 경우가 있습니다.

Pad 의 값은 0 과 1 이고 pad 가 1 일 때 채우기를 사용합니다. 기본 채우기 정책은 PKCS5 사양을 사용합니다. 즉, 마지막 패킷이 n 바이트를 채울 때 채우기 값은 n 입니다.

1 성공 반환, 0 실패 반환.

Intevp _ encryptinit (EVP _ cipher _ CTX * CTX, const EVP_CIPHER *cipher, const unsigned char *key

대칭 암호화 컨텍스트를 초기화합니다.

추가 1 성공, 실패 0 을 반환합니다.

Intevp _ encrypt 업데이트 (EVP _ cipher _ CTX * CTX, unsigned char *out, int inl);outl, const unsigned char

일반 텍스트를 암호화합니다.

추가 1 성공, 실패 0 을 반환합니다. 성공하면 outl 에서 암호문 길이를 출력합니다.

Intevp _ encryptfinal (EVP _ cipher _ CTX * CTX, unsigned char *out, int * outl);

나머지 일반 텍스트를 암호화합니다.

추가 1 성공, 실패 0 을 반환합니다. 성공하면 outl 에서 암호문 길이를 출력합니다.

Intevp _ decryptinit (EVP _ cipher _ CTX * CTX, const EVP_CIPHER *cipher, const unsigned char *key

대칭 암호 해독 컨텍스트를 초기화합니다.

추가 1 성공, 실패 0 을 반환합니다.

Intevp _ decryptupdate (EVP _ cipher _ CTX * CTX, unsigned char *out, int inl);outl, const unsigned char

암호문을 해독하다.

추가 1 성공, 실패 0 을 반환합니다. 성공할 경우 outl 은 일반 텍스트 길이를 출력합니다.

Intevp _ decryptfinal (EVP _ cipher _ CTX * CTX, unsigned char *outm, int * outl);

남은 암호문을 해독하다.

추가 1 성공, 실패 0 을 반환합니다. 성공할 경우 outl 은 일반 텍스트 길이를 출력합니다.

Intevp _ bytes 토큰 (constevp _ cipher * type, const EVP_MD *md,

Const 부호 없는 char *salt,

Const 부호 없는 char *data, int datal, int count

Unsigned char *key, unsigned char * iv);

알고리즘 유형, 추상 알고리즘, salt 및 입력 데이터를 기준으로 대칭 키 및 초기화 벡터 iv 를 계산하는 키 함수를 계산합니다. 추가 키의 길이.

이 함수는 PEM_do_header () 함수에서 사용되어 비밀번호에서 키를 생성합니다.

이 구조는 비대칭 키 정보의 저장 컨테이너를 정의합니다. 주요 필드 의미:

비대칭 암호화 알고리즘의 유형 NID 입니다.

Save _ type- 저장된 PKEY 유형입니다.

PKEY- RSA 구조 포인터와 같은 저장된 PKEY 포인터입니다.

Evp _ pkey * EVP _ pkey _ new (void);

Void EVP _ pkey _ free (EVP _ pkey * pkey);

이 두 함수는 PKEY 컨텍스트 객체를 만들고 해제하는 데 사용됩니다.

Intevp _ pkey _ assign (EVP _ pkey * pkey, int type, void * key);

기호키 연관에 대한 알고리즘 유형의 컨텍스트 구조를 지정합니다. 예를 들어 RSA 와 연관된 매크로는 다음과 같이 정의됩니다.

# EVP_SignInit(a, b) EVP _ digestinit 정의 (a, b)

# EVP_SignUpdate(a, b, c) EVP _ digestupdate 정의 (a, b, c)

Intevp _ signfinal (EVP _ MD _ CTX * CTX, 부호 없는 char *md, 부호 없는 int *s,

Evp _ pkey * pkey);

계산에 서명하다. 매크로 정의에서 알 수 있듯이 추상화는 실제로 먼저 계산된 다음 RSA 개인 키로 암호화됩니다.

추가 1 성공, 실패 0 을 반환합니다.

# EVP_VerifyInit(a, b) EVP _ digestinit 정의 (a, b)

# EVP_VerifyUpdate(a, b, c) EVP _ digestupdate 정의 (a, b, c)

Intevp _ verify final (EVP _ MD _ CTX * CTX, const unsigned char *sigbuf

Unsigned int siglen, EVP _ pkey * pkey);

계산 결과를 확인하고 서명합니다. 매크로 정의에서 알 수 있듯이 실제로는 요약을 먼저 계산한 다음 RSA 공개 키로 서명을 해독한 다음 요약과 비교합니다.

추가 1 성공, 실패 0 을 반환합니다.

다음 예에서는 두 가지 MD5 방법을 사용하여 추상 계산을 수행하는 프로세스를 보여 줍니다.

출력:

EVP_DigestInit() ret:[ 1]

Evp _ digestupdate () ret: [1]

Evp _ digestfinal () ret: [1]

E380e88e8d09ebf8d8659a15b0ea70b5

EVP_Digest() ret: 1

E380e88e8d09ebf8d8659a15b0ea70b5

다음 예는 DES 암호화 및 암호 해독 프로세스를 보여 줍니다. 프로그램 구현을 용이하게 하기 위해 std::string 을 예외로 사용합니다.

출력:

Evp _ encryptinit () ret: [1]

Evp _ encryptupdate () ret: [1]

마귀: [24]

Evp _ encryptfinal () ret: [1]

NCipherLen:[8]

비밀번호 크기: [32]

Evp _ decryptinit () ret: [1]

Evp _ decryptupdate () ret: [1]

NTextLen:[24]

Evp _ decryptfinal () ret: [1]

NTextLen:[2]

텍스트 크기: [26] 본문: [abcdefghijklmnopqrstuvwxyz]

다음 예에서는 RSA 서명 및 서명 유효성 검사 계산에 SHA 1 을 사용하는 프로세스를 보여 줍니다.

출력:

Rsa _ generate _ key _ ex () ret: [1]

Evp _ pkey _ assign _ RSA () ret: [1]

EVP_SignInit() ret:[ 1]

EVP_SignUpdate() ret:[ 1]

EVP_SignFinal() ret:[ 1]

Sha 1 len:[64]

EVP_VerifyInit() ret:[ 1]

Evp _ verifyupdate () ret: [1]

Evp _ verifyfinal () ret: [1]