#include <openssl/rand.h>
void main()
{
int outf;
unsigned char buf[1024];
if(RAND_bytes(buf, sizeof(buf))) { /* 1 succes,
0 otherwise */
outf = open("./rnd_bytes", O_CREAT|O_TRUNC|O_RDWR,
0600);
write(outf, buf, sizeof(buf));
} else printf("-ERR: RAND_bytes\n");
}
Вычисление MD5-хэша для файла большого размера
#include <openssl/md5.h>
#define BUFSIZE (1025*16)
void main(int argc, char **argv)
{
MD5_CTX c; /* контекст хэша */
unsigned char buf[BUFSIZE];
unsigned char md_buf[MD5_DIGEST_LENGTH];
/* В командной строке передается имя файла,
для которого вычисляется хэш */
int inf = open(argv[1], O_RDWR);
/* Инициализируем контекст */
MD5_Init(&c);
/* Вычисляем хэш */
for(;;) {
int i = read(inf, buf, BUFSIZE);
if(i <= 0) break;
MD5_Update(&c, buf, (unsigned long)i);
}
/* Помещаем вычисленный хэш в буфер md_buf */
MD5_Final(md_buf, &c);
/* Отображаем результат */
for(i = 0; i < MD5_DIGEST_LENGTH; i++) ↵
printf("%02x", md_buf[i]);
}
Генерация ключей алгоритма RSA
#include <stdio.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
/* Имена ключевых файлов */
#define PRIVAT "./privat.key"
#define PUBLIC "./public.key"
void main()
{
/* указатель на структуру для хранения ключей */
RSA * rsa = NULL;
unsigned long bits = 2048; /* длина ключа в битах */
FILE *priv_key_file = NULL, *pub_key_file = NULL;
/* контекст алгоритма шифрования */
const EVP_CIPHER *cipher = NULL;
priv_key_file = fopen(PRIVAT, "wb");
pub_key_file = fopen(PUBLIC, "wb");
/* Генерируем ключи */
rsa = RSA_generate_key(bits, RSA_F4, NULL, NULL);
/* Формируем контекст алгоритма шифрования */
OpenSSL_add_all_ciphers();
cipher = EVP_get_cipherbyname("bf-ofb");
/* Получаем из структуры rsa открытый и секретный ключи
* и сохраняем в файлах. Секретный ключ шифруем с помощью
* парольной фразы «hello»
*/
PEM_write_RSAPrivateKey(priv_key_file, rsa, cipher, ↵
NULL, 0, NULL, "hello");
PEM_write_RSAPublicKey(pub_key_file, rsa);
/* Освобождаем память, выделенную под структуру rsa */
RSA_free(rsa);
}
Шифрование данных по алгоритму RSA
#include <openssl/rsa.h>
#include <openssl/pem.h>
void main(int argc, char **argv)
{
/* структура для хранения открытого ключа */
RSA * pubKey = NULL;
unsigned char *ptext, *ctext;
FILE * pub_key_file = NULL;
/* Открываем входной и создаем выходной файлы */
int inf = open(argv[1], O_RDWR);
int outf = open("./rsa.file", ↵
O_CREAT|O_TRUNC|O_RDWR, 0600);
/* Считываем открытый ключ */
pub_key_file = fopen(PUBLIC, "rb");
pubKey = PEM_read_RSAPublicKey(pub_key_file, NULL, ↵
NULL, NULL);
/* Определяем длину ключа */
int key_size = RSA_size(pubKey);
ptext = malloc(key_size);
ctext = malloc(key_size);
/* Шифруем содержимое входного файла */
while(1) {
inlen = read(inf, ptext, key_size - 11);
if(inlen <= 0) break;
outlen = RSA_public_encrypt(inlen, ptext, ctext, ↵
pubKey, RSA_PKCS1_PADDING);
if(outlen != RSA_size(pubKey)) exit(-1);
write(outf, ctext, outlen);
}
}
Дешифрование файла, зашифрованного
по RSA-алгоритму
#include <openssl/rsa.h>
#include <openssl/pem.h>
void main(int argc, char **argv)
{
RSA *privKey = NULL;
FILE *priv_key_file;
unsigned char *ptext, *ctext;
/* Открываем входной и создаем выходной файл */
inf = open(argv[1], O_RDWR);
outf = open("./test.rsa", ↵
O_CREAT|O_TRUNC|O_RDWR, 0600);
/* Открываем ключевой файл и считываем секретный ключ */
priv_key_file = fopen(PRIVAT, "rb");
privKey = PEM_read_RSAPrivateKey(priv_key_file, ↵
NULL, NULL, NULL);
/* Определяем размер ключа */
key_size = RSA_size(privKey);
ctext = malloc(key_size);
ptext = malloc(key_size);
/* Дешифруем файл */
while(1) {
inlen = read(inf, ctext, key_size);
if(inlen <= 0) break;
outlen = RSA_private_decrypt(inlen, ctext, ptext, ↵
privKey, RSA_PKCS1_PADDING);
if(outlen < 0) exit(0);
write(outf, ptext, outlen);
}
}