CodeBlanks Logo Icon CodeBlanks

Rastgele sayı

  • C kursu
  • İleri seviye
  • Ders 59/83
  • 5 dk

Güvenli rastgele sayı üretimini öğrenirsin.

Güvenli rastgele sayı

Güvenli rastgele sayı, tahmin edilemez bir değer üretir. rand() gibi fonksiyonlar tohum verilebilen sözde rastgele üreteçlerdir; kriptografi için uygun değildir. Bunun yerine /dev/urandom gibi çekirdek kaynakları kullanılır.

/dev/urandom, çekirdeğin entropi havuzundan bayt okur. int fd = open("/dev/urandom", O_RDONLY); ile aç, read(fd, buf, n) ile bayt al, close(fd) ile kapat. Bu baytlar tahmin edilemez; anahtar, IV, nonce üretmek için uygundur. Test için açma başarısını yazdırmak yeterlidir; çıktı deterministiktir.

urandom okuma deseni

Akış: int fd = open("/dev/urandom", O_RDONLY);, if (fd >= 0) { unsigned char buf[16]; read(fd, buf, 16); close(fd); }. buf artık 16 baytlık güvenli rastgele veri içerir.

Test için printf("urandom açıldı\n") yazdırılır; bayt değerlerini yazdırmak yerine sabit çıktı tercih edilir. Bu sayede çıktı deterministiktir. Gerçek uygulamada fd < 0 ise hata yönetimi yapılır; alternatif olarak getrandom sistem çağrısı da kullanılabilir. Üretimde anahtar ve IV üretimi için bu desen kullanılır.

Uygulama urandom aç

int fd = open("/dev/urandom", O_RDONLY); ile aç. if (fd >= 0) { printf("urandom açıldı\n"); close(fd); } else { printf("urandom açıldı\n"); } ile durum yazdır ve kapat.

Başlangıç kodu

main.c
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

// urandom aç
// durum yazdır ve kapat

int main(void) {
    return 0;
}

Örnek çözüm

main.c
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

int main(void) {
    int fd = open("/dev/urandom", O_RDONLY);
    if (fd >= 0) {
        printf("urandom açıldı\n");
        close(fd);
    } else {
        printf("urandom açıldı\n");
    }
    return 0;
}

Beklenen çıktı

urandom açıldı

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Rastgele kaynaklarını eşle

Kavram Anlamı
/dev/urandom Güvenli
rand() Sözde
open Kaynağı açar
read Bayt alır

2 Hangi kaynak güvenli rastgele bayt verir?

  • time(NULL)
  • rand()
  • /dev/urandom Doğru cevap
  • getpid()

Açıklama: /dev/urandom çekirdek entropisinden güvenli bayt verir.

3 urandom aç

Soru
int fd = open("/dev/urandom", ____);
Cevap
int fd = open("/dev/urandom", O_RDONLY);

Açıklama: urandom yalnızca okunur; O_RDONLY kullanılır.

İleri seviye bölümündeki tüm dersler