如果应用需要保护数据和消息,那么应该优先选择采用 SM4-GCM 模式.
https://github.com/memorycancel/gmssl?tab=readme-ov-file#sm4_gcm-%E8%AE%A4%E8%AF%81%E5%8A%A0%E5%AF%86%E6%A8%A1%E5%BC%8FSM4 的 GCM 模式是一种认证加密模式,和 CBC 、CTR 等加密模式的主要区别在于,GCM 模式的加密过程默认在密文最后添加完整性标签,也就是 MAC 标签,因此应用在采用 SM4-GCM 模式时,没有必要再计算并添加 SM3-HMAC 了。在有的应用场景中,比如对消息报文进行加密,对于消息头部的一段数据(报头字段)只需要做完整性保护,不需要加密,SM4-GCM 支持这种场景。在 Sm4Gcm 类的 init 方法中,除了 key 、iv 参数,还可以提供 aad 字节数字用于提供不需要加密的消息头部数据。
```ruby
key = "B789047EE36BD1DB9BCCD5B84D0E8C8D" # 16 bytes key
iv = "F0F83C02897BE824AAB58361" # 12 bytes IV
aad = "The_AAD_Data"
input = "hello_sm4_gcm"
encrypted_output, tag = SM4.gcm_encrypt(key, iv, aad, input)
SM4.gcm_decrypt(key, iv, aad, encrypted_output, tag)
#=> hello_sm4_gcm
```