AES与对称加密
其实,AES 是 对称加密,而非 非对称加密,这是一个常见的误解。接下来,我将从加密原理、对称加密的含义和它的应用,以及如何在彌入式环境中应用给你逐一解释。
- 对称加密与非对称加密的区别
对称加密:加密和解密使用相同的密钥。比如,AES就是典型的对称加密算法。你和对方使用相同的密钥来加密和解密数据。
举个例子:
假设你和朋友有一个秘密的锁(密钥),你用这个锁把信封加锁(加密),然后朋友用同样的锁打开信封(解密)。
但是,问题在于如果别人拿到了这个锁(密钥),就能打开信封,所以密钥的保密至关重要。
非对称加密:加密和解密使用不同的密钥。通常有一个公钥和一个私钥。例如,RSA是一个典型的非对称加密算法。公钥用于加密数据,而私钥用于解密数据。加密方用公钥加密,解密方用私钥解密。
举个例子:
公钥就像一个信箱,你只能用它来投信,不能用它取信。私钥就像信箱的钥匙,只有拥有私钥的人才能取出信件。
- AES加密原理(对称加密的实现)
AES 是一种使用 固定长度密钥(128位、192位或256位)来加密数据的对称加密算法。它的基本原理包括以下几个步骤:
分块处理:
AES 将输入数据分为固定长度的块(例如128位)。如果数据不够长度,会使用填充方法填充至适当长度。
多轮变换:
AES通过多轮的操作来进行加密,通常是10轮(对于128位密钥)。每一轮包括:
字节替代(SubBytes):使用一个固定的替代表替换数据块中的字节。
行移位(ShiftRows):把数据块中的每一行进行循环移位。
列混淆(MixColumns):混合数据块的列。
轮密钥加(AddRoundKey):每一轮都与密钥进行异或操作,使得密钥影响最终的结果。
解密过程:
解密的步骤与加密相似,只不过是逆操作。每一轮的操作都会反转,即:移位和替代反向,密钥加法也会反向。
- AES加密的示例(通俗易懂的举例)
假设我们有一段明文:
明文:Hello, World!
我们将这段文字使用一个 128位的密钥(假设密钥是随机生成的)加密:
明文通过AES算法被分成多个数据块(通常是16字节)。
每一个数据块都通过上述的AES操作(SubBytes、ShiftRows、MixColumns、AddRoundKey)进行加密,最终生成的密文是不可读的。
解密过程:
密文再次通过反向操作(逆SubBytes、逆ShiftRows、逆MixColumns、AddRoundKey)与加密时的密钥进行运算,最终恢复出明文。
- 对称加密在嵌入式中的应用
在嵌入式系统中,AES经常被用来进行数据加密,确保通信的安全性。比如:
无线传输:在物联网设备中,AES可用于加密传输的数据,防止被恶意截获。
固件加密:嵌入式设备的固件可以通过AES加密,防止恶意篡改。
存储加密:某些设备可能需要加密存储的数据,AES可以保护设备中的敏感数据。
- 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
- 总结
对称加密是加密和解密使用相同密钥的加密方式,AES是经典的对称加密算法,广泛用于保护数据的机密性。
AES加密过程是多轮复杂的数学变换,确保数据在没有密钥的情况下无法被破解。
在嵌入式系统中,AES被广泛应用于保护通信、存储和固件等敏感数据。
通过简单的C++代码,你可以在Ubuntu上验证AES加密与解密过程。