38. Linuxでopensslをインストールします:evp、md5の暗号化と復号化をテストします

1つ:Linux環境にopensslライブラリをインストールします。

1. OpenSSL(Open Secure Sockets Layer):オープンソースのソフトウェアライブラリパッケージです。アプリケーションはこのパッケージを使用して安全な通信を行い、
盗聴を回避し、接続のもう一方の端のIDを確認できます。このパッケージは、インターネット上のWebサーバーで広く使用されています。

2.ソースコードのダウンロード:

https://www.openssl.org/source/

3.解凍:

sudo tar -zxvf openssl-1.1.1d.tar.gz -C .

4.構成:

sudo ./config --prefix=/usr/ssl shared zlib

注:
–prefix = / usr / sslは、opensslライブラリを/ usr / sslディレクトリにインストールすることを意味します。

5.コンパイルしてインストールします。

sudo make
sudo make install

この時点で、opensslのライブラリファイルが/ usr / sslパスにインストールされているので、lsコマンドを実行して以下を表示できます。

ls /usr/ssl
	

7.ソフト接続を作成します。

sudo ln -s /usr/ssl/bin/openssl /usr/bin/openssl
sudo ln -s /usr/ssl/include/openssl /usr/include/openssl

注:失敗した場合は、最初に元のopensslを削除できます

sudo rm -rf /usr/bin/openssl
sudo rm -rf /usr/include/openssl

8.opensslバージョンを確認します。

openssl version 

エラー:

openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory

解決する:

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

上記のコマンドを再度実行します。opensslが正常に実行できることがわかります。

aston@ubuntu:/usr/include$ openssl version 
OpenSSL 1.1.1d  10 Sep 2019

2:コンパイルして/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

3:openssl暗号化機能をテストします。

1. EVPの暗号化と復号化:
1。EVPの暗号化と復号化:
コード:

#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");
	}

}

印刷:

/*
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. MD5の段階的な暗号化:
コード:

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;
}

印刷:

/*结果:
aston@ubuntu:/mnt/hgfs/share/source_insight/main_135/test_openssl$ ./app.out 
B1946AC92492D2347C6235B4D2611184

*/

3. MD5ワンタイム暗号化:
コード:

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;
}

印刷:

/*
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.考えられる問題:

void test_OpenSSL_init()
{
    
    
	EVP_CIPHER_CTX *a = NULL;
	//ctx = malloc(1024);
	//EVP_CIPHER_CTX a;
	OpenSSL_add_all_algorithms();
}

注:
EVP_CIPHER_CTX変数を直接定義することはできません。EVP_CIPHER_CTX
のポインターaをカスタマイズしてから、メモリーを申請する必要があります。
そうしないと、エラーが報告されます。

おすすめ

転載: blog.csdn.net/yanghangwww/article/details/113069813