2014-04-12 2 views
1

XTEA를 사용하여 std :: vector를 암호화하려고합니다. std :: vector를 사용하면 많은 양의 데이터를 다루는 여러 가지 이점이 있으므로이를 사용하고 싶습니다.std :: vector를 사용하는 XTEA- 함수

XTEA-Alogrithm은 64 비트 데이터를 암호화하는 2 개의 부호없는 long (v0 및 v1)을 사용합니다.

xtea_enc(unsigned char buf[], int length, unsigned char key[], unsigned char** outbuf) 
/* Source http://pastebin.com/uEvZqmUj */ 

unsigned long v0 = *((unsigned long*)(buf+n)); 
unsigned long v1 = *((unsigned long*)(buf+n+4)); 

내 문제는, 내가 char 벡터를 부호없는 긴 포인터로 변환하는 가장 좋은 방법을 찾고 있다는 것입니다.

암호화 기능을 위해 64 비트 부품으로 벡터를 분할하는 또 다른 방법이 있습니까?

+0

질문에 어떤 종류의 벡터인지 명시 적으로 추가하는 것이 좋습니다. 당신은 정말로'std :: vector '을 가지고 있습니까? 'xtea_enc' 함수가 라이브러리에 의해 제공되는 것처럼 보이고, 구현 세부 사항을보고 있습니다. 데이터의 시작 부분에 포인터를 더한 다음 길이를 더한 값을 전달하면됩니다. – NicholasM

답변

0

통찰력은 각 문자가 바이트라는 것을 깨닫게됩니다. 따라서 64 비트 숫자는 8 바이트 또는 두 개의 32 비트 숫자로 구성됩니다.

하나의 32 비트 숫자는 4 바이트를 저장할 수 있으므로 char 벡터의 각 8 바이트 블록에 대해 32 비트 숫자 쌍에 4 바이트 숫자 쌍을 저장하십시오. 이 예에서 char 형 버피입니다

uint32_t datablock[2]; 
datablock[0] = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | (buf[3]); 
datablock[1] = (buf[4] << 24) | (buf[5] << 16) | (buf[6] << 8) | (buf[7]); 

[8] (이상 적절 uint8_t [8]) : 당신은, 당신의 xtea의 기능에 뭔가를이 쌍을 통과 할 것입니다.

비트 시프트 '< <'연산자는 주어진 바이트의 비트가 uint32_t에 저장되어야하는 위치를 이동합니다 (예를 들어, 위 예제의 첫 번째 바이트는 데이터 블록 [ 0]). '|' 연산자는 모든 비트의 연결을 제공하므로 전체 32 비트 숫자로 끝납니다. 희망은 그 말이 맞습니다.

관련 문제