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]