一:什么是 AES-GCM 加密?
AES-GCM是一种高级加密标准(AES)的加密模式,同时使用加密和身份验证(AEAD)功能。它使用加密算法AES和Galois Counter Mode(GCM)计数器模式,以实现高效的加密和身份验证,同时提供保密性、完整性和认证性。AES-GCM的加密和身份验证是同时进行的。它采用一种称为“GHASH”的Galois域上的乘法操作来计算消息的身份验证标记(MAC),并使用一个称为“CTR”的计数器模式来加密消息。下面是AES-GCM的详细流程:
- 分离密钥和初始向量:AES-GCM使用128位的AES加密算法,因此密钥长度为128位、192位或256位。另外,它需要一个唯一的初始向量(IV)来确保每次加密都是不同的。IV的长度可以是96位或更大,基本上96位足够了。
- 初始化计数器:计数器是一个值,用于在加密和身份验证期间迭代生成密钥流,以加密和解密消息。在AES-GCM中,计数器使用CTR模式初始化。CTR模式是一种流式加密模式,它将计数器的值作为输入,并使用AES算法来生成密钥流。在AES-GCM中,计数器被初始化为IV的值。
- 生成密钥流:使用AES算法生成密钥流。对于每个64位的密钥流块,计数器值将递增,以产生不同的密钥流块。
- 加密明文:使用异或操作将明文和生成的密钥流块混合在一起,以生成密文。加密的过程是逐个字节进行的。
- 计算身份验证标记(MAC):使用一个称为GHASH的算法来计算MAC。GHASH是一种基于Galois域的算法,用于计算消息的身份验证标记。它将消息划分为64位块,并使用乘法和异或操作将它们混合在一起,最终生成一个128位的MAC。
- 生成完整的密文:将密文和MAC组合在一起,以生成完整的密文。
- 解密:使用相同的密钥、IV和MAC密钥流,使用异或操作对密文进行解密。
- 验证MAC:使用相同的密钥、IV和明文,重新计算MAC,并将计算出的MAC与原始MAC进行比较。如果MAC匹配,则说明密文未被篡改。
二:AES-GCM 加密流程:
加密流程图
三 :MOD8ID加密芯片的 的 AES-GCM 加密使用示例:
MOD8ID是模微半导体推出的一款基于硬件安全引擎的加密芯片。它提供了一个安全的存储和运行环境,以及许多加密和认证功能,也包括AES-GCM加密和认证。MOD8ID确保了AES-GCM加密的密钥安全和算法安全。
AES-GCM是一种广泛使用的加密模式,它提供了高强度的数据加密和完整性保护。MOD8ID提供了硬件加速的AES-GCM实现,可以在芯片上执行快速且安全的加密和认证操作,从而提供更高的安全性和性能。基于MOD8ID可以实现许多安全应用程序,例如物联网设备、智能家居、医疗保健等等。这些应用程序通常需要处理敏感数据,例如个人身份信息、医疗记录等等。使用MOD8ID,这些数据可以被安全地加密和认证,从而保护用户的隐私和安全。
以下是基于MOD8ID的AES-GCM示例,
示例演示实现了基于MOD8ID芯片的加密和解密操作,并验证了解密数据的完整性和身份验证标记。
函数流程如下:
- 生成128字节的随机明文数据,并打印输出。
- 使用随机生成的IV和密钥对明文进行加密,得到密文和身份验证标记,并打印输出。
- 使用相同的密钥和IV对密文进行解密,得到解密后的明文和身份验证标记,并打印输出。
- 验证解密的身份验证标记是否与加密时计算的身份验证标记匹配。
- 比较原始明文数据和解密后的明文数据是否匹配,如果匹配则返回真,否则返回假。
其中,mod8_generate_random函数用于生成演示用随机明文数据,mod8_encrypt_data和mod8_decrypt_data函数分别用于加密和解密数据
// MODSEMI MOD8ID for AES-GCM test function
bool mod8_test_enc_dec()
{
//Generate random 128 byte plain text for encryption
for (int idx = 0; idx < 4; idx++)
{
if (!mod8_generate_random(_gDevice,plaintext + (idx * 32)))
{
printf( "Random data generation fail\r\n");
return false;
}
}
printf( "Plain text : ");
for (int i = 0; i < 128; i++)
{
printf( "%02X", plaintext[i]);
}
printf( "\r\n");
// Encrypt data by MOD8ID
if (!mod8_encrypt_data(MSE_TEMPKEY_KEYID, plaintext, 128, cipherText, authTag, NULL, iv))
{
printf( "Encryption failed\r\n");
return false;
}
printf( "IV : ");
for (int i = 0; i < (AES_IV_LENGTH); i++)
{
printf( "%02X", iv[i]);
}
printf( "\n Cipher text : \n");
for (int i = 0; i < 128; i++)
{
printf( "%02X", cipherText[i]);
}
printf( "\n Auth tag : \n");
for (int i = 0; i < AES_AUTH_TAG_SIZE; i++)
{
printf( "%02X", authTag[i]);
}
// Decrypt data by MOD8ID
if (!mod8_decrypt_data(MSE_TEMPKEY_KEYID, cipherText, 128, iv, authTag, decryptedText, &isVerified))
{
printf( "\n Decryption failed \r");
return false;
}
printf( "\n Decrypted data : ");
for (int i = 0; i < 128; i++)
{
printf( "%02X", decryptedText[i]);
}
if (isVerified == false)
{
printf( "\nDecryption authentication failed \r\n");
}
else
{
printf( "Decrypted data authenticated\r\n");
}
//Check if the plain text and decrypted texts match
if (memcmp(plaintext, decryptedText, 128) == 0)
{
printf( "Decrypted text matches plain text\r\n");
return true;
}
return false;
}
流程图如下: