MOD8ID 加密芯片的 AES-GCM 模式使用

一:么是 AES-GCM 加密?

AES-GCM是一种高级加密标准(AES)的加密模式,同时使用加密和身份验证(AEAD)功能。它使用加密算法AES和Galois Counter Mode(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. 比较原始明文数据和解密后的明文数据是否匹配,如果匹配则返回真,否则返回假。

其中,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;
}

流程图如下:

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这个问题涉及到JS和Java的加密解密实现,我会尽力回答。首先,AES-GCM是一种高级加密标准(Advanced Encryption Standard)的加密模式,它是一种块加密模式,可以提供加密和认证功能。而PKCS5Padding是一种填充模式,它可以把不满足块大小的数据填充到块大小,以满足加密算法的要求。 在Node.js中,可以使用node-forge库提供的API实现AES-GCM加密,示例代码如下: ```javascript const forge = require('node-forge'); // 加密 function encrypt(plaintext, key, iv) { const cipher = forge.cipher.createCipher('AES-GCM', key); cipher.start({ iv: iv }); cipher.update(forge.util.createBuffer(plaintext)); cipher.finish(); return { ciphertext: cipher.output.toHex(), tag: cipher.mode.tag.toHex() }; } const plaintext = 'Hello, world!'; const key = forge.random.getBytesSync(32); const iv = forge.random.getBytesSync(12); const encrypted = encrypt(plaintext, key, iv); console.log(encrypted); ``` 在Java中,可以使用javax.crypto库提供的API实现AES/GCM/PKCS5Padding解密,示例代码如下: ```java import javax.crypto.Cipher; import javax.crypto.spec.GCMParameterSpec; import javax.crypto.spec.SecretKeySpec; public class Decryptor { public static String decrypt(String ciphertext, String key, String iv, String tag) throws Exception { byte[] ct = hexStringToByteArray(ciphertext); byte[] k = hexStringToByteArray(key); byte[] i = hexStringToByteArray(iv); byte[] t = hexStringToByteArray(tag); Cipher cipher = Cipher.getInstance("AES/GCM/PKCS5Padding"); SecretKeySpec keySpec = new SecretKeySpec(k, "AES"); GCMParameterSpec gcmSpec = new GCMParameterSpec(t.length * 8, i); cipher.init(Cipher.DECRYPT_MODE, keySpec, gcmSpec); cipher.update(ct); cipher.updateAAD(t); byte[] pt = cipher.doFinal(); return new String(pt); } private static byte[] hexStringToByteArray(String s) { int len = s.length(); byte[] data = new byte[len / 2]; for (int i = 0; i < len; i += 2) { data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i+1), 16)); } return data; } } ``` 以上代码仅供参考,具体实现需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值