TRNG TRNG是真随机数发生器,随机源是8 路独立的环形振荡器,由模拟器件电源噪声产生频率抖动,用低频始终重采样,然后进行弹性抽取和熵提取处理,最终输出128bit真随机数。 源码结构 drv_trng.c drv_trng.h hal_trng.c 模块接口说明 头文件 #include <sunxi_hal_trng.h> 返回值枚举 typedef enum { HAL_TRNG_STATUS_OK = 0, /* success */ HAL_TRNG_STATUS_ERROR = -1, /* general error */ timeout */ HAL_TRNG_STATUS_INVALID = -4 /* invalid argument */ } HAL_TRNG_Status; 获取随机数 函数原型 HAL_TRNG_Status , hal_trng, trng hal APIs tests)
cat=24 R128 内置了TRNG,一个真随机数发生器,随机源是 8 路独立的环形振荡器,由模拟器件电源噪声产生频率抖动,用低频始终重采样,然后进行弹性抽取和熵提取处理,最终输出128bit真随机数 前往下列地址找到 TRNG Devices Drivers Options ---> soc related device drivers ---> TRNG Devices ---> -*- enable trng driver 编写程序 打开你喜欢的编辑器,修改文件:lichee/rtos/projects/r128s2/module_c906/src /main.c 引入头文件 #include <sunxi_hal_trng.h> 初始化 TRNG 读取数据模块 uint32_t random[4] = {0}; HAL_TRNG_Extract 1], random[2], random[3]); HAL_TRNG_Extract(1, random); // 读取 XOR 模式 printf("trng XOR result: 0x%08x
rcu_osci_on(RCU_IRC48M); while(ERROR == rcu_osci_stab_wait(RCU_IRC48M)); rcu_periph_clock_enable(RCU_TRNG ); trng_deinit(); trng_enable(); while (trng_flag_get(TRNG_FLAG_DRDY) == RESET); get_rand_data endif } GDF450 的初始化代码: void rnd_init(void) { #ifdef SUPPORT_HARD_RNG rcu_periph_clock_enable(RCU_TRNG ); trng_deinit(); trng_enable(); while (trng_flag_get(TRNG_FLAG_DRDY) == RESET); get_rand_data (); #endif } 测试结果 1 秒打印一次,调用trng_get_true_random_data。
使能的方法(具体查看手册): TRNG使能位 0: 禁止TRNG模块(降低功耗) 1: 使能TRNG模块 读取寄存器的方法(具体查看手册): DRDY 随机数准备状态位 读TRNG_DATA寄存器会清零该位 0: TRNG数据寄存器的内容无效 1: TRNG数据寄存器的内容有效 那么,封装的代码就有了(GD32): void rnd_init(void) { rcu_periph_clock_enable (RCU_TRNG); trng_deinit(); trng_enable(); while (trng_flag_get(TRNG_FLAG_DRDY) == RESET) ); trng_deinit(); trng_enable(); while (trng_flag_get(TRNG_FLAG_DRDY) == RESET); (); trng_enable(); while (trng_flag_get(TRNG_FLAG_DRDY) == RESET); get_rand_data();
PS:=============distinguish.bayes.R==================== #多个总体判别的贝叶斯判别程序 #输入 TrnX 表示训练样本 样本输入格式为数据框 #TrnG 当其值为TRUE是表示认为两个总体的协方差相同 否则不同 #输出 函数的输出是数字构成的一维矩阵 1表示待测样本属于X1类 distinguish.bayes <- function (TrnX, TrnG , p = rep(1, length(levels(TrnG))), TstX = NULL, var.equal = FALSE){ if ( is.factor(TrnG) == FALSE ){ mx <- nrow(TrnX); mg <- nrow(TrnG) TrnX <- rbind(TrnX, TrnG) TrnG <- factor(rep(1:2, c(mx, mg )) mu <- matrix(0, nrow=g, ncol=ncol(TrnX)) for (i in 1:g) mu[i,] <- colMeans(TrnX[TrnG==i,])
PS:=============distinguish.bayes.R==================== #多个总体判别的贝叶斯判别程序 #输入 TrnX 表示训练样本 样本输入格式为数据框 #TrnG 当其值为TRUE是表示认为两个总体的协方差相同 否则不同 #输出 函数的输出是数字构成的一维矩阵 1表示待测样本属于X1类 distinguish.bayes <- function (TrnX, TrnG , p = rep(1, length(levels(TrnG))), TstX = NULL, var.equal = FALSE){ if ( is.factor(TrnG) == FALSE ){ mx <- nrow(TrnX); mg <- nrow(TrnG) TrnX <- rbind(TrnX, TrnG) TrnG <- factor(rep(1:2, c(mx, mg )) mu <- matrix(0, nrow=g, ncol=ncol(TrnX)) for (i in 1:g) mu[i,] <- colMeans(TrnX[TrnG==i,])
至于像基于难以预测的物理现象生成随机数,比如电子噪声、放射性衰变等,这些被认为是 “真随机数生成器” —— TRNG,可是:目前只是说人类还没有完全认知这些物理现象,像在大海边捡贝壳的小朋友,这写现象背后是否真的也由某种算法 就像现在的 AIGC 也充满着随机性,比如 GPT 中的随机因素,它既有 PRNG,也有 TRNG: GPT 在生成文本时,会考虑每个可能的下一个词的概率。这个概率是基于模型训练时学到的语言模式。 GPT 既不是像 TRNG 那样的真随机,也不完全是像 PRNG 那样的伪随机。
处理器特点 Ø 多核异构芯片架构,内置高性能的Cortex-A55 CPU内核及双核锁步的高实时高可靠Cortex R5内核; Ø 支持安全启动且配套安全OS,内置HSM支持TRNG、AES、RSA、SHA
显示表格十分方便容易 基本显示