【加密】-AES与对称加密

AES与对称加密

其实,AES 是 对称加密,而非 非对称加密,这是一个常见的误解。接下来,我将从加密原理、对称加密的含义和它的应用,以及如何在彌入式环境中应用给你逐一解释。

  1. 对称加密与非对称加密的区别

对称加密:加密和解密使用相同的密钥。比如,AES就是典型的对称加密算法。你和对方使用相同的密钥来加密和解密数据。

举个例子:

假设你和朋友有一个秘密的锁(密钥),你用这个锁把信封加锁(加密),然后朋友用同样的锁打开信封(解密)。

但是,问题在于如果别人拿到了这个锁(密钥),就能打开信封,所以密钥的保密至关重要。

非对称加密:加密和解密使用不同的密钥。通常有一个公钥和一个私钥。例如,RSA是一个典型的非对称加密算法。公钥用于加密数据,而私钥用于解密数据。加密方用公钥加密,解密方用私钥解密。

举个例子:

公钥就像一个信箱,你只能用它来投信,不能用它取信。私钥就像信箱的钥匙,只有拥有私钥的人才能取出信件。

  1. AES加密原理(对称加密的实现)

AES 是一种使用 固定长度密钥(128位、192位或256位)来加密数据的对称加密算法。它的基本原理包括以下几个步骤:

分块处理:

AES 将输入数据分为固定长度的块(例如128位)。如果数据不够长度,会使用填充方法填充至适当长度。

多轮变换:

AES通过多轮的操作来进行加密,通常是10轮(对于128位密钥)。每一轮包括:

字节替代(SubBytes):使用一个固定的替代表替换数据块中的字节。

行移位(ShiftRows):把数据块中的每一行进行循环移位。

列混淆(MixColumns):混合数据块的列。

轮密钥加(AddRoundKey):每一轮都与密钥进行异或操作,使得密钥影响最终的结果。

解密过程:

解密的步骤与加密相似,只不过是逆操作。每一轮的操作都会反转,即:移位和替代反向,密钥加法也会反向。

  1. AES加密的示例(通俗易懂的举例)

假设我们有一段明文:

明文:Hello, World!

我们将这段文字使用一个 128位的密钥(假设密钥是随机生成的)加密:

明文通过AES算法被分成多个数据块(通常是16字节)。

每一个数据块都通过上述的AES操作(SubBytes、ShiftRows、MixColumns、AddRoundKey)进行加密,最终生成的密文是不可读的。

解密过程:

密文再次通过反向操作(逆SubBytes、逆ShiftRows、逆MixColumns、AddRoundKey)与加密时的密钥进行运算,最终恢复出明文。

  1. 对称加密在嵌入式中的应用

在嵌入式系统中,AES经常被用来进行数据加密,确保通信的安全性。比如:

无线传输:在物联网设备中,AES可用于加密传输的数据,防止被恶意截获。

固件加密:嵌入式设备的固件可以通过AES加密,防止恶意篡改。

存储加密:某些设备可能需要加密存储的数据,AES可以保护设备中的敏感数据。

  1. Ubuntu下的C++验证代码

下面是一个在Ubuntu环境下使用C++和OpenSSL库来验证AES加密的简单示例代码:

安装OpenSSL库(如果没有安装)

sudo apt-get update

sudo apt-get install libssl-dev

C++代码示例

#include

#include <openssl/aes.h>

#include <openssl/rand.h>

#include

using namespace std;

void print_hex(unsigned char* data, int len) {

for (int i = 0; i < len; ++i)

printf("%02x ", data[i]);

printf("\n");

}

int main() {

// 明文

unsigned char plainText[] = "Hello, World!";

unsigned char key[AES_BLOCK_SIZE]; // 128 bit key (16 bytes)

unsigned char iv[AES_BLOCK_SIZE]; // 初始化向量

复制代码
// 随机生成密钥和IV
if (!RAND_bytes(key, AES_BLOCK_SIZE) || !RAND_bytes(iv, AES_BLOCK_SIZE)) {
    cerr << "Error generating random bytes!" << endl;
    return 1;
}

// 打印密钥和IV
cout << "Key: ";
print_hex(key, AES_BLOCK_SIZE);
cout << "IV: ";
print_hex(iv, AES_BLOCK_SIZE);

// 加密
AES_KEY encryptKey;
AES_set_encrypt_key(key, 128, &encryptKey);

unsigned char encryptedText[AES_BLOCK_SIZE]; // 存储密文
AES_cbc_encrypt(plainText, encryptedText, AES_BLOCK_SIZE, &encryptKey, iv, AES_ENCRYPT);

cout << "Encrypted: ";
print_hex(encryptedText, AES_BLOCK_SIZE);

// 解密
AES_KEY decryptKey;
AES_set_decrypt_key(key, 128, &decryptKey);

unsigned char decryptedText[AES_BLOCK_SIZE];
AES_cbc_encrypt(encryptedText, decryptedText, AES_BLOCK_SIZE, &decryptKey, iv, AES_DECRYPT);

cout << "Decrypted: ";
print_hex(decryptedText, AES_BLOCK_SIZE);
cout << "Decrypted Text: " << decryptedText << endl;

return 0;

}

解释:

密钥和IV(初始化向量):我们使用OpenSSL生成一个128位密钥(16字节)和初始化向量(IV),它们是AES加密中不可或缺的部分。

加密和解密:首先用AES_cbc_encrypt进行加密,然后用相同的密钥和IV进行解密,恢复明文。

输出:打印密钥、IV、加密后的密文和解密后的明文。

编译与运行:

g++ -o aes_example aes_example.cpp -lssl -lcrypto

./aes_example

  1. 总结

对称加密是加密和解密使用相同密钥的加密方式,AES是经典的对称加密算法,广泛用于保护数据的机密性。

AES加密过程是多轮复杂的数学变换,确保数据在没有密钥的情况下无法被破解。

在嵌入式系统中,AES被广泛应用于保护通信、存储和固件等敏感数据。

通过简单的C++代码,你可以在Ubuntu上验证AES加密与解密过程。

相关推荐
临水逸1 小时前
飞牛fnos 2025 漏洞Java跨域URL浏览器
java·开发语言·安全·web安全
yaoxin5211232 小时前
324. Java Stream API - 实现 Collector 接口:自定义你的流式收集器
java·windows·python
H Corey2 小时前
数据结构与算法:高效编程的核心
java·开发语言·数据结构·算法
独行soc2 小时前
2026年渗透测试面试题总结-24(题目+回答)
网络·python·安全·web安全·渗透测试·安全狮
米羊1212 小时前
Struts 2 漏洞(上)
java·后端·struts
RisunJan2 小时前
Linux命令-ltrace(用来跟踪进程调用库函数的情况)
linux·运维·服务器
galaxyffang2 小时前
Java堆内存诊断:从工具使用到实战分析
java·jvm
byzh_rc2 小时前
[深度学习网络从入门到入土] 网络中的网络NiN
网络·人工智能·深度学习
柏木乃一2 小时前
Linux进程信号(2):信号产生part2
linux·运维·服务器·c++·信号处理·信号·异常