MODSEMI

News

新闻资讯

首页   
  • 新闻资讯
  •  | 
  • 媒体报告
  • MOD8ID加密芯片的AES-GCM 模式使用笔记

    来源:MODSEMI 发布日期:2023-04-19 17:28:13 浏览:5132

    AES-GCM是一种高级加密标准(AES)的加密模式,同时使用加密和身份验证(AEAD)功能。它提供保密性、完整性和认证性,并且是一种高效的加密算法。AES-GCM在网络安全和数据隐私保护方面具有广泛的应用场景,例如:

    1. 数据传输加密:AES-GCM可用于对数据进行加密传输,确保数据在传输过程中不会被窃取或篡改。例如,TLS 1.3协议中就使用AES-GCM作为其默认的加密算法。

    2. 存储加密:AES-GCM可用于对数据进行加密存储,确保数据在存储过程中不会被未经授权的人员访问或篡改。例如,硬盘加密和数据库加密中都可以使用AES-GCM。

    3. 数字签名:AES-GCM可用于生成数字签名,以验证数据的完整性和真实性。

    4. 移动设备加密:AES-GCM可用于对移动设备中的数据进行加密,以保护用户的隐私信息不被泄露。例如,iOS和Android设备都支持AES-GCM算法进行加密。

    AES-GCM的加密和身份验证是同时进行的。它采用一种称为“GHASH”的Galois域上的乘法操作来计算消息的身份验证标记(MAC),并使用一个称为“CTR”的计数器模式来加密消息。下面是AES-GCM的详细流程:

    1. 分离密钥和初始向量:AES-GCM使用128位的AES加密算法,因此密钥长度为128位、192位或256位。另外,它需要一个唯一的初始向量(IV)来确保每次加密都是不同的。IV的长度可以是96位或更大,基本上96位足够了。

    2. 初始化计数器:计数器是一个值,用于在加密和身份验证期间迭代生成密钥流,以加密和解密消息。在AES-GCM中,计数器使用CTR模式初始化。CTR模式是一种流式加密模式,它将计数器的值作为输入,并使用AES算法来生成密钥流。在AES-GCM中,计数器被初始化为IV的值。

    3. 生成密钥流:使用AES算法生成密钥流。对于每个64位的密钥流块,计数器值将递增,以产生不同的密钥流块。

    4. 加密明文:使用异或操作将明文和生成的密钥流块混合在一起,以生成密文。加密的过程是逐个字节进行的。

    5. 计算身份验证标记(MAC):使用一个称为GHASH的算法来计算MAC。GHASH是一种基于Galois域的算法,用于计算消息的身份验证标记。它将消息划分为64位块,并使用乘法和异或操作将它们混合在一起,最终生成一个128位的MAC。

    6. 生成完整的密文:将密文和MAC组合在一起,以生成完整的密文。

    7. 解密:使用相同的密钥、IV和MAC密钥流,使用异或操作对密文进行解密。

    8. 验证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芯片的加密和解密操作,并验证了解密数据的完整性和身份验证标记。

    函数流程如下:

    1. 生成128字节的随机明文数据,并打印输出。

    2. 使用随机生成的IV和密钥对明文进行加密,得到密文和身份验证标记,并打印输出。

    3. 使用相同的密钥和IV对密文进行解密,得到解密后的明文和身份验证标记,并打印输出。

    4. 验证解密的身份验证标记是否与加密时计算的身份验证标记匹配。

    5. 比较原始明文数据和解密后的明文数据是否匹配,如果匹配则返回真,否则返回假。

    6. 其中,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 failrn");
                return false;
            }
        }
        printf( "Plain text : ");
        for (int i = 0; i < 128; i++)
        {
            printf( "%02X", plaintext[i]);
        }
        printf( "rn");
     
        // Encrypt data by MOD8ID
        if (!mod8_encrypt_data(MSE_TEMPKEY_KEYID, plaintext, 128, cipherText, authTag, NULL, iv))
        {
            printf( "Encryption failedrn");
            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 rn");
        }
        else
        {
            printf( "Decrypted data authenticatedrn");
        }
     
        //Check if the plain text and decrypted texts match
        if (memcmp(plaintext, decryptedText, 128) == 0)
        {
            printf( "Decrypted text matches plain textrn");
            return true;
        }
        return false;
    }