在MSVC中对两个128位值执行异或操作的最优方法是什么?
128位初始化向量与明文的异或操作:MSVC实现方案
我需要对128位初始化向量(IV)与明文执行异或操作,这是AES-CBC加密流程中的关键步骤。
在Linux x86-64环境的GCC 12.2中,仅需一行代码即可实现该异或操作:
*(unsigned __int128 *)( plaintext ) ^= *(unsigned __int128 *)( ivvectext );
完整示例代码如下:
#include <stdio.h> #include <stdint.h> int main() { uint8_t plaintext[16] = {'t','h','e','q','u','i','c','k','b','r','o','w','n','f','o','x'}; uint8_t ivvectext[16] = {'w','a','1','2','o','b','s','q','m','v','c','s','s','q','u','w'}; *(unsigned __int128 *)( plaintext ) ^= *(unsigned __int128 *)( ivvectext ); for (int i = 0; i < sizeof(plaintext); i++) { printf("%02X ", (unsigned char)plaintext[i]); } return 0; }
问题
在MSVC中,对这些128位值执行异或操作的推荐方法是什么?
解决方案
方案1:使用SIMD内置函数_mm_xor_si128
借助MSVC支持的SSE内置函数,可以高效完成128位数据的异或,代码示例如下:
#include <stdint.h> #include <immintrin.h> #include <iostream> #include <ios> #include <iomanip> int main() { uint8_t plaintext[16] = { 't','h','e','q','u','i','c','k','b','r','o','w','n','f','o','x' }; uint8_t ivvectext[16] = { 'w','a','1','2','o','b','s','q','m','v','c','s','s','q','u','w' }; __m128i plain = _mm_loadu_si128((__m128i*)plaintext); __m128i ivvec = _mm_loadu_si128((__m128i*)ivvectext); __m128i xored = _mm_xor_si128(plain, ivvec); uint8_t* xored_array = (uint8_t*)&xored; for (int i = 0; i < 16; i++) { std::cout << std::uppercase << std::setw(2) << std::setfill('0') << std::hex << (int)xored_array[i] << " "; } std::cout << std::endl; return 0; }
该代码的输出与GCC环境下的结果完全一致:
03 09 54 43 1A 0B 10 1A 0F 04 0C 04 1D 17 1A 0F
方案2:逐字节异或(易读且可被编译器优化)
如果追求代码的可读性,可以采用逐字节异或的写法,现代MSVC会自动将其优化为高效的汇编指令,无需手动处理SIMD:
for (int i = 0; i < sizeof(plaintext); i++) { plaintext[i] ^= ivvectext[i]; }
内容的提问来源于stack exchange,提问作者vengy
相关产品推荐
相关产品推荐

