关于数据加密问题(4)

北慕城南 提交于 2019-11-29 19:40:50

关于数据加密问题

本文介绍rsa,aes加密方式。rsa是一种非对称加密算法,使用rsa加密需要一对密钥-公钥,私钥,公钥公开,私钥只能自己知道。
关于rsa存在两种使用方式。aes是一种对称加密方式,加密与解密使用同一种密钥即可。
1.公钥加密私钥解密
设备a存在公钥与私钥,将公钥开放给设备b,b设备需要发送数据,使用公钥加密数据,加密后的数据只能通过私钥解密,只有a设备存在私钥,所以b使用公钥加密的数据即使被其他设备截获,也破解不出来其中的信息,保证了数据的不可截获性。防止信息泄露。

2.私钥加密公钥解密
设备a存在公钥与私钥,设备a需要发送数据给b,设备a,将数据通过私钥加密,形成签名,和数据内容本身发送给设备b,b收取到信息后,使用公钥解密数据与数据本身比较,可以查看数据是否被篡改。可防止信息被篡改。

一.在线验证rsa加密算法

在线验证地址:点击这里
在这里插入图片描述
1.生成一对密钥
在这里插入图片描述
2.使用公钥加密数据
在这里插入图片描述
3.使用私钥解密
在这里插入图片描述
注意:公钥加密后的数据进行了base64编码输出了。
代码部分,非对称密钥较复杂,查看源码实现,后续在看。

二.aes加密方式

1.在线实现加密解密
在线加密点击这里
在这里插入图片描述
2.使用mbedtls验证aes-ECBmo模式加密解密

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<mbedtls/aes.h>
#include<mbedtls/base64.h>

int main(int argc, const char *argv[])
{
        mbedtls_aes_context aes_state;

        //密钥
        unsigned char key[16] = {'1','2','3','4','5','6'};

        //加密前数据
        unsigned char date[64] = "hello world";

        //加密后的数据
        unsigned char en_string[16];

        //解密后的数据
        unsigned char de_string[16];

        //base64编码
        unsigned char en_base64_str[64];
        unsigned char de_base64_str[64];

        size_t len;
        int ret;

        memset(en_string,0,16);
        memset(de_string,0,16);
		printf("date:%s\n",date);
        mbedtls_aes_init(&aes_state);
        //设置密钥
        ret = mbedtls_aes_setkey_enc(&aes_state,key,128);
        if(ret != 0)
        {
                printf("set encode key fail,ret:%d\n",ret);
                return -1;
        }

        size_t inlen;
        inlen = strlen(date);
        //使用123456密钥加密ECB
        ret = mbedtls_aes_crypt_ecb(&aes_state,MBEDTLS_AES_ENCRYPT,date,en_string);
        if(ret != 0)
        {
                printf("encode ecb fail,ret:%d\n",ret);
                return -1;
        }
        printf("en_string:%s\n",en_string);

        //打印16进制输出数据
        int i=0;
        char strhex[128] = {'\0'};
        for(i=0;en_string[i] != '\0';i++)
        {
                snprintf(strhex+i*2,3,"%02x",en_string[i]);
        }
        strhex[i] = '\0';

        printf("enaes hex:%s\n",strhex);

        //使用base64加密,方便打印查看字符串
        mbedtls_base64_encode(en_base64_str,64,&len,en_string,strlen(en_string));
        printf("aes encode base64:%s\n",en_base64_str);

        ret = mbedtls_aes_setkey_dec(&aes_state,key,128);
        if(ret != 0)
        {
                printf("set decode key fail,ret:%d\n",ret);
                return -1;
        }
        //直接解密aes加密后的数据
        mbedtls_aes_crypt_ecb(&aes_state,MBEDTLS_AES_DECRYPT,en_string,de_string);
        printf("aes decode:%s\n",de_string);

        return 0;
}

编译,方法和前面一致

gcc aes_test.c -o aes_test  -L/usr/local/lib -lmbedcrypto

执行可执行文件
在这里插入图片描述
加密后的数据解密出来后与原数据一致。

这里留一个问题,为什么可执行程序采用aes-ECB加密出来的base64与hex字符串与在线加密结果有差异?还是在什么地方理解错了。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!