1 cnbatch 256 天前 不如直接列出能用哪些模式 |
2 leonshaw 256 天前 不是 |
![]() | 3 geelaw 256 天前 via iPhone ……这样得到的加密算法是确定性算法,所以不具有选择明文安全性,几乎不会使用。 即使作为 DEM ,如果 hash 函数的 index 是公开的,在计数器模式下显然容易篡改,也几乎不可能使用。 |
![]() | 4 tool2dx 256 天前 via Android 就算 Aes 的 iv 无效,只要 key 正确,都能解出后续加密信息。 |
![]() | 5 alphaControler 256 天前 via Android 需要保证 IV 的安全性,不可被人获取才行的 |
![]() | 6 memorycancel 256 天前 如果应用需要保护数据和消息,那么应该优先选择采用 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%8F SM4 的 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 ``` |
7 drymonfidelia OP |
8 kenvix 255 天前 via iPhone 不行。IV 应该绝对随机,不应该从任何方式推导得到。可行的做法是自行做一个 HMAC 附加上去 |
9 kenvix 255 天前 via iPhone 具体来说,发送端创建一个 ByteArray ,组成成分是 密文的 HMAC + 随机 IV + AES-CTR 密文。接收端通过数组切片对密文做完整性验证,验证通过后用 IV+key 解密 |
![]() | 10 v1 255 天前 用 System.Security.Cryptography 可以 AES-GCM var key = new byte[32]; RandomNumberGenerator.Fill(key); using var aes = new AesGcm(key); var nOnce= new byte[AesGcm.NonceByteSizes.MaxSize]; // MaxSize = 12 RandomNumberGenerator.Fill(nonce); var plaintextBytes = Encoding.UTF8.GetBytes("KK2SYC@V2EX"); var ciphertext = new byte[plaintextBytes.Length]; var tag = new byte[AesGcm.TagByteSizes.MaxSize]; // MaxSize = 16 aes.Encrypt(nonce, plaintextBytes, ciphertext, tag); |
11 drymonfidelia OP @kk2syc Unity 的 C#不支持,我测试了你这代码 Mono Il2cpp Windows Android 全都跑不起来 PlatformNotSupportedException: Operation is not supported on this platform. System.Security.Cryptography.AesGcm..ctor (System.Byte[] key) |
![]() | 12 v1 255 天前 @drymonfidelia 噢,请问你的 unity 和.NET 版本是多少? |
![]() | 13 lysShub 255 天前 一般直接附加在密文后面,一起存储传输,不值得为那十几个 byte 走偏门 |
14 busier 255 天前 via iPhone 效率不一定比 GCM 高 而且安全性还难保障 |
15 drymonfidelia OP |
![]() | 16 mitoop 254 天前 加一个 hmac 是一个可行的方案,iv 还是保持随机,iv + 加密的字符串+hmac |
![]() | 17 jim9606 254 天前 |
18 drymonfidelia OP @jim9606 之前打错了 9.0 确实是 C#的版本。不支持好像不是语言的问题,这个报错是运行时才报的,如果是语言问题应该根本编译不过吧 |
![]() | 19 allenforrest 252 天前 GCM 运行时不支持的问题可能和架构有关,比如芯片不支持硬件加速,如果加密库底层用的是 libsodium 之类依赖硬件加速的,就无法支持 GCM ,纯软实现通常没问题(如 mbedtls 、openssl 等)。 anyway ,GCM 核心是 AEAD ,因此也可以用其他不带 AD 的模式,encrypt then MAC |