c - 如何编写一个恒定时间函数以将最高有效位复制到所有位

标签 c cryptography bit-manipulation

我想用 C 语言编写一个函数,它获取 uint8_t 的 MSB,如果已设置,则返回 0xFF,否则返回 0x00 。简而言之,它返回一个整数,其中所有位都设置为与 MSB 相同的值。

但我想以完全恒定的时间方式进行,没有分支,没有数组偏移量,只有数学运算,保证始终接触相同数量的位数。理想情况下,没有任何未定义的行为。如何做到这一点?

最佳答案

怎么样:

#define uint8_msb_to_all_bits(x) (0xFF * ((x) >> 7))

甚至更好:

#define uint8_msb_to_all_bits(x) (-((x) >> 7))

这两者的工作方式是,如果 x 是一个 8 位无符号整数,那么 x >> 7 是 1 如果 x 的 MSB 已设置,否则为 0。剩下的就是将 1 映射到 0xFF,这可以通过乘法来完成,或者在这种特殊情况下,只需将数字取反即可。

(是的,negating an unsigned number is well defined in C。)

关于c - 如何编写一个恒定时间函数以将最高有效位复制到所有位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20059480/

相关文章:

c - 提前退出递归函数时返回什么?

python - 重用已知的排序操作对类似未排序的数据进行排序

c++ - 一个字节中的两个值

php - 在 $a == md5($b . $secret) 中查找 $secret

c - 有符号整数的谓词 "less than or equal"的高效并行字节计算

C# 从套接字读取错误的数据

c - MPI 点对点通信到集体通信 : MPI_Scatterv Trouble

.net - 为什么 System.Security.Cryptography 中有多个不同的哈希算法提供程序?

c# - 使用 Bouncy CaSTLe 计算文件的哈希值

sql - 如何在 SQL 中使用按位运算符对 int 进行翻转?