关于数据加密问题
本文介绍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字符串与在线加密结果有差异?还是在什么地方理解错了。
来源:https://blog.csdn.net/qq_38240926/article/details/100761934