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
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
// urandom aç
// durum yazdır ve kapat
int main(void) {
return 0;
}Örnek çözüm
#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ç
int fd = open("/dev/urandom", ____);
int fd = open("/dev/urandom", O_RDONLY);
Açıklama: urandom yalnızca okunur; O_RDONLY kullanılır.