Penghasil Angka Acak Sejati yang Kecil dan Independen Platform untuk FPGA apa pun (dan bahkan ASIC).
NeoTRNG bertujuan untuk menjadi generator nomor acak BENAR (TRNG) kecil dan agnostik platform yang dapat disintesis untuk teknologi target apa pun (FPGA dan bahkan ASIC). Hal ini didasarkan pada osilator cincin yang berjalan bebas dan sederhana, yang ditingkatkan dengan teknik khusus untuk memungkinkan sintesis pada platform apa pun. Kebisingan fase yang terjadi saat pengambilan sampel osilator cincin yang berjalan bebas digunakan sebagai sumber entropi fisik.
Proyek ini merupakan "spin-off" dari Prosesor NEORV32 RISC-V dimana neoTRNG diimplementasikan sebagai modul SoC default.
Fitur Utama
Peringatan
Ada kemungkinan bahwa setidaknya ada beberapa korelasi silang antara sinyal/peristiwa internal/eksternal dan angka acak yang dihasilkan. Oleh karena itu, tidak ada jaminan sama sekali neoTRNG memberikan nomor acak yang sempurna atau bahkan aman secara kriptografis ! Lihat hasil evaluasi yang diberikan atau (lebih baik lagi) uji sendiri. Selain itu, belum ada mekanisme deteksi gangguan atau pemantauan kesehatan online untuk memeriksa integritas/kualitas data acak yang dihasilkan.
Peringatan
Membiarkan neoTRNG diaktifkan secara permanen akan meningkatkan konsumsi daya dinamis dan mungkin juga menyebabkan pemanasan lokal pada chip (saat menggunakan konfigurasi yang sangat besar). Selain itu, interferensi elektromagnetik tambahan (EMI) mungkin dipancarkan oleh desain.
Keseluruhan desain diimplementasikan sebagai satu file VHDL rtl/neoTRNG.vhd
yang tidak memiliki ketergantungan sama sekali (seperti perpustakaan khusus, paket, atau submodul).
entity neoTRNG is
generic (
NUM_CELLS : natural range 1 to 99 := 3 ; -- number of ring-oscillator cells
NUM_INV_START : natural range 3 to 99 := 5 ; -- number of inverters in first cell, has to be odd
SIM_MODE : boolean := false -- enable simulation mode (no physical random if enabled!)
);
port (
clk_i : in std_ulogic ; -- module clock
rstn_i : in std_ulogic ; -- module reset, low-active, async, optional
enable_i : in std_ulogic ; -- module enable (high-active)
valid_o : out std_ulogic ; -- data_o is valid when set (high for one cycle)
data_o : out std_ulogic_vector ( 7 downto 0 ) -- random data byte output
);
end neoTRNG ;
NeoTRNG menggunakan domain jam tunggal yang digerakkan oleh sinyal clk_i
. Sinyal reset modul rstn_i
bersifat opsional (ikat ke '1'
jika tidak digunakan). Data acak diperoleh dengan menggunakan antarmuka data/valid yang sederhana: setiap kali byte acak valid baru tersedia, keluaran valid_o
akan tinggi tepat untuk satu siklus sehingga keluaran data_o
dapat diambil sampelnya oleh logika pengguna.
Sinyal enable_i
digunakan untuk menginisialisasi dan memulai TRNG. Sebelum TRNG dapat digunakan, sinyal ini harus dijaga tetap rendah setidaknya selama beberapa 100 siklus clock (tergantung pada konfigurasi) untuk memastikan bahwa semua bit register geser internal dibersihkan kembali. Ketika enable_i
disetel dan valid_o
disetel untuk pertama kalinya, TRNG beroperasi. Menonaktifkan TRNG juga mengharuskan enable_i
rendah untuk jumlah siklus jam yang sama. Ketika enable_i
menjadi rendah, semua osilator cincin akan dihentikan sehingga mengurangi aktivitas peralihan dinamis dan konsumsi daya.
Tiga obat generik disediakan untuk mengkonfigurasi neoTRNG. NUM_CELLS
mendefinisikan jumlah total sel entropi. NUM_INV_START
mendefinisikan jumlah inverter (= panjang cincin-osilator) di sel pertama. Kedua obat generik ini dijelaskan lebih lanjut di bagian Arsitektur di bawah. SIM_MODE
generik terakhir dapat diatur untuk memungkinkan simulasi TRNG dalam simulasi RTL biasa.
NeoTRNG didasarkan pada jumlah sel entropi yang dapat dikonfigurasi ( NUM_CELLS
). Setiap sel menyediakan cincin-osilator ("RO") sederhana yang dibangun menggunakan jumlah inverter ganjil. Frekuensi osilasi RO ditentukan oleh penundaan propagasi elemen-elemen di dalam cincin. Frekuensi ini tidak statis karena tunduk pada fluktuasi minimal yang disebabkan oleh derau termal derau tembakan elektronik. Keadaan inverter terakhir RO diambil sampelnya menjadi flip flop dengan menggunakan jam statis ( clk_i
). Karena frekuensi RO bervariasi secara kacau dari waktu ke waktu, gangguan fase yang melekat pada data sampel digunakan sebagai sumber entropi sebenarnya.
Setiap sel entropi menghasilkan aliran data acak 1-bit. Output dari semua sel dicampur menggunakan gerbang XOR lebar sebelum aliran tersebut dihilangkan biasnya oleh ekstraktor keacakan sederhana. Beberapa bit yang tidak bias diambil sampelnya / de-serialisasi oleh unit pengambilan sampel untuk memberikan nomor acak selebar byte. Unit pengambilan sampel juga menerapkan pasca-pemrosesan sederhana untuk meningkatkan distribusi spektral bilangan acak.
Setiap sel entropi terdiri dari osilator cincin yang dibuat dari kait pembalik dalam jumlah ganjil. Panjang cincin di sel entropi pertama ditentukan oleh NUM_INV_START
generik. Setiap sel entropi tambahan menambahkan 2 inverter lagi ke panjang rantai awal ini. Oleh karena itu, setiap sel entropi tambahan berosilasi pada frekuensi yang lebih rendah dari frekuensi sebelumnya.
Elemen asinkron seperti osilator cincin sulit diimplementasikan dengan cara yang tidak bergantung pada platform karena biasanya memerlukan penggunaan primitif, atribut, atau pengaturan sintesis khusus platform/teknologi. Untuk menyediakan arsitektur target-agnostik nyata, yang dapat disintesis untuk teknologi target apa pun, teknik khusus diterapkan: setiap inverter di dalam RO diikuti oleh kait yang menyediakan pengaturan ulang global dan juga kait individual yang memungkinkan untuk beralih kait ke mode transparan.
Pengaktifan kait individual dikontrol oleh register geser panjang yang menampilkan FF berbeda untuk setiap kait dalam rantai RO. Ketika TRNG diaktifkan, register geser ini mulai terisi dengan satuan. Dengan demikian, kait diaktifkan secara individual satu per satu sehingga tidak mungkin bagi alat sintesis untuk memangkas logika/elemen apa pun dari rantai RO karena status permulaan setiap kait (secara teoritis) dapat dipantau oleh logika eksternal. Register geser pengaktifan semua sel entropi dirangkai secara daisy untuk melanjutkan prosedur permulaan ini di seluruh susunan entropi.
Gambar berikut menunjukkan skema sederhana dari sel entropi pertama yang terdiri dari 5 elemen kait inverter untuk osilator cincin, 5 sandal jepit untuk register geser pengaktifan, dan 2 sandal jepit lainnya untuk sinkronisasi.
Gambar yang menunjukkan FPGA hasil pemetaan (dihasilkan oleh Intel Quartus Prime) dari sel entropi pertama dapat dilihat di sini. Hal ini menunjukkan bahwa semua elemen latch+inverter dari rantai cincin-osilator berhasil dipetakan ke masing-masing LUT4.
Segera setelah bit terakhir dari register geser pengaktifan rantai daisy sel entropi disetel, unit de-biasing akan dimulai. Unit ini mengimplementasikan "John von Neumann Randomness Extractor" sederhana untuk menghilangkan bias aliran data acak yang diperoleh. Ekstraktor mengimplementasikan register geser 2-bit yang mengambil sampel bit acak yang di-XOR dari larik sel entropi. Dalam setiap siklus kedua, ekstraktor mengevaluasi dua bit sampel untuk memeriksa sepasang bit yang tidak tumpang tindih untuk mengetahui edge .
Setiap kali suatu tepi terdeteksi, sinyal "valid" dikirim ke unit pengambilan sampel berikut. Tepi naik ( 01
) memancarkan 1
bit data dan tepi jatuh ( 10
) memancarkan 0
bit data. Oleh karena itu, unit de-biasing memerlukan setidaknya dua siklus clock untuk menghasilkan satu bit acak. Jika tidak ada tepi yang terdeteksi ( 00
atau 11
) sinyal valid tetap rendah dan unit pengambilan sampel berhenti.
Unit pengambilan sampel mengimplementasikan register geser 8-bit untuk mengubah bitstream serial yang tidak bias menjadi bilangan acak selebar byte. Selain itu, unit sampel menyediakan pasca pemrosesan sederhana untuk meningkatkan distribusi spektral sampel acak yang diperoleh.
Untuk menghasilkan satu byte data acak, unit pengambilan sampel menyetel ulang register geser internalnya ke nol dan mulai menggunakan 64 bit aliran acak yang tidak bias. Register geser diimplementasikan sebagai register geser umpan balik linier (LFSR) yang meng-XOR aliran input dengan bit terakhir register untuk mengacak lebih lanjut dan mencampur aliran bit acak.
NeoTRNG dievaluasi sebagai bagian dari prosesor NEORV32, dimana neoTRNG tersedia sebagai modul SoC standar. Prosesor ini disintesis untuk Intel Cyclone IV EP4CE22F17C6N
FPGA yang berjalan pada 100MHz. Untuk evaluasi, konfigurasi default yang sangat kecil telah digunakan: tiga sel entropi diimplementasikan di mana sel pertama mengimplementasikan 5 inverter, sel kedua mengimplementasikan 9 inverter, dan sel ketiga mengimplementasikan 11 inverter. Konfigurasi yang lebih kompleks dengan sel entropi yang lebih banyak/lebih besar mungkin memberikan kualitas acak yang "lebih baik".
NUM_CELLS = 3
NUM_INV_START = 5
SIM_MODE = false
Catatan
Sebanyak 4MB data acak telah diperoleh untuk evaluasi. Kumpulan data ini tersedia sebagai file biner entropy.bin
di aset rilis.
Untuk analisis histogram sederhana, 4MB byte acak diambil sampelnya dari neoTRNG. Byte yang diperoleh diakumulasikan menurut kemunculannya dan diurutkan ke dalam bin di mana setiap bin mewakili satu pola byte tertentu (1 byte = 8 bit = 256 pola berbeda). Hasilnya kemudian dianalisis sehubungan dengan sifat statistiknya:
[NOTE] integer numbers only
Number of samples: 4194304
Arithmetic mean: 127 (optimum would be 127)
Histogram occurrence
Average: 16384 (optimum would be 4194304/256 = 16384)
Min: 16051 = average - 333 (deviation) at bin 183 (optimum deviation would be 0)
Max: 16706 = average + 322 (deviation) at bin 144 (optimum deviation would be 0)
Average dev.: +/- 96 (optimum would be 0)
$ ent entropy.bin
Entropy = 7.994306 bits per byte.
Optimum compression would reduce the size
of this 4194304 byte file by 0 percent.
Chi square distribution for 4194304 samples is 16726.32, and randomly
would exceed this value less than 0.01 percent of the times.
Arithmetic mean value of data bytes is 127.9417 (127.5 = random).
Monte Carlo value for Pi is 3.132416851 (error 0.29 percent).
Serial correlation coefficient is 0.000496 (totally uncorrelated = 0.0).
$ rngtest < entropy.bin
rngtest 5
Copyright (c) 2004 by Henrique de Moraes Holschuh
This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
rngtest: starting FIPS tests...
rngtest: entropy source drained
rngtest: bits received from input: 33554432
rngtest: FIPS 140-2 successes: 1676
rngtest: FIPS 140-2 failures: 1
rngtest: FIPS 140-2(2001-10-10) Monobit: 0
rngtest: FIPS 140-2(2001-10-10) Poker: 0
rngtest: FIPS 140-2(2001-10-10) Runs: 1
rngtest: FIPS 140-2(2001-10-10) Long run: 0
rngtest: FIPS 140-2(2001-10-10) Continuous run: 0
rngtest: input channel speed: (min=138.214; avg=1557.190; max=2119.276)Mibits/s
rngtest: FIPS tests speed: (min=32.660; avg=106.337; max=111.541)Mibits/s
rngtest: Program run time: 330110 microseconds
Testsuite bilangan acak yang lebih keras (wikipedia, beranda) oleh Robert G. Brown adalah perangkat yang bagus untuk menguji stres dan mengkarakterisasi generator bilangan acak.
Penting
? pekerjaan sedang berlangsung?
dieharder membutuhkan sejumlah besar sampel acak (sekitar 4GB). Jika tidak, data acak akan diputar ulang dengan jelas mengurangi entropi keseluruhan. Saat ini saya menggunakan koneksi UART sederhana untuk mentransfer data dari FPGA ke PC. Tetapi bahkan tingkat Baud yang lebih tinggi, kumpulan data sebesar 4GB akan membutuhkan waktu lama untuk dikirim. Sampai saya memiliki saluran transfer yang lebih baik (atau hanya banyak waktu) evaluasi ini "sedang dalam proses" .
Hasil pemetaan untuk neoTRNG yang diimplementasikan dalam Prosesor NEORV32 RISC-V menggunakan konfigurasi default. Hasil yang dihasilkan untuk FPGA Intel Cyclone EP4CE22F17C6N
yang berjalan pada 100MHz menggunakan Intel Quartus Prime.
Module Hierarchy Logic Cells Logic Registers
------------------------------------------------------------------------------------
neoTRNG:neoTRNG_inst 56 (27) 46 (19)
neoTRNG_cell:entropy_source:0:neoTRNG_cell_inst 8 (8) 7 (7)
neoTRNG_cell:entropy_source:1:neoTRNG_cell_inst 10 (10) 9 (9)
neoTRNG_cell:entropy_source:2:neoTRNG_cell_inst 14 (14) 11 (11)
Catatan
Alat sintesis mungkin mengeluarkan peringatan bahwa kait dan loop kombinatorial telah terdeteksi. Namun, ini bukanlah cacat desain karena memang inilah yang kami inginkan.
Tingkat pembangkitan maksimum neoTRNG ditentukan oleh dua faktor:
Oleh karena itu, neoTRNG memerlukan setidaknya A * B = 2 * 64 = 128
siklus clock untuk memancarkan satu byte acak. Evaluasi FPGA menunjukkan bahwa waktu pengambilan sampel sebenarnya adalah sekitar 300 siklus jam. Dengan demikian, implementasi yang berjalan pada 100 MHz dapat menghasilkan sekitar 330kB data acak per detik. Tingkat pembangkitan yang lebih tinggi dapat dicapai dengan menjalankan beberapa instance neoTRNG secara paralel.
Karena osilator cincin asinkron tidak dapat disimulasikan rtl (karena loop kombinatorial), neoTRNG menyediakan mode simulasi khusus yang diaktifkan oleh SIM_MODE
generik. Jika diaktifkan, "penundaan propagasi" yang diimplementasikan sebagai flip flop sederhana ditambahkan ke inverter osilator cincin.
Penting
Mode simulasi ditujukan untuk simulasi/debugging saja! Desain dengan SIM_MODE
diaktifkan dapat disintesis tetapi tidak akan memberikan nomor acak yang sebenarnya/fisik sama sekali!
Folder sim
menyediakan testbench sederhana untuk neoTRNG menggunakan konfigurasi default. Testbench akan menampilkan byte data acak yang diperoleh sebagai nilai desimal ke konsol simulator. Testbench dapat disimulasikan dengan GHDL dengan menggunakan skrip yang disediakan:
neoTRNG/sim$ sh ghdl.sh
../rtl/neoTRNG.vhd:105:3:@0ms:(assertion note): [neoTRNG] The neoTRNG (v3.2) - A Tiny and Platform-Independent True Random Number Generator, https://github.com/stnolting/neoTRNG
../rtl/neoTRNG.vhd:112:3:@0ms:(assertion warning): [neoTRNG] Simulation-mode enabled (NO TRUE/PHYSICAL RANDOM)!
18
210
147
5
79
94
70
100
185
246
203
220
ghdl:info: simulation stopped by --stop-time @100us
Data bentuk gelombang GHDL disimpan ke sim/neoTRNG_tb.ghw
dan dapat dilihat menggunakan gtkwave
:
neoTRNG/sim$ gtkwave neoTRNG_tb.ghw
Proses simulasi sederhana dijalankan oleh alur kerja tindakan GitHub neoTRNG-sim
proyek.