You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 22:16:16