Tabla de contenido
Uno: Instale la biblioteca openssl en el entorno de Linux:
1. OpenSSL (Open Secure Sockets Layer): es un paquete de biblioteca de software de código abierto, las aplicaciones pueden usar este paquete para una comunicación segura,
evitar escuchas y confirmar la identidad del otro extremo de la conexión. Este paquete se usa ampliamente en servidores web en Internet.
2. Descarga de código fuente:
https://www.openssl.org/source/
3. Descomprimir:
sudo tar -zxvf openssl-1.1.1d.tar.gz -C .
4. Configuración:
sudo ./config --prefix=/usr/ssl shared zlib
Nota:
–prefix = / usr / ssl significa instalar la biblioteca openssl en el directorio / usr / ssl;
5. Compile e instale:
sudo make
sudo make install
En este punto, el archivo de la biblioteca de openssl se ha instalado en la ruta / usr / ssl, puede ejecutar el comando ls para ver:
ls /usr/ssl
7. Cree una conexión suave:
sudo ln -s /usr/ssl/bin/openssl /usr/bin/openssl
sudo ln -s /usr/ssl/include/openssl /usr/include/openssl
Nota: si falla, puede eliminar el openssl original primero
sudo rm -rf /usr/bin/openssl
sudo rm -rf /usr/include/openssl
8. Verifique la versión de openssl:
openssl version
Error:
openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
resolver:
sudo ln -s /usr/ssl/lib/libssl.so.1.1 /usr/lib/libssl.so.1.1
sudo ln -s /usr/ssl/lib/libcrypto.so.1.1 /usr/lib/libcrypto.so.1.1
Ejecute el comando anterior nuevamente: puede ver que openssl se puede ejecutar correctamente:
aston@ubuntu:/usr/include$ openssl version
OpenSSL 1.1.1d 10 Sep 2019
Dos: compile e instale en la carpeta /home/aston/huawei/openssl-1.1.1d/install_lib:
sudo tar -zxvf openssl-1.1.1d.tar.gz -C .
mkdir install_lib
sudo chown -R aston openssl-1.1.1d/
sudo ./config --prefix=/home/aston/huawei/openssl-1.1.1d/install_lib shared zlib
sudo make
sudo make install
Tres: pruebe la función de cifrado openssl:
1. Cifrado y descifrado de
EVP : 1. Cifrado y descifrado de EVP:
código:
#include <openssl/evp.h>
#include <openssl/md5.h>
#include <stdio.h>
#include <string.h>
int do_encrypt(unsigned char *iv, unsigned char *key, unsigned char *inBuffer, int inLen, unsigned char *outBuffer, int* pOutLen)
{
int tmplen;
EVP_CIPHER_CTX *ctx;
ctx = malloc(1024);
EVP_CIPHER_CTX_init(ctx);
EVP_EncryptInit_ex(ctx,EVP_aes_128_cbc(), NULL, key, iv);
if(!EVP_EncryptUpdate(ctx, outBuffer, pOutLen, inBuffer, inLen))
{
return 0;
}
if(!EVP_EncryptFinal_ex(ctx, outBuffer + *pOutLen, &tmplen))
{
return 0;
}
*pOutLen += tmplen;
EVP_CIPHER_CTX_cleanup(ctx);
free(ctx);
return 1;
}
int do_decrypt(unsigned char *iv, unsigned char *key, unsigned char*inBuffer, int inLen, unsigned char *outBuffer, int* pOutLen)
{
int tmplen;
EVP_CIPHER_CTX *ctx;
ctx = malloc(1024);
EVP_CIPHER_CTX_init(ctx);
EVP_DecryptInit_ex(ctx,EVP_aes_128_cbc(), NULL, key, iv);
if(!EVP_DecryptUpdate(ctx, outBuffer, pOutLen, inBuffer, inLen))
{
return 0;
}
if(!EVP_DecryptFinal_ex(ctx, outBuffer + *pOutLen, &tmplen))
{
return 0;
}
*pOutLen += tmplen;
EVP_CIPHER_CTX_cleanup(ctx);
free(ctx);
return 1;
}
void test_encrypt_decrypt()
{
char cmd[512] = {
0};
unsigned char iv[128] = {
0};
unsigned char key[128] = {
0};
unsigned char inBuffer[] = "hello,world";
unsigned char outBuffer[128] = {
0};
int outlen = 0;
int ret = 0;
int i = 0;
unsigned char inBuffer_new[128] = {
0};
int inlen_new = 0;
printf("input the key:\n");
memset(cmd, 0, sizeof(cmd));
fgets(cmd, sizeof(cmd), stdin);
memcpy(key, cmd, strlen(cmd));
printf("[%s:%d]:[yang] key = %s",__FUNCTION__,__LINE__,key);
memset(cmd, 0, sizeof(cmd));
printf("input the iv:\n");
fgets(cmd, sizeof(cmd), stdin);
memcpy(iv, cmd, strlen(cmd));
printf("[%s:%d]:[yang] iv = %s",__FUNCTION__,__LINE__,iv);
//int len = strlen(inBuffer);
//int len = sizeof(inBuffer);
int len = 12;
ret = do_encrypt(iv,key,inBuffer,len,outBuffer,&outlen);
//printf("[%s:%d]:[yang] inBuffer = %s, strlen(inBuffer) = %d \n",__FUNCTION__,__LINE__,inBuffer, strlen(inBuffer));
printf("[%s:%d]:[yang] outBuffer = %s, outlen = %d \n",__FUNCTION__,__LINE__,outBuffer, outlen);
printf("[%s:%d]:[yang] ret = %d \n",__FUNCTION__,__LINE__,ret);
if(ret)
{
printf("the ciphertext is:");
for(i = 0; i < outlen; i++)
{
printf("%02x",outBuffer[i]);
}
printf("\n");
}
else
{
printf("do_encrypt err\n");
}
ret = do_decrypt(iv,key,outBuffer,outlen,inBuffer_new,&inlen_new);
printf("[%s:%d]:[yang] outBuffer = %s, outlen = %d \n",__FUNCTION__,__LINE__,outBuffer, outlen);
printf("[%s:%d]:[yang] inBuffer_new = %s, inlen_new = %d \n",__FUNCTION__,__LINE__,inBuffer_new, inlen_new);
printf("[%s:%d]:[yang] ret = %d \n",__FUNCTION__,__LINE__,ret);
if(ret)
{
printf("the plaintext is:");
for(i = 0; i < inlen_new; i++)
{
printf("%c",inBuffer_new[i]);
}
printf("\n");
}
else
{
printf("do_encrypt err\n");
}
}
impresión:
/*
aston@ubuntu:/mnt/hgfs/share/source_insight/main_135/test_openssl$ ./app.out
input the key:
12345
[main:83]:[yang] key = 12345
input the iv:
12345
[main:89]:[yang] iv = 12345
[main:96]:[yang] outBuffer = :g;?GY>rQ?}
?, outlen = 16
[main:98]:[yang] ret = 1
the ciphertext is:3a673b1217189747593e7251e87d0bee
[main:117]:[yang] outBuffer = :g;?GY>rQ?}
?, outlen = 16
[main:118]:[yang] inBuffer_new = hello,world, inlen_new = 12
[main:120]:[yang] ret = 1
the plaintext is:hello,world
*/
2. Cifrado paso a paso MD5:
Código:
int test_md5_1()
{
MD5_CTX ctx;
unsigned char outmd[16];
int i=0;
memset(outmd,0,sizeof(outmd));
MD5_Init(&ctx);
MD5_Update(&ctx,"hel",3);
MD5_Update(&ctx,"lo\n",3);
MD5_Final(outmd,&ctx);
for(i=0;i<16;i<i++)
{
printf("%02X",outmd[i]);
}
printf("\n");
return 0;
}
impresión:
/*结果:
aston@ubuntu:/mnt/hgfs/share/source_insight/main_135/test_openssl$ ./app.out
B1946AC92492D2347C6235B4D2611184
*/
3. Cifrado único MD5:
código:
int test_md5_2()
{
MD5_CTX ctx;
unsigned char outmd[16];
unsigned char test_buf[16];
int i = 0;
const unsigned char data[16] = "hello\n";
memset(outmd,0,sizeof(outmd));
size_t len = 6;
MD5(data, len, outmd);
for(i = 0;i < 16;i < i++)
{
printf("%02X",outmd[i]);
}
printf("\n");
return 0;
}
impresión:
/*
aston@ubuntu:/mnt/hgfs/share/source_insight/main_135/test_openssl$ make
g++ test_openssl.cpp -g -I./include -L./lib -lssl -lcrypto -ldl -lpthread -lz -std=c++11 -o app.out
aston@ubuntu:/mnt/hgfs/share/source_insight/main_135/test_openssl$ ./app.out
B1946AC92492D2347C6235B4D2611184
*/
4. Posibles problemas:
void test_OpenSSL_init()
{
EVP_CIPHER_CTX *a = NULL;
//ctx = malloc(1024);
//EVP_CIPHER_CTX a;
OpenSSL_add_all_algorithms();
}
Nota:
No puede definir directamente la variable EVP_CIPHER_CTX,
debe personalizar el puntero a de EVP_CIPHER_CTX y luego solicitar memoria; de lo
contrario, se informará un error.