2012-02-20 44 views
0

,所以我有如下定義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聲明是錯誤的。

+0

這不是16個字符的數組,這是16個字符串的數組...... – 2012-02-20 16:17:57

+0

這只是我的錯誤。只是修復了原來的帖子 – 2012-02-20 16:21:42

回答

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} */ 
1

您的C版本是否具有本地128位數字int128?否則,可以嘗試從兩個int64 s開始創建128位塊。這將大大減少攜帶問題。

0

C不支持大於(大多數)微處理器上的機器寄存器的數據類型。

儘管128位變得「接近」,但它仍然不是通常支持的類型。所以你最好的選擇是使用現有的「bignum」庫,或者自己編寫代碼。

如果你只有需要增加它,這不是很難做你自己。對於這種特殊情況,您可能只需使用<stdint.h>中的一對uint64_t

0

如果可以假設SOME_BIG_NUMBER足夠小,適合在一個uint64_t,那你的系統是小端(這幾乎肯定是),那麼你可以這樣做:

*(uint64_t *)&CBlock += 1; 

或者

*(uint64_t *)&CBlock = i;