Skip to content

About

Portable C++20 N-of-N XOR secret sharing library with secure OS randomness, CMake build, examples, and tests.

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Latest commit

 

History

7 Commits

Folders and files

Repository files navigation

SecretKeySharing

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.

Neden yeniden yazıldı?

Eski sürümde üretim kullanımı için kabul edilemeyecek sorunlar vardı:

  • rand() ve srand(time(NULL)) ile tahmin edilebilir parça üretimi yapılıyordu.
  • std::string fonksiyonlarından NULL dö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.

Güvenlik modeli

  • Bölme işlemi N-of-N XOR tabanlıdır.
  • İlk N-1 parç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.

Dizin yapısı

  • include/secret_key_sharing/secret_key_sharing.h: Genel API
  • src/secret_key_sharing.cpp: Uygulama
  • examples/: Kullanım örnekleri
  • tests/: Otomatik testler

Gereksinimler

  • 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.

Derleme

cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build

Testleri ç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=OFF

Kurulum için:

cmake --install build --prefix /desired/install/prefix

CMake ile projeye ekleme

Başka bir projeden:

find_package(SecretKeySharing REQUIRED)
target_link_libraries(your_target PRIVATE SecretKeySharing::secret_key_sharing)

Kullanım

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);

API özeti

  • sks::split_secret(secret, share_count): Sırrı share_count parç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.

Test kapsamı

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ışı

Güvenli kullanım önerileri

  • 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-M istiyorsanız bu proje yerine gerçek bir threshold secret sharing çözümü kullanın.

About

Portable C++20 N-of-N XOR secret sharing library with secure OS randomness, CMake build, examples, and tests.

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages