2014-02-18 3 views
0

Я использую ed25519-donna для цифровой подписи.Преобразование base64 декодированной строки в unsigned char [32]

Ключи unsigned char[32], а подписи - unsigned char[64].

Я нашел this base64 encoding, но он только расшифровывается в string.

Я нашел и попробовал много методов, но до сих пор не знаю, как конвертировать.

Как может base64 декодировать string быть преобразованным в unsigned char[32]?

+0

его не нужно преобразовывать. его база уже есть 'unsigned char *', а по дизайну используется как 'unsigned char const *'. У вас нет проблемы, просто передавая 'var' как параметр' unsigned char const * ', где' var' объявляется как 'unsigned char var [32];' и правильно загружается вашим двоичным ключом/сигнатурой. – WhozCraig

+0

Ах. Это значительно больше смысла. Существует множество вариантов кодирования/декодирования base64. Обычно у вашего Crypto API есть один (конечно, Microsoft CryptoAPI и OpenSSL). Если вы ищете разумную реализацию [это может сработать для вас] (http://base64.sourceforge.net/b64.c). Нелегко просто передать данные из векторного или плоского массива, а не файла, и его довольно солидно. – WhozCraig

+0

Если они являются 'std :: string', вы должны просто использовать любой алгоритм декодирования base64, передавая строки' c_str() 'и' length() 'соответственно. В конечном итоге все строки в байтах или байты в строку в конце. – WhozCraig

ответ

3

Gracchus:

Вот оно. Наслаждайтесь!

#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++. Функция декодирования Base64 с использованием библиотеки Boost C++ находится по адресу: attempt to decode a value not in base64 char set

Смежные вопросы