2014-01-08 3 views
2

Я пытаюсь защитить закрытый ключ 2048 бит RSA (конфиденциальность &). Я искал для получения дополнительной информации о том, как это сделать, и я думаю об использовании секретной схемы обмена (Shamir's Secret Sharing будет хорошо).Реализация для защиты 2048-битного секретного ключа RSA с использованием схемы секретного обмена

Это лучший вариант? Кто-нибудь знает реализацию программного обеспечения GNU/GPL для этого?

Я смотрю «ssss» (http://point-at-infinity.org/ssss/), но секрет должен быть не более 128 символов ASCII, и он слишком короткий для 2048-битного секретного ключа RSA.

Благодарим за помощь.

+1

Резервное копирование на пару шагов. Что вы на самом деле пытаетесь сделать? Весь смысл криптографии с открытым ключом, такой как RSA, заключается в том, чтобы не использовать общие ключи. Вероятно, есть более разумный способ достичь вашей основной цели здесь, что бы это ни было. –

+0

Я пытаюсь избежать хранения закрытого ключа корневого ЦС. Этот ключ очень редко используется, но большую часть времени мне нужен очень эффективный способ его защитить. – cashel

+0

Не вопрос программирования, так что вне темы здесь. –

ответ

3

Как и при использовании криптографии с открытым ключом, вам иногда приходится использовать гибридную схему, когда данные превышают определенный размер - вы можете зашифровать закрытый ключ с помощью обычного симметричного алгоритма со случайным ключом, а затем разделить симметричный ключ используя алгоритм секретного расщепления.

Я считаю, что реализация здесь: https://github.com/moserware/SecretSplitter использует этот метод для разделения данных, которые превышают ограничение по размеру базового алгоритма разделения.

+0

Посмотрите в разделе «Примечания» в документации sss. Тот же ответ, просто разные слова + пример: http://point-at-infinity.org/ssss/ssss.1.html –

0

Это лучший вариант? Кто-нибудь знает реализацию программного обеспечения GNU/GPL для этого?

Crypto ++ предлагает функциональность. Но лицензия является Public Domain (отдельные исходные файлы) или Boost Software 1.0 (библиотека в целом). Это не GNU/GPL.

Вот код, чтобы сделать это от Crypto ++. Он был взят из test.cpp:

Расщепление

void SecretShareFile(int threshold, int nShares, const char *filename, const char *seed) 
{ 
    RandomPool rng; 
    rng.IncorporateEntropy((byte *)seed, strlen(seed)); 

    ChannelSwitch *channelSwitch; 
    FileSource source(filename, false, new SecretSharing(rng, 
     threshold, nShares, channelSwitch = new ChannelSwitch)); 

    vector_member_ptrs<FileSink> fileSinks(nShares); 
    string channel; 
    for (int i=0; i<nShares; i++) 
    { 
     char extension[5] = ".000"; 
     extension[1]='0'+byte(i/100); 
     extension[2]='0'+byte((i/10)%10); 
     extension[3]='0'+byte(i%10); 
     fileSinks[i].reset(new FileSink((string(filename)+extension).c_str())); 

     channel = WordToString<word32>(i); 
     fileSinks[i]->Put((byte *)channel.data(), 4); 
     channelSwitch->AddRoute(channel, *fileSinks[i], DEFAULT_CHANNEL); 
    } 

    source.PumpAll(); 
} 

Объединение

void SecretRecoverFile(int threshold, const char *outFilename, char *const *inFilenames) 
{ 
    SecretRecovery recovery(threshold, new FileSink(outFilename)); 

    vector_member_ptrs<FileSource> fileSources(threshold); 
    SecByteBlock channel(4); 
    int i; 
    for (i=0; i<threshold; i++) 
    { 
     fileSources[i].reset(new FileSource(inFilenames[i], false)); 
     fileSources[i]->Pump(4); 
     fileSources[i]->Get(channel, 4); 
     fileSources[i]->Attach(new ChannelSwitch(recovery, string((char *)channel.begin(), 4))); 
    } 

    while (fileSources[0]->Pump(256)) 
     for (i=1; i<threshold; i++) 
      fileSources[i]->Pump(256); 

    for (i=0; i<threshold; i++) 
     fileSources[i]->PumpAll(); 
} 
Смежные вопросы