#include <stdio.h>
#include <stdio.h>
#include <string.h>
#include <openssl/evp.h>
#include <openssl/objects.h>
#include <openssl/rand.h>
int main(int argc, char* argv[])
{
int i;
// salt bufer length = 8
unsigned char salt[8];
// EVP_CIPHER = Cipher structure
const EVP_CIPHER *cipher = NULL;
// password pointer. password = “aaaa”
char *password = “aaaa”;
// 키와 IV가 저장될 변수를 정의하고 길이는 OpenSSL에서 알아서 정해준다.
unsigned char key[EVP_MAX_KEY_LENGTH], iv[EVP_MAX_IV_LENGTH];
int ret = 0;
// PRNG를 통해 랜덤 수를 만들고 그 값을 Salt에 저장한다. 길이는 8
ret = RAND_pseudo_bytes(salt, 8);
// PRNG에서 에러가 발생할 경우 에러 메시지를 출력하고 프로그램을 종료한다.
if(ret < 0) {
printf(“Can’t generate random number.n”);
return 0;
}
// 암호화 구조체의 인스턴스를 생성. 여기서는 DES의 ECB 모드의 암호화 구조체 생성
cipher = EVP_des_ecb();
// 키와 IV를 생성함. 인자는 암호화 구조체, 다이제스트 구조체, salt 값, 패스워드
// 카운트는 생성될 키와 IV를 저장할 변수
// 다이제스트 구조체는 EVP_md5() 함수를 통해 생성. 카운트는 한번
EVP_BytesToKey(cipher, EVP_md5(), salt, (unsigned char *)password, strlen(password), 1, key, iv);
// display salt
for(i = 0; i < sizeof(salt); i++) {
printf(“%02X”, salt[i]);
}
// Display key
if(cipher->key_len > 0) {
for(i = 0; i < cipher->key_len; i++) {
printf(“%02X”, key[i]);
}
}
// Display IV
if(cipher->iv_len > 0) {
for(i = 0; i < cipher->iv_len; i++) {
printf(“%02X”, iv[i]);
}
}
return 0;
}