2011-10-31 2 views
1

저는 AES로 문자열을 암호화하기 위해 Crypto ++를 사용하고 있습니다. 좋아, 잘 작동하지만 지금은 키 값을 바이트 값을 반환하는 함수를 만들고 싶습니다.Crypto ++에서 바이트 값을 반환하려면 어떻게해야합니까?

byte AESBest::gen_key() 
{ 
    AutoSeededRandomPool prng; 

    // warning: address of local variable ‘key’ returned [enabled by default] 
    byte key[AES::MAX_KEYLENGTH]; 

    prng.GenerateBlock(key, sizeof(key)); 

    //Error: invalid conversion from ‘byte {aka unsigned char}’ to ‘const byte* {aka const unsigned char*}’ [-fpermissive] } 
    return key; 
} 

음. 뭔가 명확하지 않기 때문에 열쇠를 반환 할 수 없습니다. 내가 byte key[AES::MAX_KEYLENGTH] 일식을 설정하면 나에게 반환되는 것으로 보이는 경고를 보여줍니다. 그러나 마지막으로 return 키에 잘못된 변환에 대한 이상한 오류가 있습니다.

왜 이런 일이 발생합니까?

이 문제를 어떻게 해결할 수 있습니까?


편집 : 음. 이제 저는이 2 가지 기능을 가지고 있습니다. 하지만 첫 번째 작품은 에이스 키의 64자를 반환합니다. (gen_all)

두 번째 - 이유를 모르겠 음 - 단지 4 개를 반환하십시오! 왜? (gen_part)

string AESBest::gen_all() 
{ 
    AutoSeededRandomPool prng; 
    byte key[AES::MAX_KEYLENGTH]; 
    prng.GenerateBlock(key, sizeof(key)); 

    string encoded; 
    encoded.clear(); 
    StringSource(key, sizeof(key), true, 
     new HexEncoder(
      new StringSink(encoded) 
     ) 
    ); 
    return encoded; 
} 

그리고 :

두 번째의 버그
string AESBest::gen_part() 
{ 
    AutoSeededRandomPool prng; 
    std::vector<byte> key(AES::MAX_KEYLENGTH); 
    prng.GenerateBlock(key.data(), key.size()); 

    string encoded; 
    encoded.clear(); 
    StringSource(key.data(), sizeof(key.size()), true, 
     new HexEncoder(
      new StringSink(encoded) 
     ) 
    ); 

    return encoded; 
} 

?

편집 : 신경 쓰지 마세요! 버그는 sizeof에 있었으므로 key.size()는 sizeof (key.size)가 아니요

+6

http://stackoverflow.com/questions/388242/ the-definitive-c-book-guide-and-list). 그리고 당신은 그것을 급히 필요로합니다. – sbi

+0

형식 바이트가이 라이브러리의 네이티브이기 때문에 더 나은 제 질문을 읽고 Crypto ++에 대해 알아야합니다. –

+0

@ user840718':'@sbi가 특정 키워드 (예 : 'byte'등)의 출현과 관련이 있음을 암시한다고 생각하는 이유를 직접 알지 못합니다. – sehe

답변

3

C++에서는 원시 배열을 반환 할 수 없으며 값으로 함수 인수로 전달할 수도 없습니다.

std::vector<byte> key(AES::MAX_KEYLENGTH); 
prng.GenerateBlock(key.data(), key.size()); 
return key; 

당신은 그에 따라 함수 반환 유형을 수정해야합니다 : 대신, std::vector<byte> 사용합니다. key.data() 또는 &key[0]을 사용하여 기본 데이터 배열에 대한 포인터를 가져옵니다.

+0

좋아, 그렇다면 나는 열쇠로 문자열을 enc하고 dec해야한다. e.SetKey (key, sizeof (key))를 사용해야합니다. 그걸하기 위해서, 그 열쇠는 반드시 바이트가되어야합니다. 가능합니까? –

+0

당신은 틀렸어. 'byte'에 ** 포인터 **가되기 위해서는'key'가 필요합니다. 방금 말했듯이 SetKey (key.data(), key.size())를 사용하여 데이터 포인터와 배열 크기를 가져옵니다. –

+0

설명 해 주셔서 감사합니다. 작동합니다. –

2
  • 경고 이유 : 포인터를 로컬 배열로 반환하고 있습니다. 로컬 변수가 함수를 종료 한 후 삭제되므로 이 잘못되었습니다.

  • 오류 이유 : 컴파일러에서 byte 값을 반환 할 것으로 예상했지만 포인터가 반환됩니다.

    void AESBest::gen_key(byte *key, int size) 
    { 
        AutoSeededRandomPool prng; 
        prng.GenerateBlock(key, size); 
    } 
    

    을 아래와 같이 호출 :

이 시도

당신은 [좋은 C++ 책을 (필요
byte key[AES::MAX_KEYLENGTH]; 
gen_key(key, AES::MAX_KEYLENGTH); 
관련 문제