我正在尝试保护 2048 位 RSA 私钥(机密性和可用性)。我一直在寻找有关如何执行此操作的更多信息,并且正在考虑使用秘密共享方案(Shamir 的秘密共享会很好)。
这是最好的选择吗?有谁知道一个 GNU/GPL 软件实现来完成这个?
我查看“ssss”(http://point-at-infinity.org/ssss/),但秘密最多需要 128 个 ASCII 字符,而且对于 2048 位 RSA 私钥来说太短了。
谢谢你的帮助。
我正在尝试保护 2048 位 RSA 私钥(机密性和可用性)。我一直在寻找有关如何执行此操作的更多信息,并且正在考虑使用秘密共享方案(Shamir 的秘密共享会很好)。
这是最好的选择吗?有谁知道一个 GNU/GPL 软件实现来完成这个?
我查看“ssss”(http://point-at-infinity.org/ssss/),但秘密最多需要 128 个 ASCII 字符,而且对于 2048 位 RSA 私钥来说太短了。
谢谢你的帮助。
就像使用公钥密码术一样,当数据超过一定大小时,您偶尔需要使用混合方案 - 您可以使用普通对称算法和随机密钥加密私钥,然后使用密钥拆分对称密钥 -选择的分裂算法。
我相信这里的实现:https ://github.com/moserware/SecretSplitter使用这种方法来拆分超过底层拆分算法大小限制的数据。
这是最好的选择吗?有谁知道一个 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();
}