二进制添加大字符数组?

时间:2012-02-20 16:14:45

标签: c encryption binary char hex

所以我有一个16个字符的数组,定义如下..

char CBlock[16];

在我的程序中,我正在实现CTR模式加密(不是很重要,只是说),并且CBlock被初始化为随机的128位十六进制值。我的程序需要做的是在执行加密的消息块上循环时,将此块增加1次。即。

for (i = 0; i < SOME_BIG_NUMBER; i++){
    CBlock = CBlock + 1; /*i know this isn't legal*/
    /*do some stuff*/
}

有一种简单的方法可以做到这一点吗?有没有办法可以简单地将CBlock视为一个连续的数据块?或者我是否必须使用进位等手动实现二进制(十六进制)加法。

编辑:抱歉,CBlock声明错了。

4 个答案:

答案 0 :(得分:1)

您的C版本是否具有原生128位数int128?否则也许尝试从两个int64 s中制作128位块。这将大大减少携带问题。

答案 1 :(得分:1)

一般情况下,您可以通过跟踪进位来自行实施添加。

unsigned char CBlock[16]; /* unsigned char is assumed to be at least an 8 bit type. */
/* Increment CBlock by 1. */

int carry = 1;
int i;

for (i=0; i<16; i++) {
    int sum = CBlock[i] + carry;
    CBlock[i] = (unsigned char) (sum & 0xff);
    carry = sum >> 8;
    if (carry == 0) {
        break;
    }
}

/* if (carry > 0) { we have overflowed} */

答案 2 :(得分:0)

C对大于(大多数)微处理器上的机器寄存器的数据类型没有内在支持。

虽然128位变得“接近”,但它仍然不是普遍支持的类型。因此,最好的办法是使用现有的“bignum”库,或者编写自己的代码。

如果需要增加它,那自己就不太难了。对于这种特殊情况,您可以使用uint64_t中的一对<stdint.h>

答案 3 :(得分:0)

如果您认为SOME_BIG_NUMBER足够小以适应uint64_t,并且您的系统是小端(几乎可以肯定),那么您可以这样做:

*(uint64_t *)&CBlock += 1;

*(uint64_t *)&CBlock = i;
相关问题