SecretKeySharing, bir sırrı XOR ile N parçaya bölen ve geri toplamak için tüm parçaları gerektiren, bağımlılıksız bir C++20 kütüphanesidir.
Bu proje bir threshold sistemi değildir. Yani bu, Shamir Secret Sharing değildir. Üretilen N parçanın tamamı olmadan sır geri elde edilemez.
Eski sürümde üretim kullanımı için kabul edilemeyecek sorunlar vardı:
rand()vesrand(time(NULL))ile tahmin edilebilir parça üretimi yapılıyordu.std::stringfonksiyonlarındanNULLdöndürülüyordu; bu tanımsız davranışa yol açabilirdi.- Boş girdi, kısa parça listesi ve eşit olmayan parça boyları güvenli şekilde doğrulanmıyordu.
- Repoda derlenmiş Windows nesne dosyaları ve eski NetBeans yapı dosyaları tutuluyordu.
- Testler gerçek doğrulama yapmıyordu.
Yeni sürüm bu sorunları kaldırır ve proje taşınabilir bir CMake kütüphanesi olarak kullanılır.
- Bölme işlemi
N-of-NXOR tabanlıdır. - İlk
N-1parça işletim sisteminin kriptografik rastgelelik kaynağından üretilir. - Son parça, diğer parçaların XOR toplamı ile asıl sırdan hesaplanır.
- Her parça sırla aynı uzunluktadır.
- Herhangi bir parçanın tek başına sırrı açığa çıkarmaması hedeflenir.
Desteklenen güvenli rastgelelik kaynakları:
- Linux:
getrandom(2) - Windows:
BCryptGenRandom - Apple/BSD:
arc4random_buf
Sınırlamalar:
- Bu kütüphane parçalar için kimlik doğrulama sağlamaz. Bir parça değiştirilirse elde edilen sonuç sessizce yanlış olur. İhtiyacınız varsa payları ayrıca MAC veya dijital imza ile koruyun.
- Sır uygulama belleğinde yine bulunur. Bu kütüphane kalıcı bellek temizliği garantilemez, ancak geçici tamponlar için
secure_clear()sağlar. - Parçaları aynı makinede, aynı dosyada veya aynı erişim alanında tutarsanız güvenlik değeri büyük ölçüde kaybolur.
include/secret_key_sharing/secret_key_sharing.h: Genel APIsrc/secret_key_sharing.cpp: Uygulamaexamples/: Kullanım örnekleritests/: Otomatik testler
- CMake 3.20+
- C++20 destekli derleyici
- GCC 11+ (doğrulanmış)
- MSVC 2022+ (hedeflenen destek)
- Clang 14+ (opsiyonel, hedeflenen uyumluluk)
Harici üçüncü taraf kütüphane gerekmez.
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build buildTestleri çalıştırmak için:
ctest --test-dir build --output-on-failureÖrnek programlar varsayılan olarak derlenir. Kapatmak isterseniz:
cmake -S . -B build -DSECRET_KEY_SHARING_BUILD_EXAMPLES=OFFKurulum için:
cmake --install build --prefix /desired/install/prefixBaşka bir projeden:
find_package(SecretKeySharing REQUIRED)
target_link_libraries(your_target PRIVATE SecretKeySharing::secret_key_sharing)Metin sırrı bölmek ve toplamak:
#include "secret_key_sharing/secret_key_sharing.h"
#include <iostream>
int main() {
const auto secret = sks::string_to_bytes("database-password");
const auto shares = sks::split_secret(secret, 4);
for (const auto& share : shares) {
std::cout << sks::hex_encode(share) << '\n';
}
const auto restored = sks::combine_shares(shares);
std::cout << sks::bytes_to_string(restored) << '\n';
}İkili veri ile kullanım:
const auto secret = sks::hex_decode("00112233445566778899aabbccddeeff");
const auto shares = sks::split_secret(secret, 3);
const auto restored = sks::combine_shares(shares);sks::split_secret(secret, share_count): Sırrıshare_countparçaya böler.sks::combine_shares(shares): Tüm parçaları XOR ile birleştirir.sks::hex_encode(bytes): Parçaları loglama veya taşıma için hex'e çevirir.sks::hex_decode(hex): Hex veriyi bayt dizisine çevirir.sks::string_to_bytes(text): Metni bayta çevirir.sks::bytes_to_string(bytes): Baytı metne çevirir.sks::secure_clear(buffer): Geçici tamponu sıfırlar ve boşaltır.
Testler şu senaryoları doğrular:
- ASCII sır için round-trip
- Null byte içeren ikili sır için round-trip
- Parça bozulduğunda sonucun değişmesi
- Hatalı girişlerin istisna ile reddedilmesi
- Hex yardımcılarının doğru çalışması
secure_clear()davranışı
- Her parçayı farklı erişim alanında saklayın.
- Parçaları sürüm kontrolüne koymayın.
- Parçaları mümkünse çalışma zamanında dış bir kasadan veya gizli yönetim sisteminden alın.
- Geri birleştirilmiş sır üzerinde işiniz bittiğinde tamponu temizleyin.
- Eğer
N-of-Mistiyorsanız bu proje yerine gerçek bir threshold secret sharing çözümü kullanın.