デジタル署名にed25519-donnaを使用しています。
鍵はunsigned char[32]
、署名はunsigned char[64]
です。
この base64 エンコーディングを見つけましたが、デコードするとstring
.
多くの手法を見つけて試しましたが、変換方法がまだわかりません。
デコードされた base64string
を に変換するにはどうすればよいunsigned char[32]
ですか?
デジタル署名にed25519-donnaを使用しています。
鍵はunsigned char[32]
、署名はunsigned char[64]
です。
この base64 エンコーディングを見つけましたが、デコードするとstring
.
多くの手法を見つけて試しましたが、変換方法がまだわかりません。
デコードされた base64string
を に変換するにはどうすればよいunsigned char[32]
ですか?
グラックス:
ここにあります。楽しみ!
#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;
}
Base64 デコードのより効率的なソリューションは、Boost C++ ライブラリを使用することです。Boost C++ ライブラリを使用した Base64 デコード関数は、次の場所にあります: base64 文字セットにない値をデコードしようとしています