2014-02-18 4 views
0

으로 변환합니다. 디지털로 서명하려면 ed25519-donna을 사용하고 있습니다.base64 디코딩 된 문자열을 unsigned char [32]

키는 unsigned char[32]이고 서명은 unsigned char[64]입니다.

this base64 encoding을 찾았지만 string으로 만 디코딩됩니다.

많은 기술을 찾아서 사용해 보았지만 변환 방법이 확실하지 않습니다.

을 디코드 한 base64를 어떻게 unsigned char[32]으로 변환 할 수 있습니까?

+0

변환 할 필요가 없습니다. 그베이스는 이미'unsigned char *'이며, 디자인 상'unsigned char const *'로 사용할 수 있습니다. 'var'을'unsigned char const * '매개 변수로 전달하는 것은 문제가 없습니다. 여기서'var'는'unsigned char var [32];로 선언되고 바이너리 키/서명으로 올바르게로드됩니다. – WhozCraig

+0

Ah. 그것은 훨씬 더 의미가 있습니다. 벌써 Base64 인 코드/디코드 구현이 많이 있습니다. 일반적으로 암호화 API에는 Microsoft CryptoAPI와 OpenSSL이 있습니다. 합리적인 구현 [당신을 위해 일할 수도 있습니다] (http://base64.sourceforge.net/b64.c)를 찾고 있다면. 파일이 아니라 벡터 또는 플랫 어레이에서 데이터를 제공하는 것은 그리 어렵지 않습니다. – WhozCraig

+0

만약'std :: string'이라면 단순히'c_str()'과'length()'문자열을 전달하는 base64 디코드 알고리즘을 사용할 수 있어야합니다. 궁극적으로는 결국 모든 문자열 - 바이트 또는 바이트 - 문자열입니다. – WhozCraig

답변

3

그래 카스 :

여기 있습니다. 즐겨!

#include <iostream> 
#include <string> 

struct BASE64_DEC_TABLE { 
    signed char n[256]; 

    BASE64_DEC_TABLE() { 
     for(int i=0; i<256; ++i) n[i] = -1; 
     for(unsigned char i='0'; i<='9'; ++i) n[i] = 52+i-'0'; 
     for(unsigned char i='A'; i<='Z'; ++i) n[i] = i-'A'; 
     for(unsigned char i='a'; i<='z'; ++i) n[i] = 26+i-'a'; 
     n['+'] = 62; 
     n['/'] = 63; 
    } 
    int operator [] (unsigned char i) const { return n[i]; } 
}; 

size_t Base64Decode(const std::string& source, void* pdest, size_t dest_size) { 
    static const BASE64_DEC_TABLE b64table; 
    if(!dest_size) return 0; 
    const size_t len = source.length(); 
    int bc=0, a=0; 
    char* const pstart = static_cast<char*>(pdest); 
    char* pd = pstart; 
    char* const pend = pd + dest_size; 
    for(size_t i=0; i<len; ++i) { 
     const int n = b64table[source[i]]; 
     if(n == -1) continue; 
     a |= (n & 63) << (18 - bc); 
     if((bc += 6) > 18) { 
      *pd = a >> 16; if(++pd >= pend) return pd - pstart; 
      *pd = a >> 8; if(++pd >= pend) return pd - pstart; 
      *pd = a;  if(++pd >= pend) return pd - pstart; 
      bc = a = 0; 
    } } 
    if(bc >= 8) { 
     *pd = a >> 16; if(++pd >= pend) return pd - pstart; 
     if(bc >= 16) *(pd++) = a >> 8; 
    } 
    return pd - pstart; 
} 

int main() { 
    std::string base64_string = "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8="; 
    unsigned char decoded_data[32] = {0}; 

    Base64Decode(base64_string, decoded_data, sizeof(decoded_data)); 

    for(auto b : decoded_data) { 
     std::cout << static_cast<unsigned>(b) << ' '; 
    } 
    std::cout << std::endl; 
    return 0; 
} 
0

Base64 디코딩을위한보다 효율적인 솔루션은 Boost C++ 라이브러리를 사용하는 것입니다. Boost C++ 라이브러리를 사용하는 Base64 디코딩 기능은 다음에서 찾을 수 있습니다. attempt to decode a value not in base64 char set